惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
G
Google Developers Blog
Jina AI
Jina AI
C
Check Point Blog
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
Last Week in AI
Last Week in AI
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
WordPress大学
WordPress大学
博客园 - 聂微东
月光博客
月光博客
博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
大猫的无限游戏
大猫的无限游戏
Microsoft Security Blog
Microsoft Security Blog

博客园 - 周黔

delphi firemonkey 12.3 动态绑定TFDMemTable到TStringGrid delphian firemonkey. android:exported 错误 RAD Studio 12 Delphi 12 实现手机无线wifi调试 (巧用Android Studio 2024 连WIFI) delphi 11 HMACSha512 Android Studio 2024 不需要三方插件,直接wifi 开发调试,真方便 CEF4Delphi(DELPHI Google Chrome 浏览器封装) 折腾 (2)--打开一个网页 CEF4Delphi(DELPHI Google Chrome 浏览器封装) 折腾 (1)--安装 Delphi WINAPI 任意拖动移动控件 DELPHI 调用标准C接口DLL char *value Apache NetBeans IDE 12.3 双击无反应怪事 [转]Regions and Clipping in GDI+ delphi 10.4 JSON 建立数组示例 delphi 10.3实现TNetHTTPClient 异步 POST 另类实现返回附加标记及Unicode 编码与解码 \u - 周黔 小程序开发笔记1 Delphi DLL 消息循环 Synchronize SendMessage PostMessage 用户中心 - 博客园 delphi 跨版本DLL调用嵌入窗体实现 delphi DLL image 动态绘图 句柄处理 delphi 每英寸相素点取值偏差
DELPHI GDI + TGPFont UnitPixel 问题解决
周黔 · 2019-09-09 · via 博客园 - 周黔

查不少资料,在

 GPfont := TGPFont.Create(fontFamily,   Font.Size  , FontStyleRegular,UnitPixel  );

时,显示的字体,并不是按DPI显示,特别是同时在屏幕与打印机显示时,差异更明显

在切换 UnitPoint 能解决该问题,但是又遇到了新的问题,我想绘图后保存到文件,且需要高分辨率时,就over了

重新查看微软官方API时,发现官方API与delphi中的一致,哪说明该问题,应该是有可解决的办法。

先是试着

 GPfont := TGPFont.Create(fontFamily,   Font.Size/72*页面DPI  , FontStyleRegular,UnitPixel  ); 

结果是行不通

于是,我试着用

 GPfont := TGPFont.Create(fontFamily,   Font.Size*页面DPI  , FontStyleRegular,UnitPixel  );

时,发现屏幕显示与打印,均保持一致,就是字特别大。

到此,感觉终于找到方向,于是进一步随便除一个心理比值。

于是,我试着用

 GPfont := TGPFont.Create(fontFamily,   Font.Size*页面DPI/3  , FontStyleRegular,UnitPixel  );

显示的结果,意外的与使用UnitPoint 时相近 保存到高分辨率图片测试,效果满意,比值3是否最佳值,待进一步确认。


function GETTextWidth(FontEx: TFontEx; str: string):Single 
var GPG:TGPGraphics; fontFamily: TGPFontFamily; GPfont: TGPFont; boundingBox: TGPRectF; origin : TGPPointF; begin origin.x:=0; origin.Y:=0; GPG:=TGPGraphics.Create(Canvas.Handle);

GPG.SetPageUnit(UnitPixel);


   fontFamily := TGPFontFamily.Create(Font.Name);
   GPfont := TGPFont.Create(fontFamily, Font.Size *DPI/3 ,Font.FontStyle,UnitPixel ); //UnitPixel  UnitPoint

  try
    GPG.MeasureString(str,-1,GPfont,origin,boundingBox);
    Result:=boundingBox.Width-length(str)*0.065* DPI/72;//取到的宽度均不够,适当减去一个值,不过还是不精确
  finally
   GPfont.Free;
   fontFamily.Free;
   GPG.Free;
  end;

随手改了下工作中代码,上个取文字宽的完整代码供参考,没测试是否能运行。

DPI 值由   GetDeviceCaps(PrinterHandle, LOGPIXELSX)等相关函数取得,不再列出