您的位置:首页 > 其它

windows GDI+ 离屏绘制文字图片

2017-08-01 17:53 585 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息