具有透明度的将位图(bmp)转换为png(Windows c ++)

史蒂夫·A:

我需要将bmp文件中的一种颜色视为透明,同时将bmp文件转换为png文件。我的应用程序使用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”等)。我正在寻找具体细节和(相对)易于实施的问题。

谢谢!

KungPhoo:

应该这样做:

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);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不损失透明度的情况下将PNG图像转换为灰度C#

具有透明度将PDF转换为png文件(保留alpha)

Visual Studio 2013 C++ 中的位图透明度

具有透明度的复合位图

将PDF(具有透明度*和* CMYK)转换为jpg

如何在PIL中将具有透明度的基于调色板的PNG转换为RGB?

即使在WPF C#中禁用控件,如何也具有100%的不透明度

将灰度图像转换为具有可定义阈值的 1 位黑/白,并保持透明度?

如何在C ++中将Windows位图转换为Actionscript位图

将所有不透明像素转换为白色,保持透明度

将具有“多态”的delphi记录转换为c / c ++

具有透明度的css3动画png

pygame:创建具有透明度的遮罩形式 png

C#位图模糊具有透明背景

将PHAsset转换为UIImage时失去透明度

FFmpeg:将透明度转换为特定颜色

如何在不转换白色背景介绍透明度的情况下将PDF转换为PNG

如何使用Magick ++将具有透明背景的png图像设置为不透明度

iOS Objective C将具有透明背景的PNG文件加载到UIImageView

C++/CLI 将位图转换为 OpenCV Mat

如何使用Python和Pillow将此索引的PNG转换为灰度并保持透明度?

Win32 C ++ BitBlt透明度

在Linux中的QT C ++中设置QButton的透明度

具有透明度的DrawingBrush

使ImageView具有深色透明度

使用ImageTools c#wp8将可写位图转换为Png

将代码转换为c ++时,如何使用具有typedef枚举的C的标头?

在Windows 7中右键单击将BMP转换为PNG

如何在 Python 中将 .EPS 文件保存为具有透明度的 PNG