Растровое изображение в массив на Delphi XE7
Я пишу процедуру, которая переписывает растровое изображение в массив на XE7. Я написал этот кусок кода:
PROCEDURE BitmapToArray(var inBitmap : TBitMap;
var outArray : TIntegerDynArray_2D);
var
x : integer;
y : integer;
P : PByteArray;
begin
SetLength(outArray,0,0);
SetLength(outArray, inBitmap.Height, inBitmap.Width);
for y := 0 to inBitmap.Height-1 do
begin
P := inBitmap.ScanLine[y];
for x := 0 to inBitmap.Width-1 do
begin
outArray[y,x]:=P[x];
end;
end;
end;
Но это не работает, массив заполнен нулями.
Битовая карта:
1 ответ
В комментариях вы сказали:
Я перекомпилировал код, и он лучше, он сканирует.bmp, но возвращает обратные значения пикселей 0 - белый, 255- черный.
Это потому, что растровое изображение 8bpp использует палитру для идентификации цветов. И в твоей палитре 0
идентифицирует белый и 255
идентифицирует черный. Это может быть выведено из представленных вами доказательств. Однако это также очевидно, когда вы проверяете таблицу цветов в файле.bmp.
Палитра - это таблица цветов. В таблице 256 записей. Каждый пиксель в растровом изображении является индексом в таблице.
Если вы хотите получить цвет RGB для каждого пикселя, вам нужно сначала прочитать таблицу цветов палитры, а затем использовать Scanline
значения в качестве индексов в этой таблице.