0

Delphi の TBitmap 型は、基本的に GDI BITMAP と PALETTE のラッパーであり、トップダウンとボトムアップの両方の走査線順序をサポートできます。

回転および合成するために、GDI+ ビットマップに変換する必要がある TBitmap があります。

私のビットマップは、Windows がサポートする 32 ビット ARGB ですが、VCL はネイティブに「理解」していません。

TBitmap *bmp;
...

次のコンストラクターを使用すると、合成にアルファ チャネルが機能しませんが、それ以外の場合はすべて機能します。

Gdiplus::Bitmap b(bmp->Handle, NULL);

そこで、サイズ、ピクセル データ、およびフォーマット パラメータを受け取る以下のコンストラクタを試しました。

Gdiplus::Bitmap b(bmp->Width,  bmp->Height, bmp->Width *4, PixelFormat32bppARGB,   
    (BYTE*) bmp->ScanLine[bmp->Height-1]); // bottom up storage

これはアルファを取得しますが、ビットマップが上下逆なので、これを試しました

Gdiplus::Bitmap b(bmp->Width,  bmp->Height, - bmp->Width *4, PixelFormat32bppARGB,   
    (BYTE*) bmp->ScanLine[0]);  // negative stride for bottom up bitmaps?!

これで動作しますが、もちろん、ボトムアップ ビットマップにハードコーディングされています。ただし、TBitmap がトップダウンかボトムアップかを判断する方法が見つかりません。それらは負の高さで内部的に保存されますが、高さの値はユーザー コードに戻される前に処理されます。

スキャンラインの順序を確認するにはどうすればよいですか? あるいは、さらに良いことに、TBitmap から GDIPlus ビットマップを作成する別の方法はありますか?

4

1 に答える 1

3

プロパティはTBitmap::ScanLine、トップダウンとボトムアップを説明します。ボトムアップ ビットマップの場合、生のピクセル データScanLine[0]の最後の行と最初の行を返します。ScanLine[Height-1]トップダウン ビットマップの場合、生のピクセル データScanLine[0]の最初の行とScanLine[Height-1]最後の行を返します。

a がボトムアップかトップダウンかを判断するには、ネイティブに公開されていないその構造TBitmapを手動で取得する必要があります。Win32 API関数を使用して、メンバーを持つ構造体を取得できます。BITMAPINFOHEADERTBitmapGetObject()DIBSECTIONBITMAPINFOHEADER

于 2013-01-17T01:38:29.223 に答える