如何把画在DC上的图像保存成无背景的gif/png
怎么把画在DC上的图像保存成无背景的gif/png ?
我在DC上绘制了一些图像,背景是白色的,我想把图像存成不带背景的GIF或PNG图片,不知道GDI+能实现吗?
或是其它第三方库也行,给个例子吧。
我目前能做到的就是先把DC里的内容存成BMP,再用CxImage把BMP转成不带背景的PNG,GIF因为要把位深度降到8,我用CxImage目前还没实现,正在偿试。
我想直接把DC里的内容保存成不还背景的GIF,中间转存一次BMP在麻烦,还想请教的就是能不能用GDI+直接实现?
高手们给个提示吧~~谢谢!!
------解决方案--------------------
我在DC上绘制了一些图像,背景是白色的,我想把图像存成不带背景的GIF或PNG图片,不知道GDI+能实现吗?
或是其它第三方库也行,给个例子吧。
我目前能做到的就是先把DC里的内容存成BMP,再用CxImage把BMP转成不带背景的PNG,GIF因为要把位深度降到8,我用CxImage目前还没实现,正在偿试。
我想直接把DC里的内容保存成不还背景的GIF,中间转存一次BMP在麻烦,还想请教的就是能不能用GDI+直接实现?
高手们给个提示吧~~谢谢!!
------解决方案--------------------
enum IMAGETYPE{IMG_BMP,IMG_JPG,IMG_PNG,IMG_TIF,IMG_GIF};
int GraphicsManager::GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
unsigned int num = 0; // number of image encoders
unsigned int size = 0; // size of the image encoder array in bytes
Gdiplus::GetImageEncodersSize(&num, &size);
if(size == 0)return -1;
Gdiplus::ImageCodecInfo* imageCodecInfo = new Gdiplus::ImageCodecInfo[size];
Gdiplus::GetImageEncoders(num, size, imageCodecInfo);
for(unsigned int i = 0; i < num; ++i)
{
if( wcscmp(imageCodecInfo[i].MimeType, format) == 0 )
{
*pClsid = imageCodecInfo[i].Clsid;
delete[] imageCodecInfo;
return i;
}
}
delete[] imageCodecInfo;
return -1;
}
BOOL GraphicsManager::ImageSaveTo(LPCWSTR lpszPathName,IMAGETYPE type,COLORREF transcolor,BYTE transrange,WCHAR* result)
{
CLSID pngClsid;
if(type==IMG_BMP)
GetEncoderClsid(L"image/bmp",&pngClsid);
else if(type==IMG_JPG)
GetEncoderClsid(L"image/jpeg",&pngClsid);
else if(type==IMG_GIF)
GetEncoderClsid(L"image/gif",&pngClsid);
else if(type==IMG_TIF)
GetEncoderClsid(L"image/tiff",&pngClsid);
else if(type==IMG_PNG)
GetEncoderClsid(L"image/png",&pngClsid);
Bitmap* pImage = new Bitmap(lpszPathName);
Bitmap* pBufImg = new Bitmap(pImage->GetWidth(),pImage->GetHeight());
Graphics* graph = new Graphics(pBufImg);
ColorMatrix colorMatrix=
{
1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,0,0,
0,0,0,0,1
};
Rect rect(0,0,pImage->GetWidth(),pImage->GetHeight());
ImageAttributes imageAttr;
imageAttr.SetColorMatrix(&colorMatrix);
graph->DrawImage(pImage,rect,0,0,rect.Width,rect.Height,UnitPixel,&imageAttr);
Color c;
c.SetFromCOLORREF(transcolor);
int r,g,b;
r = c.GetR()-transrange;
g = c.GetG()-transrange;
b = c.GetB()-transrange;
if(r<0)r=0;
if(g<0)g=0;
if(b<0)b=0;
Color c0(c.GetA(),(BYTE)r,(BYTE)g,(BYTE)b);
r = c.GetR()+transrange;
g = c.GetG()+transrange;
b = c.GetB()+transrange;
if(r>255)r=255;
if(g>255)g=255;
if(b>255)b=255;
Color c1(c.GetA(),(BYTE)r,(BYTE)g,(BYTE)b);
imageAttr.SetColorKey(c0,c1,ColorAdjustTypeBitmap);
colorMatrix.m[3][3]=1;
imageAttr.SetColorMatrix(&colorMatrix);
graph->DrawImage(pImage,rect,0,0,rect.Width,rect.Height,UnitPixel,&imageAttr);
if(type==IMG_BMP)
swprintf_s(result,MAX_PATH,L"%s.bmp",lpszPathName);
else if(type==IMG_JPG)
swprintf_s(result,MAX_PATH,L"%s.jpg",lpszPathName);
else if(type==IMG_GIF)
swprintf_s(result,MAX_PATH,L"%s.gif",lpszPathName);
else if(type==IMG_TIF)