C++ GDI+ DrawString 保存字符串文字为透明图片
来源:互联网 发布:英文翻译最好的软件 编辑:程序博客网 时间:2024/05/19 01:59
实现通过GDI+将输入的字符串保存为背景透明的图片的示例代码
【1】头文件
#ifndef _AFXSTD_EF4A7E9D_ECEF_4D13_B0AD_ADEB38D1E347_INCLUDE_H_#define _AFXSTD_EF4A7E9D_ECEF_4D13_B0AD_ADEB38D1E347_INCLUDE_H_#if _MSC_VER > 1000#pragma once#endif#include <string>using namespace std;#include <gdiplus.h>//==================================CTextToImage==================================/// @brief 文本转图片////// 将文本字符串转成透明图片//================================================================================class CTextToImage{public:CTextToImage();CTextToImage(wstring &strText, wstring pFontName = L"宋体", float fontSize=12, DWORD pColor=0x000000FF, int fontStyle=0);~CTextToImage();public:voidSetString(wstring &strText);intGetFontCount();void GetFontNameArr(WCHAR **pFontNameArr, int numSought, int *pNumFound);void SetFontName(wstring &fontName);void SetFontSize(float fontSize);void SetFontColor(DWORD color);void SetFontStyle(int fontStyle);void SaveToImage(HWND hWnd, wstring &strPicPath );private:wstring*m_pStrText;//文本WCHAR*m_pFontName;//字体名称Gdiplus::Color *m_pFontColor; //文本的颜色float m_FontSize;//字号int m_FontStyle;//字体效果规则、粗体、斜体、粗斜体、下划线、强调线};#endif //!_AFXSTD_EF4A7E9D_ECEF_4D13_B0AD_ADEB38D1E347_INCLUDE_H_
【2】cpp文件
#include "stdafx.h"#include "Caption.h"using namespace Gdiplus;CTextToImage::CTextToImage(){m_pStrText = new wstring;m_pFontColor = new Gdiplus::Color(Gdiplus::Color::Black);m_pFontName = new WCHAR[32];wcscpy_s(m_pFontName, 32, L"宋体");m_FontSize = 12;m_FontStyle = Gdiplus::FontStyleRegular;}CTextToImage::CTextToImage( wstring &strText, wstring pFontName /*= "宋体"*/, float fontSize/*=12*/, DWORD pColor/*=0x000000FF*/, int fontStyle/*=0*/ ){new(this)CTextToImage();*m_pStrText = strText;wcscpy_s(m_pFontName, 32, pFontName.c_str());m_FontSize = fontSize;m_FontStyle = fontStyle;m_pFontColor->SetFromCOLORREF(pColor);}CTextToImage::~CTextToImage(){if (NULL != m_pStrText){delete m_pStrText;}if (NULL != m_pFontColor){delete m_pFontColor;}if (NULL != m_pFontName){delete []m_pFontName;}}void CTextToImage::SetString(wstring &strText ){if (NULL == m_pStrText){return;}*m_pStrText = strText;}bool GetEncoderClsid(const WCHAR* format, CLSID* pClsid){UINT num = 0, size = 0;Gdiplus::GetImageEncodersSize(&num, &size);if(size == 0)return -1; // FailureGdiplus::ImageCodecInfo* pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);bool found = false;for (UINT ix = 0; !found && ix < num; ++ix) {if (_wcsicmp(pImageCodecInfo[ix].MimeType, format) == 0) {*pClsid = pImageCodecInfo[ix].Clsid;found = true;break;}}free(pImageCodecInfo);return found;}void CTextToImage::SaveToImage(HWND hWnd, wstring &strPicPath ){if (NULL == m_pStrText || NULL == m_pFontColor){return;}Gdiplus::FontFamily fontFamily(m_pFontName);Gdiplus::Font font(&fontFamily, m_FontSize, m_FontStyle, Gdiplus::Unit::UnitPoint);Gdiplus::SolidBrush solidBrush(*m_pFontColor);Gdiplus::Graphics graphics(hWnd);//Gdiplus::StringFormat stringformat;//stringformat.SetTrimming(StringTrimming::StringTrimmingEllipsisWord);//字体边沿平滑处理graphics.SetTextRenderingHint(Gdiplus::TextRenderingHint::TextRenderingHintAntiAlias);//【1】计算字符串的尺寸Gdiplus::RectF boundingBox(0, 0, 0, 0);graphics.MeasureString(m_pStrText->c_str(), -1, &font, Gdiplus::PointF(0, 0), &boundingBox);//【2】创建bitMapGdiplus::SizeF size;boundingBox.GetSize(&size);Gdiplus::Bitmap bitmap((int)size.Width, (int)size.Height, PixelFormat32bppARGB);Gdiplus::Graphics g(&bitmap);//【3】绘制文本g.DrawString(m_pStrText->c_str(), -1, &font, Gdiplus::PointF(0, 0), &solidBrush);CLSID clsID = GUID_NULL;wchar_t ext[_MAX_EXT] = {0};wchar_t format[_MAX_EXT] = {L"image/"};_wsplitpath_s(strPicPath.c_str(), NULL, 0, NULL, 0, NULL, 0, ext, _MAX_EXT);wcscat_s(format, _MAX_EXT, ext + 1);if (GetEncoderClsid(format, &clsID)){bitmap.Save(strPicPath.c_str(), &clsID, NULL);}}void CTextToImage::SetFontColor( DWORD color ){m_pFontColor->SetFromCOLORREF(color);}void CTextToImage::GetFontNameArr(WCHAR **pFontNameArr, int numSought, int *pNumFound){if (NULL == pFontNameArr || numSought < 1)return;//获取字体名称列表FontFamily *pFontFamily = new FontFamily[numSought];InstalledFontCollection installedFontCollection; installedFontCollection.GetFamilies(numSought, pFontFamily, pNumFound); for(int j=0; j<*pNumFound; j++){ pFontFamily[j].GetFamilyName(pFontNameArr[j]); } delete[] pFontFamily; }int CTextToImage::GetFontCount(){InstalledFontCollection installedFontCollection; return ( installedFontCollection.GetFamilyCount() ); }void CTextToImage::SetFontName( wstring &fontName ){wcscpy_s(m_pFontName, 32, fontName.c_str());}void CTextToImage::SetFontSize( float fontSize ){m_FontSize = fontSize;}void CTextToImage::SetFontStyle( int fontStyle ){m_FontStyle = fontStyle;}
【3】测试代码
CTextToImage txtImage(wstring(L"dafsdfasd"));txtImage.SaveToImage(m_picCtrl, wstring(L"D:\\filterTest\\txtTojpg.png"));
说明:保存为png格式的图片才可以带透明通道!
1 0
- C++ GDI+ DrawString 保存字符串文字为透明图片
- C++ GDI+ DrawString 保存字符串文字为透明图片
- Delphi 保存GDI+为图片
- C++ GDI+提取系统文件或文件夹的图标,保存为透明图片
- Gdi+ drawstring
- GDI+ 将图片背景设为透明
- 提取文件图标,保存为透明图片
- Visio保存为透明的图片
- Matlab保存图片背景为透明
- GDI+ 制作透明图片
- Pango显示文字,并保存为图片
- C#DrawString
- GDI+保存图片
- gdi+保存图片
- GDI+ 保存图片
- GDI+图片保存
- 绘制透明图片GDI和GDI+结合
- GDI透明旋转平移图片
- 实例探讨工作队列(work queue)的工作原理
- python socket聊天小工具
- BOJ 2314 Going Home //二分图KM模板变形
- poj 3468..(存线段树个人模板(自敲)pushdown函数还不理解)
- 中国将取消农业非农业户口区分 全文
- C++ GDI+ DrawString 保存字符串文字为透明图片
- javascript中引用jquery写的图片放大跟随小实例
- 编译原理手记07-LR分析法
- JavaScript演示String对象
- http://www.cnblogs.com/kuangbin/p/3164106.html
- JFreeChart
- 华为编程大赛——阿姆斯特朗数
- wine字体
- Java Map 如何实现Key 的唯一性?