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

szuzsq 2015-12-14 11:37:48

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());
...全文
408 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
szuzsq 2015-12-20
  • 打赏
  • 举报
回复
谢谢楼上诸位,我走弯路了.我每个象素将apha值转成灰度.
赵4老师 2015-12-14
  • 打赏
  • 举报
回复
小心底图内容手滑初始化为无底裤图了!
kgd329443091 2015-12-14
  • 打赏
  • 举报
回复
一楼正解 先画底图 再绘出png 再转存
Yofoo 2015-12-14
  • 打赏
  • 举报
回复
png自身的应该是透明的, 不是白色, 也不是黑色 保存到jpg如果想要某个背景颜色可以创建一个Graphics , 先填充背景颜色, 然后绘制png, 最后导出来

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧