Преобразование HBitmap в массив байтов в Delphi

Я пытаюсь преобразовать hBitmap в массив байтов, но я не хочу использовать TBitmap из unit Graphics. Мое входное изображение 128x64x32bit.

var TheBits: array of array of Cardinal;
begin   
  with info.bmiHeader do begin
    biWidth:=131;
    biHeight:=64;
    biSize:=SizeOf(TBITMAPINFOHEADER);
    biCompression:=BI_RGB;
    biBitCount:=32;
    biPlanes:=1;
    biSizeImage:=0;
  end; 

  DC := CreateCompatibleDC(0);    
  SetLength(TheBits, 128, 64);    
  GetDIBits(DC, BmpHandle, 0, 64,@TheBits[0][0],Info,DIB_RGB_COLORS);

Это дает мне хорошее изображение (вверх ногами, конечно), но мне пришлось поместить 131 в biWidth, что на самом деле не имеет смысла для меня. Почему не 128?

1 ответов


вам очень повезло. Ваш массив на самом деле 128 совершенно отдельно массивы. Когда вы устанавливаете измерения, Delphi выделяет каждый массив очень близко к предыдущему, разделяя их 12 байтами, учитывая различные данные бухгалтерского учета в каждом динамическом массиве. Ложь, сказав API, что ваше растровое изображение было шириной 131 пиксель, заставила его пропустить эти байты при копировании данных для более узкого растрового изображения.

API ожидает один непрерывный блок байты, что не является многомерным динамическим массивом. Многомерный динамический массив-это просто обычный динамический массив, тип элемента которого является другим динамическим массивом.

чтобы исправить код, вам нужен одномерный массив; установите его длину в произведение высоты и ширины растрового изображения.