C++ GDI+ DrawString 保存字符串文字为透明图片

本文介绍了一种使用GDI+将文本转换为带有透明背景的图片的方法,并提供了详细的C++实现代码示例。该示例展示了如何测量文本大小、创建位图以及将文本绘制到位图上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现通过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:
    void    SetString(wstring &strText);
    int     GetFontCount();
    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;  // Failure

    Gdiplus::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】创建bitMap   
    Gdiplus::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格式的图片才可以带透明通道!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值