将位图 (bmp) 转换为具有透明度的 png (Windows c++)
Converting a bitmap (bmp) to png with transparency (Windows c++)
我需要将 bmp 文件转换为 png 文件,同时将 bmp 中的一种颜色视为透明。我的应用使用 MFC,但我不依赖于在解决方案中使用 MFC。我在从 gdi 移植到 Direct2D 时执行此操作,因此我确实可以访问 Direct2D(尽管我是 Direct2D 的真正新手(。我想避免使用 gdi+ 和外部源代码(例如 libpng(,但我会重新考虑它是否提供了一个易于实现的解决方案。性能不是问题。
如图所示,MFC 可以轻松地从 bmp 文件创建 png 文件,但我不知道如何将 bmp 中的"透明颜色"转换为 png 中的 alpha 蒙版。(这不太理想,但我可以创建 png 文件,然后读取它,将图像的"透明颜色"更改为透明度,然后写入它。
// Convert bmp to png.
CImage image;
if(image.Load(bmpFilename) == S_OK)
{
image.Save(pngFilename, Gdiplus::ImageFormatPNG) == S_OK);
}
我见过这个线程,它提出了一个非常相似的问题,但它的答案是高级的(例如,"使用 libpng"、"使用 gdi+"、"使用 BITMAPINFOHEADER::biCompression == BI_PNG"等(。我正在寻找具体和(相对(易于实施。
谢谢!
这应该可以:
void CImageCopy(CImage& dest, CImage& src)
{
// rescale user image
dest.Destroy();
dest.Create(src.GetWidth(), src.GetHeight(), 32, CImage::createAlphaChannel);
HDC hdc = dest.GetDC();
src.AlphaBlend(hdc, 0,0,src.GetWidth(), src.GetHeight(), 0,0,src.GetWidth(),src.GetHeight());
dest.ReleaseDC();
}
void Fix24BitTransparency(CImage& img)
{
if(img.GetBPP()<32 )
{
// alpha bits
CImage imgout;
imgout.Create(img.GetWidth(), img.GetHeight(), 32, CImage::createAlphaChannel);
for(int x=0; x<img.GetWidth(); ++x)
for(int y=0; y<img.GetHeight(); ++y)
{
COLORREF c1;
c1 = img.GetPixel(x,y); // user image
imgout.SetPixel(x,y,c1);
if( c1 == RGB(255,0,128) ) // or whatever you decide transparent...
{
imgout.SetPixel(x,y, RGB(255,255,255) );
BYTE* pAlpha = (BYTE*)imgout.GetPixelAddress(x, y)+3;
*pAlpha = 0;
}
else
{
BYTE* pAlpha = (BYTE*)imgout.GetPixelAddress(x, y)+3;
*pAlpha = 255;
}
}
CImageCopy(img, imgout);
}
}
相关文章:
- 在CToolBar对象中使用PNG时出现问题
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 将 FFMPEG 帧写入 png/jpeg 文件
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 如何启用libMagick++以保存.png文件格式
- Qt-png图像未显示在部署应用程序中
- 无法在CLion(macOS)上打开带有CImg的.png文件
- Vulkan是否需要在多个具有透明度的平局调用之间进行同步
- C++gdi::内存中的位图到PNG图像
- 当我调用它来解码 Blob 对象中的 png 图像时,"Magick++::readImages"引发警告
- 像素与透明度叠加
- 如何将 2d 数组转换为 svg 或 png 格式的数独图像?
- 如何从透明度计算不透明度?
- GUID variable for JPEG,BMP,PNG
- 尝试使用 CPP 在一个 Qt 窗口中显示多个 png 文件
- 为什么PNG图像的stdout有时会在printf中刷新图像的一半
- 如何使用GDI 显示具有25%不透明度的PNG图像?(MFC)
- 从Mat(OpenCV)生成具有透明度的PNG
- 当将透明png图像转换为位图时,它不会保留透明度