您的位置:首页 > 其它

Gdi+绘制半透明文字并保存为透明背景图片

2018-01-09 14:40 866 查看
透明、半透明原理:看画刷的颜色,Color的第一个参数指定透明值,范围0-255,0全透明,255不透明

1.新建MFC工程,名为newtou

2.添加头文件

#include <GdiPlus.h>
using namespace Gdiplus;
#pragma comment(lib, "Gdiplus")


//Gdi+初始化

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR           gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);


//Gdi+卸载

Gdiplus::GdiplusShutdown(m_gdiplusToken); // GDI+卸载


3.在newtouDlg.cpp中添加函数

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


用法:

CLSID encoderClsid

GetEncoderClsid(L"image/jpeg", &m_jpgClsid);

GetEncoderClsid(L"image/png", &encoderClsid); 

GetEncoderClsid(L"image/bmp", &encoderClsid);

GetEncoderClsid(L"image/gif", &encoderClsid);

GetEncoderClsid(L"image/tiff", &encoderClsid);

4.在OnBnClickedOk()中添加实现

void CnewtouDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
//CDialogEx::OnOK();

GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
//1:建立透明内存32位位图文件;
Bitmap bmp( 1600,104, PixelFormat32bppARGB );

//2:刷新32位位图文件为透明;
Graphics g( &bmp );
Color myColor(0, 0,0,0 );
g.Clear( myColor );
//非透明
/*Graphics g( &bmp );
Color myColor( 255,255,255 );
g.Clear( myColor );*/

//3:作图:
//g.DrawLine( &Pen(Color::Black), 0,0,100,100);

//文字开始 方法1
/*Gdiplus::FontFamily fontFamily(_T("宋体"));
FontStyle fontstyle = FontStyleBold;
Gdiplus::Font font(&fontFamily, 60, fontstyle, Gdiplus::Unit::UnitPoint);
Gdiplus::SolidBrush solidBrush(Color(128,255,201,14));

//Gdiplus::StringFormat stringformat;
//stringformat.SetTrimming(StringTrimming::StringTrimmingEllipsisWord);

//字体边沿平滑处理
g.SetTextRenderingHint(Gdiplus::TextRenderingHint::TextRenderingHintAntiAlias);

//【1】计算字符串的尺寸
Gdiplus::RectF boundingBox(0, 0, 0, 0);
CString str(_T("Administrator"));
g.MeasureString(str, -1, &font, Gdiplus::PointF(0, 0), &boundingBox);

//【2】创建bitMap
Gdiplus::SizeF size;
boundingBox.GetSize(&size);
//【3】绘制文本
g.DrawString(str, -1, &font, Gdiplus::PointF(0, 0), &solidBrush);
//文字结束
*/

//方法2
Gdiplus::FontFamily fontFamily(_T("宋体"));
FontStyle fontstyle = FontStyleBold;
Gdiplus::Font font(&fontFamily, 60, fontstyle, Gdiplus::Unit::UnitPoint);
Gdiplus::SolidBrush solidBrush(Color(128,255,201,14));

GraphicsPath txtPath(FillModeWinding);

StringFormat cStringFormat ;
cStringFormat.SetAlignment( StringAlignmentNear );//StringAlignmentNear 改为居左
cStringFormat.SetLineAlignment(StringAlignmentNear);
cStringFormat.SetFormatFlags( StringFormatFlagsNoWrap | StringFormatFlagsMeasureTrailingSpaces );
cStringFormat.SetTrimming(StringTrimmingEllipsisCharacter);

CString str(_T("Administrator"));
txtPath.AddString(str, -1 ,&fontFamily, fontstyle , 60 /**72/96*/ /* + borderWidthByPx*/ , RectF(0, 0, 1600/*cSize.cx*/ , 104 ),&cStringFormat);

Pen borderPen( Color(0,255,255,255), 2 *2 );
borderPen.SetLineJoin(LineJoinRound);

//g.DrawPath(&borderPen,&txtPath);
g.FillPath(&solidBrush,&txtPath);

//4: 显示:
Graphics gwnd(this->m_hWnd);
gwnd.DrawImage( &bmp, 0,0);

//5:保存为png图片:
CL
4000
SID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
bmp.Save(L"F:\\Mosaic2.png", &pngClsid, NULL);

//CLSID pngClsid;
/*GetEncoderClsid(L"image/bmp", &pngClsid);
bmp.Save(L"F:\\Mosaic2.bmp", &pngClsid, NULL);

GetEncoderClsid(L"image/gif", &pngClsid);
bmp.Save(L"F:\\Mosaic2.gif", &pngClsid, NULL);

GetEncoderClsid(L"image/jpeg", &pngClsid);
bmp.Save(L"F:\\Mosaic2.jpeg", &pngClsid, NULL);*/
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: