【发布时间】:2013-01-16 21:26:24
【问题描述】:
Delphi 的 TBitmap 类型基本上是 GDI BITMAP 和 PALETTE 的包装器,并且可以支持自上而下和自下而上的扫描线排序。
我有一个 TBitmap,我需要将其转换为 GDI+ 位图,以便对其进行旋转和合成。
我的位图是 Windows 支持的 32 位 ARGB,但 VCL 本身并不“理解”。
TBitmap *bmp;
...
当我使用下面的构造函数时,alpha 通道不能用于合成,但除此之外一切正常。
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
这得到了 alpha,但是位图是颠倒的,所以我尝试了这个
Gdiplus::Bitmap b(bmp->Width, bmp->Height, - bmp->Width *4, PixelFormat32bppARGB,
(BYTE*) bmp->ScanLine[0]); // negative stride for bottom up bitmaps?!
现在,这行得通,但我当然是硬编码到自下而上的位图中。但是,我找不到确定 TBitmap 是自上而下还是自下而上的方法。它们以负高度在内部存储,但高度值在传递回用户代码之前会被处理。
我怎样才能找到扫描线的顺序,或者——更好的是——还有其他方法可以从 TBitmap 创建 GDIPlus 位图吗?
【问题讨论】:
标签: gdi+ gdi c++builder vcl