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
原创粉丝点击