Конференция "Media" » Преобразовать картинку в массив байтов RGB
 
  • StriderMan (03.03.09 16:00) [0]
    Есть ImageList с картинками. Нужно выдернуть из него картинку по заданному индексу, преобразовать в массив байтов RGB, причем на пиксел выделяется именно по 3 байта подряд.

    Все это дело нужно передать потом в чужое API.

    Пока сделал так:


    type
     TRGB = record
       case integer of
       1: (RGB: LongInt);
       2: (B, G, R, O: BYTE);
     end;

    procedure ILIndexToPByte(const AImageList: TImageList; AIndex: integer; ADest: PByte; const AWidth, AHeight: integer);
    var
     x, y: integer;
     rgb: TRGB;
     bm: TBitMap;
    begin
     bm := TBitMap.Create;
     try
       AImageList.GetBitmap(AIndex, bm);
       for x := 0 to min(bm.Width, AWidth) - 1 do
         for y := 0 to min(bm.Height, AHeight) - 1 do
         begin
           rgb.RGB := ColorToRGB(bm.Canvas.Pixels[x, y]);
           ADest^ := rgb.R;
           inc(ADest);
           ADest^ := rgb.G;
           inc(ADest);
           ADest^ := rgb.B;
           inc(ADest);
         end;
     finally
       bm.Free
     end;
    end;



    Кто знает, как это сделать по-нормальному без переливания из пустого в порожнее? Или закэшировать сразу все картинки по массивам?
  • MBo © (03.03.09 16:08) [1]
    функция GetDiBits
    если картинка 32-битная, то можно перевести ее предварительно в 24-битный формат, либо использовать ScanLine для выделения только цветовых байтов.
  • StriderMan (03.03.09 16:21) [2]

    MBo ©   (03.03.09 16:08) [1]
    > функция GetDiBits

    Это все равно сначала в TBitMap надо слить все?
  • MBo © (03.03.09 16:37) [3]
    >Это все равно сначала в TBitMap надо слить все?
    Да.
 
Конференция "Media" » Преобразовать картинку в массив байтов RGB
Есть новые Нет новых   [133926   +456][b:0][p:0.001]