Растровое изображение в массив на 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

1 ответ

Решение

В комментариях вы сказали:

Я перекомпилировал код, и он лучше, он сканирует.bmp, но возвращает обратные значения пикселей 0 - белый, 255- черный.

Это потому, что растровое изображение 8bpp использует палитру для идентификации цветов. И в твоей палитре 0 идентифицирует белый и 255 идентифицирует черный. Это может быть выведено из представленных вами доказательств. Однако это также очевидно, когда вы проверяете таблицу цветов в файле.bmp.

Палитра - это таблица цветов. В таблице 256 записей. Каждый пиксель в растровом изображении является индексом в таблице.

Если вы хотите получить цвет RGB для каждого пикселя, вам нужно сначала прочитать таблицу цветов палитры, а затем использовать Scanline значения в качестве индексов в этой таблице.

Другие вопросы по тегам