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());
4 个解决方案
#1
png自身的应该是透明的, 不是白色, 也不是黑色
保存到jpg如果想要某个背景颜色可以创建一个Graphics , 先填充背景颜色, 然后绘制png, 最后导出来
保存到jpg如果想要某个背景颜色可以创建一个Graphics , 先填充背景颜色, 然后绘制png, 最后导出来
#2
一楼正解 先画底图 再绘出png 再转存
#3
小心底图内容手滑初始化为无底裤图了!
#4
谢谢楼上诸位,我走弯路了.我每个象素将apha值转成灰度.
#1
png自身的应该是透明的, 不是白色, 也不是黑色
保存到jpg如果想要某个背景颜色可以创建一个Graphics , 先填充背景颜色, 然后绘制png, 最后导出来
保存到jpg如果想要某个背景颜色可以创建一个Graphics , 先填充背景颜色, 然后绘制png, 最后导出来
#2
一楼正解 先画底图 再绘出png 再转存
#3
小心底图内容手滑初始化为无底裤图了!
#4
谢谢楼上诸位,我走弯路了.我每个象素将apha值转成灰度.