【问题标题】:Delphi/C++Builder TBitmap: How to determinine scanline order?Delphi/C++Builder TBitmap:如何确定扫描线顺序?
【发布时间】: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


    【解决方案1】:

    TBitmap::ScanLine 属性说明自上而下和自下而上。对于自底向上位图,ScanLine[0] 返回原始像素数据的最后一行,ScanLine[Height-1] 返回第一行。对于自上而下的位图,ScanLine[0] 返回原始像素数据的第一行,ScanLine[Height-1] 返回最后一行。

    要确定TBitmap 是自下而上还是自上而下,您必须手动检索其BITMAPINFOHEADER 结构,而TBitmap 本身并未公开该结构。您可以使用 Win32 API GetObject() 函数来检索具有 BITMAPINFOHEADER 成员的 DIBSECTION 结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 2021-08-12
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多