GDI+ 句柄存图
//将Bitmap保存为图片
BOOL SaveBitmapToFile(Bitmap *bmp,LPTSTR lpPath)
{
CLSID pngClsid;
TCHAR wsTemp[MAX_PATH],wsExt[MAX_PATH];
_tsplitpath_s(lpPath,wsTemp,wsTemp,wsTemp,wsTemp);
if (NULL == wsTemp)
{
_tcscpy_s(wsExt, "image/bmp");
}
else
{
_tcscpy_s(wsExt, "image/");
_tcscat_s(wsExt,wsTemp+1);
}
GetEncoderClsid(wsExt, &pngClsid);//L"image/bmp" L"image/jpeg" L"image/gif" L"image/tiff" L"image/png"
LONG quality = 100;
if (bmp)
{
EncoderParameters encoderParameters;
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;
encoderParameters.Parameter[0].Value = &quality;
USES_CONVERSION;
if ( bmp->Save(T2W(lpPath), &pngClsid, &encoderParameters) == Ok)
{
return TRUE;
}
}
return FALSE;
}
//将HBITMAP保存为图片
BOOL SaveHBitmapToFile(HBITMAP hBmp,LPTSTR lpPath)
{
if (NULL == hBmp)
{
return FALSE;
}
BITMAP bitmap;
GetObject(hBmp, sizeof(BITMAP), &bitmap);
Bitmap* pBitmap = NULL;
Bitmap* pWrapBitmap = NULL;
//判断是否32位,32位需保存透明度
if (bitmap.bmBitsPixel != 32)
{
pBitmap = Bitmap::FromHBITMAP(hBmp, NULL);
}
else
{
pWrapBitmap = Bitmap::FromHBITMAP(hBmp, NULL);
if (!pWrapBitmap)
return FALSE;
BitmapData bitmapData;
Rect rcImage(0, 0, pWrapBitmap->GetWidth(), pWrapBitmap->GetHeight());
pWrapBitmap->LockBits(&rcImage, ImageLockModeRead, pWrapBitmap->GetPixelFormat(), &bitmapData);
pBitmap = new (Bitmap)(bitmapData.Width, bitmapData.Height, bitmapData.Stride, PixelFormat32bppARGB, (BYTE*)bitmapData.Scan0);
pWrapBitmap->UnlockBits(&bitmapData);
}
BOOL bRet = SaveBitmapToFile(pBitmap,lpPath);
delete pBitmap;
if (pWrapBitmap)
delete pWrapBitmap;
return bRet;
}
//将HDC保存为图片
BOOL SaveHdcToFile(HDC hDC,LPTSTR lpPath)
{
if (NULL == hDC)
{
return FALSE;
}
int nWidth = GetDeviceCaps(hDC, HORZRES); //获取Size
int nHeight = GetDeviceCaps(hDC, VERTRES);
//将目标区域贴图到内存BITMAP
HDC memDC = CreateCompatibleDC(hDC);
if (NULL == memDC)
{
return FALSE;
}
HBITMAP hBmp = CreateCompatibleBitmap(hDC, nWidth, nHeight); //建立和屏幕兼容的bitmap
if (NULL == hBmp)
{
DeleteDC(memDC);
return FALSE;
}
HBITMAP hOldBmp = (HBITMAP)SelectObject(memDC, hBmp); //将memBitmap选入内存DC
BitBlt(memDC, 0, 0, nWidth, nHeight, hDC, 0, 0, SRCCOPY); //复制屏幕图像到内存DC
BOOL bRet = SaveHBitmapToFile(hBmp,lpPath);
SelectObject(memDC, hOldBmp);
DeleteDC(memDC);
DeleteObject(hBmp);
return bRet;
}
//将HICON保存为图片
BOOL SaveHIconToFile(HICON hIcon, LPTSTR lpszPicFileName)
{
if (hIcon == NULL)
{
return FALSE;
}
ICONINFO icInfo = { 0 };
if (!::GetIconInfo(hIcon, &icInfo))
{
return FALSE;
}
BOOL bRsu = SaveHBitmapToFile(icInfo.hbmColor,lpszPicFileName);
DeleteObject(icInfo.hbmColor);
DeleteObject(icInfo.hbmMask);
return bRsu;
}
//获取特定图片类型的编码
int GetEncoderClsid(const TCHAR* format, CLSID* pClsid)
{
UINT num = 0, size = 0;
int dwReturn = -1;
Gdiplus::GetImageEncodersSize(&num, &size);
if(size == 0)
return dwReturn; // Failure
Gdiplus::ImageCodecInfo* pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);
for (UINT ix = 0;ix < num; ++ix)
{
USES_CONVERSION;
TCHAR *pwsz = OLE2T((LPOLESTR)(pImageCodecInfo[ix].MimeType));
if (_stricmp(pwsz, format) == 0)
{
*pClsid = pImageCodecInfo[ix].Clsid;
dwReturn = ix;
break;
}
}
free(pImageCodecInfo);
return dwReturn;
}