如何把画在DC上的图像保存成无背景的gif/png

怎么把画在DC上的图像保存成无背景的gif/png ?
我在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)