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

透明、半透明原理:看画刷的颜色,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图片:
	CLSID 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);*/
}




  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值