旋转CImage并保留其alpha/透明度通道
Rotating a CImage and preserving its alpha/transparency channel
我有一些现有的代码,使用CImage有一个alpha通道,我需要旋转它。
我发现了以下建议,将CImage转换为GDI+位图,然后旋转它,旋转的结果最终回到CImage。
Bitmap* gdiPlusBitmap=Bitmap::FromHBITMAP(atlBitmap.Detach());
gdiPlusBitmap->RotateFlip(Rotate90FlipNone);
HBITMAP hbmp;
gdiPlusBitmap->GetHBITMAP(Color::White, &hbmp);
atlBitmap.Attach(hbmp);
显然,它的工作没有实际复制位图字节,这是伟大的,但问题是,如果你从HBITMAP创建一个位图对象,它扔掉了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旋转),或者在哪里删除位图对象。
有谁知道正确的方法来做到这一点,保留alpha通道?
理想情况下,我希望避免复制位图数据,但这不是强制性的。
您可以使用Gdiplus::Graphics
在CImage
上绘制位图。
注意,硬编码PixelFormat32bppARGB
可能会导致问题,如果图像不支持alpha通道。我添加了一些基本的错误检查。
CImage image;
if (S_OK != image.Load(L"c:\test\test.png"))
{
AfxMessageBox(L"can't open");
return 0;
}
int bpp = image.GetBPP();
//get pixel format:
HBITMAP hbmp = image.Detach();
Gdiplus::Bitmap* bmpTemp = Gdiplus::Bitmap::FromHBITMAP(hbmp, 0);
Gdiplus::PixelFormat pixel_format = bmpTemp->GetPixelFormat();
if (bpp == 32)
pixel_format = PixelFormat32bppARGB;
image.Attach(hbmp);
//rotate:
Gdiplus::Bitmap bmp(image.GetWidth(), image.GetHeight(), image.GetPitch(), pixel_format, static_cast<BYTE*>(image.GetBits()));
bmp.RotateFlip(Gdiplus::Rotate90FlipNone);
//convert back to image:
image.Destroy();
if (image.Create(bmp.GetWidth(), bmp.GetHeight(), 32, CImage::createAlphaChannel))
{
Gdiplus::Bitmap dst(image.GetWidth(), image.GetHeight(), image.GetPitch(), PixelFormat32bppARGB, static_cast<BYTE*>(image.GetBits()));
Gdiplus::Graphics graphics(&dst);
graphics.DrawImage(&bmp, 0, 0);
}
相关文章:
- 在AVX通道中混洗的最佳方式
- 在Arduino中将PWM通道命名为LEDC是否有特定原因
- 空 grpc 客户端通道
- 如何在进程之间创建双向通道?
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 在 libsndfile 中一次写入一个通道
- 如何在 C++ 中建立进程之间的双向通道?
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- 在RAW图像中提取RGB通道值的库或方法
- 深度缓冲区未填充阴影贴图渲染通道中的数据
- 如何将具有两个通道的垫子转换为矢量<int><矢量>?
- QWeb通道新客户端获得初始状态?
- Gdiplus位图没有Alpha通道
- Vulkan是否需要在多个具有透明度的平局调用之间进行同步
- Go/C++gRPC客户端通道和存根生命周期
- HBITMAP 能否包含 alpha 通道信息?
- 像素与透明度叠加
- 编写具有 2 个通道的自定义 QIODevice
- 如何从透明度计算不透明度?
- 旋转CImage并保留其alpha/透明度通道