生成屏幕截图,并在截图上面加上文字戳

前两天有一个需求,需要进行屏幕截图留存,截图上还需要有“文字戳”,这个用 GDI+ 来实现非常简单,GetDC(  HWND  ) , 我们可以把想截取的窗口的句柄传入,如果想截整个桌面直接传入 NULL ;  获取 HDC (  设备上下文 ) 后,余下的工作交给 CImage 处理即了,CImage 非常强大,有兴趣可以慢慢研究。



#include "stdafx.h"
#include "Windows.h"

 
using namespace Gdiplus;
#pragma  comment(lib, "gdiplus.lib")

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{

	UINT  num = 0;
	UINT  size = 0;
	ImageCodecInfo* pImageCodecInfo = NULL;
	GetImageEncodersSize(&num, &size);
	if (size == 0)
		return -1;

	pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
	if (pImageCodecInfo == NULL)
		return -1;

	GetImageEncoders(num, size, pImageCodecInfo);
	for (UINT j = 0; j < num; ++j)
	{
		if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
		{
			*pClsid = pImageCodecInfo[j].Clsid;
			free(pImageCodecInfo);
			return j;
		}
	}
	free(pImageCodecInfo);
	return -1;
}

int main()
{

	/**
	* 取当前DC 保存为一张图片
	* ============================================================================================== */
	//HWND mHwnd = ::FindWindow(L"HwndWrapper[DefaultDomain;;908ef9bf-c867-44f6-bec7-4816317d59ae]",NULL);
	HDC hdcSrc = GetDC(NULL);
	int nBitPerPixel = GetDeviceCaps(hdcSrc, BITSPIXEL);
	int nWidth = GetDeviceCaps(hdcSrc, HORZRES);
	int nHeight = GetDeviceCaps(hdcSrc, VERTRES);
	CImage image;
	image.Create(nWidth, nHeight, nBitPerPixel);
	BitBlt(image.GetDC(), 0, 0, nWidth, nHeight, hdcSrc, 0, 0, SRCCOPY);
	ReleaseDC(NULL, hdcSrc);
	image.ReleaseDC();
	//image.Save(L"1.png", Gdiplus::ImageFormatPNG);//ImageFormatJPEG
	image.Save(L"1.jpg", Gdiplus::ImageFormatJPEG);//ImageFormatJPEG


	/**
	* 在图片上加文字
	* ============================================================================================== */
	Image image2(L"1.jpg"); 
	Graphics imageGraphics(&image2);
	imageGraphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
	WCHAR string[] = L"测试文字"; 
	FontFamily fontFamily(L"Microsoft YaHei");	
	Gdiplus::Font myFont(&fontFamily, 45, FontStyleRegular, UnitPoint);
	SolidBrush blackBrush( Color(255, 0, 0, 0) );
	PointF school_site( (REAL)10, (REAL)10 );	
	StringFormat format;
	format.SetAlignment(StringAlignmentNear);											
	imageGraphics.DrawString(string, wcslen(string), &myFont, school_site, &format, &blackBrush);

	CLSID pngClsid;
	//L"image/jpeg","image/png",L"image/bmp",L"image/gif",L"image/tiff"
	GetEncoderClsid( L"image/jpeg", &pngClsid );
	image2.Save( L"1.2.jpg", &pngClsid, NULL);
		
    return 0;
}