[福利]国内首篇利用freetype的跨平台truetype字体真正轮廓(非位图)获取(带完整qt工程代码)-秒杀GetGlyphOutline

本文介绍了如何利用freetype库在Qt环境下获取trueType字体的非位图轮廓,详细讲解了字体的基本概念、贝塞尔曲线、freetype的解析步骤,并提供了完整的Qt工程代码示例。
摘要由CSDN通过智能技术生成

前言

最近在做一款激光打标控制的产品,我的思路是将所有的图元矢量化,但是当做到文字矢量化的时候,真是让我想破了脑袋,后来搜索得知了GetGlyphOutline,就是一个WINAPI,众所周知,WINAPI大都需要一个HDC,但是我使用的Qt,这样就出现了几个问题:

  • Qt中的控件有些是直接渲染的,很难直接获取控件句柄-
  • 不跨平台,以后这一块还是要重写
  • VC的各种变量类型写在Qt里面,调试起来真是一团糟

做了些实验以后,发现这种方法实在是缘木求鱼,然后轻易地搜索到了freeType这一款优秀的字体引擎,下面我们就开始对freetype的探索。

所需基本知识点

trueType字体的一些基本概念

  • 字体(font):不同字符图像的集合

  • 字体外观(font face):一个外观对应一个(.ttf)文件,但是一个字体家族可能占用多个字体文件,因为它包括多种外观,比如字体族Arial,它包括两种外观,于是就有 arial.ttf对应Arial Regular外观,ariali.ttf对应Arial Italic外观,我们习惯把Arial Regular也称为一种字体,实际上它只是一种字体外观

  • 字体文件的基本结构:一般里面有一个或多个字符图(charmap),不同的字符图一般标识不同的平台,所以在一种平台上一般只有一种字符图,这个字符图可以宏观简单的理解为一个key-value,key-字符索引一般就是字符对应编码的编码值,value(字符构成)在truetype一般是对其矢量图形的描述,我们只要将字符编码对应的矢量图形描述得到,就可以进行随心所欲的处理了

trueType字体的基本构成

首现说一下字体轮廓,拿我自己解析出来的一个例子来说吧(这是俺的大名:)):
解析出来的源字体
渲染出来的矢量还是不错的!
轮廓线就是字体轮廓中一条条的封闭曲线:
标注轮廓线的元
红色箭头标注的就是字体轮廓线,共有两条;每条轮廓线又由其他直线或曲线组成:

  • 直线
  • 二次Bezier曲线
  • freetype官方说明字体曲线可能包含有(三次Bezier曲线),但经过我的实验以及其他官方资料,truetype字体并不含有三次Bezier曲线

besier曲线定义

由于此处只用到一次贝塞尔(有界直线)和二次贝塞尔曲线
给定点P0、P1,线性bezier曲线只是一条两点之间的直线。这条线由下式给出,且其等同于线性插值。
一次bezier曲线表达式
二次方bezier曲线的路径由给定点P0、P1、P2的函数B(t)追踪:
二次bezier曲线表达式
按照上述插值规则,如果t分割的足够密,就可以得到平滑的曲线

freetype对trueType的解析

解析基本步骤

Created with Raphaël 2.1.2 开始 freetype字体初始化 设置字符编码方式
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值