![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразовать картинку в массив байтов 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 для выделения только цветовых байтов.