6

hBitmapをバイトの配列に変換しようとしていますが、ユニットGraphicsのTBitmapを使用したくありません。私の入力画像は128x64x32ビットです。

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になれないのですか?

4

1 に答える 1

7

あなたは非常に幸運でした。アレイは実際には128個の完全に別個のアレイです。ディメンションを設定すると、Delphiはたまたま前の配列に非常に近い配列を割り当て、12バイトでそれらを分離し、各動的配列のさまざまな簿記データを考慮しました。あなたのビットマップが131ピクセル幅であることをAPIに伝えることによって嘘をつくと、より狭いビットマップのデータをコピーするときにそれらのバイトをスキップしました。

APIは、単一の連続したバイトブロックを想定していますが、これは多次元動的配列とは異なります。多次元動的配列は、実際には、要素タイプがたまたま別の動的配列である通常の動的配列に見られます。

コードを修正するには、1次元配列が必要です。その長さをビットマップの高さと幅の積に設定します。

于 2013-03-26T15:22:17.540 に答える