GDI+ 句柄存图,bmp | jpeg | gif | tiff | png

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值