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 ビットマップを作成する別の方法はありますか?