[字体加粗&像素控制位图大小]使用ttc或者ttf文件配合freestyle库输出位图

问题描述

使用ttc或者ttf文件配合freestyle库
1、实现字体加粗
2、通过输入像素大小,控制字体位图大小


解决方案

解决1:字体加粗可以通过输出位图,以模拟加粗效果。首先绘制文本的底层,然后再绘制相同的文本,但稍微偏移一些,例如在 x 和/或 y 方向上。这种方法可能不够理想,但可以在某些情况下实现较好的效果。比较麻烦,有实现的朋友可以@我,交流学习下~
然后我在阅读了freestyle.h文件后惊喜发现FT_FaceRec_结构体中有成员style_flags,那不是可以直接设置FT_STYLE_FLAG_BOLD,完美。
结果还是失败了。。。
最后我突发奇想,为什么不引入一个新的_face_bold指针,来专门打开加粗的ttf或者ttc文件。
注:这些文件windows系统中自带,路径 C:\Windows\Fonts
在这里插入图片描述

解决2:
一般情况下,我们指定文本大小都是指定像素大小,但是freestyle中配合像素的函数FT_Set_Pixel_Sizes,在设置之后,存在中文会乱码。所以不得不通过像素转换为固定点大小(以 1/64 像素为单位表示的字符高度)以适配FT_Set_Char_Size函数。
实现代码如下:

#include <ft2build.h>

FT_Face	 _face; 
FT_Face	 _face_bold; 
void LoadTexture(wchar_t c,bool bold, int pixelsize)
{
	auto LoadGraph2Texture = [&](FT_Face& face,bool bold) {	
		
		FT_Error error;
		if (face == NULL)
		{
			if(bold)
				error = FT_New_Face(_ftLibrary,	"./font/msyhbd.ttc", 0,	&face);
			else
				error = FT_New_Face(_ftLibrary, "./font/msyh.ttc", 0, &face);

			if (error == FT_Err_Unknown_File_Format)
			{
				LOG("the font file could be opened and read, but it appears that its font format is unsupported");
				return;
			}
			else if (error)
			{
				LOG("another error code means that the font file could not be opened or read, or that it is broken");
				return;
			}
		}
		
		// 使用FT_Set_Char_Size ,这里使用FT_Set_Pixel_Sizes会导致中文模糊
		HDC hdc = GetDC(NULL); // 获取屏幕设备上下文
		int dpiX = GetDeviceCaps(hdc, LOGPIXELSX); // 获取水平方向的 DPI
		int dpiY = GetDeviceCaps(hdc, LOGPIXELSY); // 获取垂直方向的 DPI
		ReleaseDC(NULL, hdc); // 释放设备上下文

		int pixels = ct.size;
		int pointsX = ((pixels * 64 + dpiX / 2) / dpiX) * 64;
		int pointsY = ((pixels * 64 + dpiY / 2) / dpiY) * 64;

		error = FT_Set_Char_Size(face,pointsX,pointsY,dpiX,dpiY);
		//该方法不成功,好像和字体本身是否带有bold有关系。
		//face|= FT_STYLE_FLAG_BOLD;

		FT_UInt glyph_index = FT_Get_Char_Index(face, c);
		error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
		error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);

		......
	
	};

	if (ct.bold)
		LoadGraph2Texture(_face_bold,true);
	else
		LoadGraph2Texture(_face,false);
	
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值