利用gdi+转换图片,从png转到jpg时,透明的部分变成黑色而不是白色了.

szuzsq szuzsq 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

int GetEncoderClsid(const wchar_t* format, CLSID* clsid) {
unsigned int num = 0;
unsigned int size = 0;
GetImageEncodersSize(&num, &size);
if(size == 0) return -1;

ImageCodecInfo* pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == 0) return -1;
GetImageEncoders(num, size, pImageCodecInfo);

for(unsigned int j = 0; j < num; ++j) {
if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0) {
*clsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j;
}
}

free(pImageCodecInfo);
return -1;
}

void SaveBMP(Image* image, const wchar_t* fn) {
CLSID clsid;
GetEncoderClsid(L"image/bmp", &clsid);
image->Save(fn, &clsid, NULL);
}

void SaveJPG(Image* image, const wchar_t* fn) {
CLSID clsid;
GetEncoderClsid(L"image/jpeg", &clsid);
image->Save(fn, &clsid, NULL);
}

void SaveGIF(Image* image, const wchar_t* fn) {
CLSID clsid;
GetEncoderClsid(L"image/gif", &clsid);
image->Save(fn, &clsid, NULL);
}

void SaveTIF(Image* image, const wchar_t* fn) {
CLSID clsid;
GetEncoderClsid(L"image/tiff", &clsid);
image->Save(fn, &clsid, NULL);
}

void SavePNG(Image* image, const wchar_t* fn) {
CLSID clsid;
GetEncoderClsid(L"image/png", &clsid);
image->Save(fn, &clsid, NULL);
}



//用法如下:
Bitmap source(name.c_str());

if(sub_ext == L".png")
SavePNG(source, sub_fn.c_str());
else if(sub_ext == L".jpg" || sub_ext == L".jpeg")
SaveJPG(source, sub_fn.c_str());
else if(sub_ext == L".bmp")
SaveBMP(source, sub_fn.c_str());
else if(sub_ext == L".gif")
SaveGIF(source, sub_fn.c_str());
else if(sub_ext == L".tif" || sub_ext == L".tiff")
SaveTIF(source, sub_fn.c_str());
...全文

相关推荐

VC++利用掩码位图制作透明图片

掩码通常是一个黑白位图,黑色代表透明,白色代表不透明。当我们将掩码与目标图像进行“与”运算时,黑色区域的目标图像像素将变为透明,而白色区域则保持不变。

codeenter

VC++ MFC文档视图程序静态背景图片实现:双缓冲绘图与资源管理实战

在Windows桌面应用开发中,图形用户界面(GUI)的绘制效率和视觉体验是核心考量。双缓冲绘图技术通过先在内存中完成所有绘制操作,再一次性输出到屏幕,有效解决了画面闪烁问题,是提升界面流畅度的关键技术。其工程价值在于能够显著改善用户交互体验,尤其适用于文档编辑器、数据可视化工具等需要频繁重绘的场景。本文聚焦于VC++ MFC框架下的具体实现,通过封装资源管理类,将JPG/PNG等格式图片作为自定义资源嵌入程序,并结合双缓冲机制,在文档视图架构中稳健地实现了静态背景功能。该方案不仅解决了滚动视图中的闪烁问题

weixin_30509393

TImage组件中显示png图片

需要注意的是,虽然`GetHBITMAP`方法有一个参数用于设置背景颜色,但因为Delphi的TBitmap不支持透明度,所以对于有透明部分的PNG图片,这个参数的效果并不明显,透明背景会被默认填充为黑色

不全

bmp透明 VC++ png

实现BMP透明转换为PNG的一个常见方法是,先将BMP图像加载到内存中,然后通过编程方式设置透明色,最后将其保存为PNG格式。在保存为PNG时,可以保留透明信息,这样就能得到带有透明效果的PNG图片。

qq276564315

png 透明png 透明vc++

### 示例代码示例代码展示了如何使用Delphi(一种基于Pascal的编程语言)和GDI+来处理PNG图像的透明度。代码中包含了装载PNG图像、创建矩形区域、设置裁剪区域以及保存图像的具体步骤。

yeguolin1
评论 4
收藏 已收藏
分享
返回顶部
szuzsq
VC/MFC 16,550 成员 421,606 内容