转:使用freetype生成字体图片FireMonkey效率问题
时间:2020-04-25
本文章向大家介绍转:使用freetype生成字体图片FireMonkey效率问题,主要包括转:使用freetype生成字体图片FireMonkey效率问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
下面是测试代码,经过优化后主要是重设png图像大小,严重影响速度,一万字可能需要5秒左右,解决方案,自己写一个png文件的解析生成单元,png格式文件还是比较简单的,如果单纯生成一个可调用的字体png图像文档,只需要包含必要的四个区块就可以了,(其实是两个,其他两个一个是固定的头部信息,一个是固定的尾部信息),关于png分析网上文档很多,不做分析,贴出原始FireMonkey的TBitmap测试代码,需要注意的是要使用delphi 10.2版本以上,因为其他低版本TBitmap不支持多线程,再主线程调用也会严重影响界面元素,特别是再手机设备上,就算成功了,图像也会莫名其妙的出现一些污点,不适合生成字体使用........
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.StdCtrls, PXL.Fonts.FreeTypeH, Unit2; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } FTLib: PFT_Library; FFTFace: PFT_Face; public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} uses DateUtils ; procedure TForm1.Button1Click(Sender: TObject); var text:string ; i:Integer ; lvCharUnicode:Integer ; slot:PFT_GlyphSlot ; bitmap : FT_Bitmap; lvBMPBuf: PByteArray; rdb:TBitmapData; s:TAlphaColor; png:TBitmap ; w,h,t,x,y:Integer ; begin text:=Memo1.Text ; if text = '' then begin Exit ; end; Caption:=IntToStr(Length(text)) ; t:=GetTickCount ; png:=TBitmap.Create(1024,1024) ; png.Map(TMapAccess.Write,rdb) ; try if FT_Set_char_size(FFTFace, 0, 64 shl 6, 0,0) <> 0 then begin raise Exception.Create('字体大小设置失败...'); Exit ; end; for I := 1 to Length(text) do begin lvCharUnicode:= ord(text[i]); if FT_Load_Char(FFTFace,lvCharUnicode,FT_LOAD_DEFAULT) <> 0 then begin raise Exception.Create('字体解析失败...'); Exit ; end; if FFTFace.glyphslot.format = FT_GLYPH_FORMAT_OUTLINE then begin if FT_Outline_Embolden(FFTFace.glyphslot.outline,2 shl 6) <> 0 then begin raise Exception.Create('字体加粗失败...'); Exit ; end; end; if FT_Render_Glyph(FFTFace.glyphslot,FT_RENDER_MODE_NORMAL)<>0 then begin raise Exception.Create('生成位图失败...'); Exit ; end; slot:=FFTFace.glyphslot ; bitmap:=slot.bitmap ; lvBMPBuf:= PByteArray(bitmap.buffer); //得到图像数据 w:=bitmap.width ; //字的宽度 h:=bitmap.rows ; //字的高度 if (x=0) or (h=0) then begin Continue ; end; png.Resize(w,h); //重新设置png大小, 这里严重影响速度 for y := 0 to h - 1 do for x := 0 to w - 1 do begin TAlphaColorRec(s).R:=$ff; TAlphaColorRec(s).G:=$ff; TAlphaColorRec(s).B:=$ff; TAlphaColorRec(s).A:=lvBMPBuf[x + w * y]; rdb.SetPixel(x,y,S); end; end; ShowMessage(IntToStr(GetTickCount - t)); finally png.Unmap(rdb); png.Free ; end; end; procedure TForm1.FormCreate(Sender: TObject); begin if not FreeTypeLibraryInitialized then begin raise Exception.Create('加载DLL失败....'); end; if FT_Init_FreeType(FTLib) <> 0 then begin raise Exception.Create('初始化失败'); Exit ; end; if FT_New_Face(FTLib, PAnsiChar(AnsiString(ExtractFilePath(ParamStr(0))+'方正粗雅宋_GBK.TTF')), 0, FFTFace) <> 0 then begin raise Exception.Create('加载字体失败...'); Exit ; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin FT_Done_FreeType(FTLib) ; end; end. ———————————————— 版权声明:本文为CSDN博主「zplovepkk」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/zplovepkk/java/article/details/73733576
版权声明:本文为CSDN博主「zplovepkk」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zplovepkk/java/article/details/73733576
原文地址:https://www.cnblogs.com/timba1322/p/12773911.html
- Hive 中的复合数据结构简介以及一些函数的用法说明
- BloomFilter 简介及在 Hadoop reduce side join 中的应用
- 关于 hadoop reduce 阶段遍历 Iterable 的 2 个“坑”
- Hadoop Mapper 阶段将数据直接从 HDFS 导入 Hbase
- 译文 | 量化投资教程:投资组合优化与R实践
- 浅谈 java 中构建可执行 jar 包的几种方式
- python 日志模块 logging 详解
- 基于堆实现的优先级队列:PriorityQueue 解决 Top K 问题
- explain 深入剖析 MySQL 索引及其性能优化指南
- 图文并茂详解 SQL JOIN
- 自定义 hadoop MapReduce InputFormat 切分输入文件
- Hadoop MapReduce 二次排序原理及其应用
- MySQL Tips【Updating】
- Meltdown、Spectre攻击---CPU乱序执行和预测执行导致的安全问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++核心准则T.140:为所有可能重用的操作命名
- Service三问
- 事件分发机制三问
- C++核心准则T.141:如果你需要只在一个地方使用的简单的函数对象,使用无名的lambda表达式
- 基于DOM的XML文件解析类
- C++核心准则T.143:避免无意中编写非通用代码
- XML文件解析实践(DOM解析)
- golang 多协程的同步方法总结
- C++核心准则T.144:不要特化函数模板
- 三千字带你搞懂XXL-JOB任务调度平台
- Python-科学计算-pandas-14-df按行按列进行转换
- Python实现扫码工具
- C++核心准则T.150:用static_assert检查类和概念的匹配性
- 初学者也能快速写Python脚本啦——通用功能代码分享
- C++核心准则CPL.1:C++比C更好