windows GDI+ 离屏绘制文字图片

windows GDI+ 离屏绘制文字图片

由于之前都是在linux开发界面,转到windows还真不适应,然后开发工具是VS2015,目的就是不需要把图片文字绘制到界面上,而是绘制到一张透明图上,方便我们对图片进行操作。之前也在网上搜索过相关资料,确实挺少的,现在把实现的功能分享给大家,省的大家走弯路。


1. 创建 bitmap 以及 graphic句柄

        m_gdiBitmap = new Bitmap(width, height, PixelFormat32bppARGB);
	m_s_gdiGraphics = new Graphics(m_gdiBitmap);

2. 创建字体

	FontFamily fontfamily(L"宋体");
	pfont = new Font(&fontfamily, 60, FontStyleRegular, UnitPixel);

3. 绘制文字

	StringFormat strformat;
	strformat.SetAlignment(StringAlignmentCenter);//水平居左  
	strformat.SetLineAlignment(StringAlignmentCenter);//垂直居中  
	m_s_gdiGraphics->SetTextRenderingHint(TextRenderingHintAntiAlias);

	m_s_gdiGraphics->DrawString((WCHAR *)text, -1, pfont, RectF(0, 0, width, height), &strformat, &SolidBrush(Color::Black));

4. 绘制图片

	s_schar_2_wchar("C:\\Users\\Administrator\\Desktop\\test.png", &p);
	Image *newImage = Image::FromFile(p);
	m_s_gdiGraphics->DrawImage(newImage, 0, 0);

5. 保存图片验证是否正确

INT GetEncoderClsid(const WCHAR *format, CLSID *pClsid)
{
	UINT  num = 0;          // number of image encoders      
	UINT  size = 0;         // size of the image encoder array in bytes      

	ImageCodecInfo* pImageCodecInfo = NULL;

	GetImageEncodersSize(&num, &size);
	if (size == 0)
		return -1;  // Failure      

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

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

	free(pImageCodecInfo);
	return -1;  // Failure     
}

	CLSID pngClsid;
	s_schar_2_wchar("image/png", &p);
	GetEncoderClsid(p, &pngClsid);
	s_schar_2_wchar("C:\\Users\\Administrator\\Desktop\\result.png", &p);
	m_gdiBitmap->Save(p, &pngClsid, NULL);

6. 总结以下是完整代码

MInt32 GdiDrawText::doInit()
{
	if (m_s_nRefCount == 0)
	{
		
		Gdiplus::GdiplusStartupInput gdiStartupInput;
		Gdiplus::Status gdiStatus = Gdiplus::GdiplusStartup(&m_gdiToken, &gdiStartupInput, NULL);
		if (Gdiplus::Status::Ok != gdiStatus)
			return -1;

		m_gdiBitmap = new Bitmap(480, 480);
		m_s_gdiGraphics = new Graphics(m_gdiBitmap);
		WCHAR *p = MNull;
		FontFamily fontfamily(L"宋体");


		Font font(&fontfamily, 60, FontStyleRegular, UnitPixel);
		
		StringFormat strformat;
		strformat.SetAlignment(StringAlignmentCenter);//水平居左  
		strformat.SetLineAlignment(StringAlignmentCenter);//垂直居中  
		m_s_gdiGraphics->DrawRectangle(&Pen(Color::Green, 2), RectF(0, 0, 480, 480));
		m_s_gdiGraphics->DrawString(L"什么玩意", -1, &font, RectF(0, 0, 480, 480), &strformat, &SolidBrush(Color::Black));

		CLSID pngClsid;
		s_schar_2_wchar("image/png", &p);
		GetEncoderClsid(p, &pngClsid);
		s_schar_2_wchar("C:\\Users\\Administrator\\Desktop\\result.png", &p);
		m_gdiBitmap->Save(p, &pngClsid, NULL);

		delete m_s_gdiGraphics;
		delete m_gdiBitmap;
		
	}
	m_s_nRefCount++;
	return QVET_ERR_NONE;
}





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值