Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Преобразовать картинку в массив байтов RGB


StriderMan ©   (2009-03-03 16:00:00) 

Есть 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   (2009-03-03 16:37:00) [1]

>Это все равно сначала в TBitMap надо слить все?
Да.


StriderMan   (2009-03-03 16:21:00) [2]


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

Это все равно сначала в TBitMap надо слить все?


MBo   (2009-03-03 16:08:00) [3]

функция GetDiBits
если картинка 32-битная, то можно перевести ее предварительно в 24-битный формат, либо использовать ScanLine для выделения только цветовых байтов.


Наверх

Титульная страница Поиск, карта сайта Написать письмо