当前位置: 首页 > news >正文

对程序中使用到的字体进行子集化处理

花了两天时间在原来Python版的换背景程序的基础上现学现用使用QT做了个功能增强版的图片背景处理程序(有了Python程序的基础,在AI的协助下改写成C++的QT框架程序难度还是不太大),不但可以通过指定背景颜色值的范围将指定的颜色透明化处理,还可以选择图片填充原来的背景区域,形成两张图片融合的效果,示例如下:

在编写这个程序的时候,对QT默认的字体很看不上眼,想用霞雾文楷字体。使用下面的代码加载并使用了霞雾文楷字体:

    // 加载资源文件中的字体int fontId = QFontDatabase::addApplicationFont(":/fonts/霞雾文楷.ttf");if (fontId == -1) {qWarning() << "Failed to load font file!";} else {QStringList fontFamilies = QFontDatabase::applicationFontFamilies(fontId);if (!fontFamilies.isEmpty()) {// 设置全局字体QFont font(fontFamilies.at(0), 11); // 字体族名称和大小QApplication::setFont(font);}}

使用Release配置编译完成后生成的可执行程序有9M多,而不使用字体文件的时候只有不到200k!其实,字体文件就有9M多,看来编译程序是将字体文件链接进了最后的可执行程序。

程序中实际使用到的不同文字字符只有161个,为了这161个字符链接一个9M的字体文件实在有点小题大做,完全可以将程序中没有用到的字符从字体文件中删除,再加入程序的资源文件中链接到可执行程序中。这一过程就叫字体文件子集化。从一个字体文件生成程序中用到的字符的子集的步骤如下:

1、提取程序中用到的字符

这一步可以手工进行,也可以写程序完成。不过我喜欢用文本处理软件(Emeditor、Notepad++之类)。考虑到这个背景处理程序中用到的字符基本上集中在构造函数搭建GUI的代码中,而且出现在界面上的字符都被引号包裹,所以,可以将构造函数代码拷贝到Emeditor中,然后使用通配符“[^"]+"([^"]+)"[^\n]+\n”查找,替换为“\1”,就将引号中的文本提取到原来所在行行首了。再用通配符“^\s.+\n”查找,替换为空,那些不包含界面文字的有缩进的代码行就全删除了,如果还有少量漏网之鱼,另编通配符表达式或者手工删除即可,我这里经过QT Creator格式化处理过的代码经过两步替换没用的行已经全部处理完了。部分界面字符我使用了HTML标签赋予格式,用通配符表达式“<[^>]+>”将所有HTML标签替换为空即可,然后将所有换行符(“\n”)替换为空,即取得了程序界面中用到的所有字符。程序中如果还有其他地方使用到了字符,也可参考上面的流程提取出来,例如QMessagebox输出的字符串。

2、字符去重

上一步提取出来的程序中用到的字符肯定有重复的,去重这一步绝对别用人工来做,下面这个Python程序实在太方便了:

orig_str = """
说明     1、本程序适用于背景较为单一且前景与背景对比明显的图片去背景,例如证件照去背景。     2、点击选取前景或选取背景     按钮进入前景或背景选取模式。选取的前景区域不会被删除,选取的背景区域总是会被删除。重新选取前景或背景时会清除此前已标记的前景或背景区域。     3、进入区域选取模式后,必须点击鼠标右键退出区域选取模式才能进行下一步操作。     4、去背景的效果取决于指定的背景颜色信息是否合适。点击查看图片颜色按钮,     将鼠标在图片上移动可查看鼠标位置像素点的颜色信息。在颜色信息查看模式下鼠标点击图片显示区域才能退出该模式并进行下一步操作。     5、点击原始图像按钮,可以在图像显示区显示原始图像并重新处理。     依次点击处理结果按钮和原始图像按钮,可以对比观察处理效果。     6、选取背景后按下delete键可以删除选中的背景。按下R键可以撤销所有操作。载入图片选取前景选取背景查看图片颜色保存结果指定背景颜色信息c_groupRGB模式R(红色)分量:0~2550~255最大值:最小值:G(绿色)分量:0~2550~255最大值:最小值:B(蓝色)分量:0~2550~255最大值:最小值:灰度模式0~2550~255最大值:最小值:灰度:清除背景更换背景原始图像处理结果
"""
unique_chars = ''.join(sorted(set(orig_str), key=orig_str.index))
print(unique_chars)

程序中orig_str就是提取出的程序中用到的字符(保险起见可以将提取的字符中添加上大小写a-z和数字0-9以及一些标点符号),print出来的就是去重后的字符,复制,粘贴到记事本,保存为文本文件,例如uniq_characts.txt。

3、使用FontSubsetGUI完成字体子集化:

我用这个字体文件替换掉原来资源文件中的字体,重新生成的可执行文件从9M多缩小到了300多k。

相关文章:

  • C语言高频面试题——常量指针与指针常量区别
  • 文档处理控件Aspose.Words 教程:在 Word 中删除空白页完整指南
  • 【C++游戏引擎开发】第19篇:Compute Shader实现Tile划分
  • Cursor可视化大屏搭建__0420
  • 软件功能测试和非功能测试有什么区别和联系?
  • 【同济】高等数学6.7.8版答案
  • 1+X: Python程序开发职业技能等级要求(初级)练习资料分享
  • 软件工程师中级考试-上午知识点总结(下)
  • 基于OKR的企业管理数字化实践——以围棋教育机构流程优化为例
  • 【数字图像处理】图像纹理分析
  • 基于STM32的HX711货物称重系统
  • QT文件和文件夹拷贝操作
  • NetApp ONTAP 9 故障磁盘更换操作指南
  • 《零基础入门学习Python》
  • OpenGL shader开发实战学习笔记:第十二章 深入光照
  • Linux指令合集
  • C++ STL:从零开始模拟实现 list 容器
  • ACWing——算法基础课
  • 棉花糖实验新解
  • Linux-scp命令
  • 安徽两位新任地级市政府党组书记亮相
  • 陈颖已任上海黄浦区委常委、统战部部长
  • 【社论】法治是对民营经济最好的促进
  • 新型算法助力听障人士听得更清晰
  • 招商蛇口:一季度营收约204亿元,净利润约4.45亿元
  • 锦江酒店:第一季度营业收入约29.42亿元,境内酒店出租率同比增长