【发布时间】:2015-07-29 11:04:00
【问题描述】:
我有一些现有代码使用具有 alpha 通道的 CImage,我需要旋转它。
我发现以下建议将 CImage 转换为 GDI+ 位图然后旋转它,旋转后的结果最终回到 CImage。
Bitmap* gdiPlusBitmap=Bitmap::FromHBITMAP(atlBitmap.Detach());
gdiPlusBitmap->RotateFlip(Rotate90FlipNone);
HBITMAP hbmp;
gdiPlusBitmap->GetHBITMAP(Color::White, &hbmp);
atlBitmap.Attach(hbmp);
显然它不需要实际复制位图字节就可以工作,这很好,但问题是如果你从 HBITMAP 创建一个 Bitmap 对象,它会丢弃 alpha 通道。
显然要保留 alpha 通道,您必须改为使用构造函数创建位图
Bitmap(
[in] INT width,
[in] INT height,
[in] INT stride,
[in] PixelFormat format,
[in] BYTE *scan0
);
所以我正在尝试调整上面的内容以使用这个构造函数,但是 CImage 和 Bitmap 之间的交互有点令人困惑。我想我需要像这样创建位图
Bitmap* gdiPlusBitmap = new Bitmap(
pCImage->GetWidth(),
pCImage->GetHeight(),
pCImage->GetPitch(),
PixelFormat32bppARGB,
(BYTE *)pCImage->GetBits());
nGDIStatus = gdiPlusBitmap->RotateFlip(Rotate90FlipNone);
但我不确定如何让 CImage 获取更改(这样我最终会旋转原始 CImage),或者在哪里删除 Bitmap 对象。
有谁知道这样做的正确方法,保留 alpha 通道?
理想情况下,我希望避免复制位图数据,但这不是强制性的。
【问题讨论】: