以下为源码部分
#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;
}