DELPHI GDI + TGPFont UnitPixel 问题解决
查不少资料,在
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:=;
origin.Y:=;
GPG:=TGPGraphics.Create(Canvas.Handle); GPG.SetPageUnit(UnitPixel);
fontFamily := TGPFontFamily.Create(Font.Name);
GPfont := TGPFont.Create(fontFamily, Font.Size *DPI/ ,Font.FontStyle,UnitPixel ); //UnitPixel UnitPoint try
GPG.MeasureString(str,-,GPfont,origin,boundingBox);
Result:=boundingBox.Width-length(str)*0.065* DPI/;//取到的宽度均不够,适当减去一个值,不过还是不精确
finally
GPfont.Free;
fontFamily.Free;
GPG.Free;
end;
随手改了下工作中代码,上个取文字宽的完整代码供参考,没测试是否能运行。
DPI 值由 GetDeviceCaps(PrinterHandle, LOGPIXELSX)等相关函数取得,不再列出
DELPHI GDI + TGPFont UnitPixel 问题解决的更多相关文章
- Delphi GDI(一)
Delphi 7下IGDIPlus库的使用 IGDI+是一个免费开源封装微软GDI+功能的Delphi库,该库使得可以用Delphi语言代码快速简短的实现复杂GDI+应用程序. 官方网站:http:/ ...
- Delphi GDI+ Library
GDI+ LibraryThis library enables GDI+ functionality for Delphi 2009 and later. It differs from other ...
- Delphi GDI+ 安装方法
[转]Delphi GDI+ 安装方法转自:万一博客(http://www.cnblogs.com/del/)GDI+ 是 Windows 的一个函数库, 来自 Windows\System32\GD ...
- Delphi GDI+基本用法总结
GDI+以前只是听说过,还没怎么用过,这段时间用了用,觉得挺好用的.在这里总结一下.留个备忘. GDI+(Graphics Device Interface plus)是Windows XP中的一个子 ...
- Delphi+GDI
源:Delphi 初试GDI+学习笔记 Delphi 深入GDI+学习笔记
- Delphi GDI对象之绘制位图
http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579334.html 绘制位图(Drawing Bitmaps) 绘制位图听起来似乎很难, ...
- Delphi GDI对象之绘制文本
转载:http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579185.html 基本绘图操作(Basic Drawing Operations ...
- delphi GDI 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法
delphi 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法 若有更好的,请大神留言我也学习下,感谢! uses WinAPI.GDIPAPI, WinAPI.GDIPOBJ; var Bi ...
- Delphi GDI对象之剪切区域
原文链接: http://www.cnblogs.com/pchmonster/archive/2012/07/05/2577627.html 剪切区域(Clipping Regions) Regio ...
随机推荐
- dubbo负载均衡是如何实现的?
dubbo的负载均衡全部由AbstractLoadBalance的子类来实现 RandomLoadBalance 随机 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀 ...
- 昏睡了8年的我带着第一个微信小程序今年醒了
工作8年之久的我今年算是彻底长进了,以前是知道自己的水平不咋地,但是没什么行动,理由是3年抱2娃,需要照顾孩子. 去年年底偶然一次看技术贴的时候,看到了博客园这个平台,看了很多大牛们的经历,也知道公司 ...
- 直方图均衡基本原理及Python实现
1. 基本原理 通过一个变换,将输入图像的灰度级转换为`均匀分布`,变换后的灰度级的概率密度函数为 $$P_s(s) = \frac{1}{L-1}$$ 直方图均衡的变换为 $$s = T(r) = ...
- java学习-NIO(四)Selector
这一节我们将探索选择器(selectors).选择器提供选择执行已经就绪的任务的能力,这使得多元 I/O 成为可能.就像在第一章中描述的那样,就绪选择和多元执行使得单线程能够有效率地同时管理多个 I/ ...
- cs231n---强化学习
介绍了基于价值函数和基于策略梯度的两种强化学习框架,并介绍了四种强化学习算法:Q-learning,DQN,REINFORCE,Actot-Critic 1 强化学习问题建模 上图中,智能体agent ...
- AutoCAD .NET: 遍历模型空间
原文:http://spiderinnet1.typepad.com/blog/2012/06/autocad-net-iterate-through-model-space.html https:/ ...
- .Net MVC 框架基础知识
一.什么是MVC? MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式. MVC全名是Model View Controlle ...
- 如何彻底禁用 werfalut.exe
在程序中调用 控制台程序 的时候,一旦出现控制台出现 crash 往往会弹出 werfault 窗口, 这样往往会锁死线程,导致程序无法继续运行. 那如何禁止 werfault 窗口的弹出呢? 在 s ...
- OpenStack Telemetry系统架构及实践
1. 概述 早期OpenStack的计量功能由Ceilometer项目负责,后来Ceilometer一分为四,每个项目负责一个方面的工作.不得不说这是OpenStack开发中的一个特色,比如Cinde ...
- 你不知道的JavaScript之作用域
什么是作用域 编译原理 分词/词法分析 这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代 码块被称为词法单元(token) 解析/语法分析 这个过程是将词法单元流(数组)转 ...