Windows GDI+的应用(图片上绘文字)

以下为源码部分

#include <windows.h>
#include <gdiplus.h>
#pragma comment( lib, "gdiplus.lib")
#include <WinGDI.h>

namespace{

    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
        Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
        Gdiplus::GetImageEncodersSize(&num, &size);
        if (size == 0)
            return -1; // Failure
        pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
        if (pImageCodecInfo == NULL)
            return -1; // Failure
        Gdiplus::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
    }

std::wstring MultiCharToWideChar(std::string in_str)
{
    std::wstring return_wstr;
    int len = MultiByteToWideChar(CP_ACP, 0, in_str.c_str(), in_str.size(), NULL, 0);
    WCHAR *buffer = new WCHAR[len + 1];
    MultiByteToWideChar(CP_ACP, 0, in_str.c_str(), in_str.size(), buffer, len);
    buffer[len] = '\0';
    return_wstr.append(buffer);
    delete[]buffer;
    return return_wstr;
};

}


static int PainterMap_CodeInfo(std::string mapPath)
 {
    // Initialize GDI+.
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR           gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    Gdiplus::Status stat = Gdiplus::GenericError;
    stat = Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    if (Gdiplus::Ok != stat) {
        //qDebug() << "error" << -1;
        return -1;
    }

    std::wstring strW_mapPath = ::MultiCharToWideChar(mapPath);
#if 0
    Gdiplus::Bitmap* pBitmap = new Gdiplus::Bitmap(strW.c_str());
    if(nullptr == pBitmap){
       // qDebug() << mapPath.c_str();
        return -1;
    }

#else
    Gdiplus::Image* pImage = Gdiplus::Image::FromFile(strW_mapPath.c_str());
    if(nullptr == pImage){
      //  qDebug() << mapPath.c_str();
        return -1;
    }
#endif


    do{
        if(pImage->GetWidth() < 0 || pImage->GetHeight() < 0){
          //  qDebug() << mapPath.c_str();
            break;
        }
        Gdiplus::Graphics gCode(pImage);
        gCode.SetTextRenderingHint( Gdiplus::TextRenderingHintAntiAlias );

        Gdiplus::Pen pen(Gdiplus::Color(0, 0, 255), 3);

        Gdiplus::REAL size = 12*5, y = 10.0f;
        Gdiplus::SolidBrush textBrush(Gdiplus::Color::Green);
        Gdiplus::Font font(L"宋体", size);// = Gdiplus::Font;

        y += 20.0f;
        std::wstring strCodeW = MultiCharToWideChar("SF12345");
        stat = gCode.DrawString(strCodeW.c_str(), INT(strCodeW.size()),
                         &font,
                         Gdiplus::PointF(20.0f, y),
                         &textBrush);
        if (Gdiplus::Ok != stat) {
          //  qDebug() << "error" << -1;
            break;
        }

        CLSID bmpClsid;
        int iRet = ::GetEncoderClsid(L"image/jpeg", &bmpClsid); //选择bmp编码器类标识符; "image/bmp"  "image/jpeg"
        //qDebug() << "iRet" << iRet;

        stat = pImage->Save(L"E:/test1.jpg", &bmpClsid, NULL); //文件名必须和修改的文件名不一致
        if (Gdiplus::Ok != stat) {
          //  qDebug() << "error" << __LINE__ <<stat;
            break;
        }
    }while(0);

    if(nullptr != pImage){
        delete pImage;
        pImage = nullptr;
    }

    //关闭gdiplus的环境
    Gdiplus::GdiplusShutdown(gdiplusToken);
    return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值