【问题标题】:Windows font renderingWindows 字体渲染
【发布时间】:2012-08-13 18:20:17
【问题描述】:

我正在编写一个应用程序,它将数据流作为输入(来自Redmon)发送到打印机。数据流具有呈现为单色位图的文本,打印机将使用该位图将其打印在纸上。我计划解析这个数据流并理解发送到打印机的文本。我的应用程序会解析来自任何 Windows 应用程序的数据并发送到打印机。

我解析数据流的方式是匹配像素信息(逐字节),如果完全匹配,那么我可以唯一地识别一个字符。为此,我假设所有 Windows 应用程序都使用相同的 Windows 渲染器以像素为单位渲染字体。因此,如果这些应用程序(包括基于 java 的应用程序)使用相同的字体和字体大小来打印它们的文本,我总是会从任何应用程序中为特定字符获取相同的字节序列。这是一个正确的假设还是 Windows 是否为应用程序提供了各种选项来渲染文本以​​进行打印?

还有一个库可以用于使用单色位图数据进行字符识别吗?

注意:我使用的打印机是 ESC/POS 兼容的打印机。这些打印机的打印机驱动程序将要打印的数据作为单色位图发送。

【问题讨论】:

  • 老兄,这行不通。因为一方面,打印机驱动程序不会将位图发送到打印机。他们有自己的语言,便宜的有一种非常专有的语言。选择 XPS 打印机作为您的默认打印机,现在您获得了一个可以轻松阅读的 XPS 文档。
  • @HansPassant:感谢您的回复!!实际上,我正在使用 ESC/POS 打印机驱动程序将要打印的文本作为单色位图发送。如果打印应用程序是记事本/Word/Notepad++,我也能够成功扫描此位图数据。但我想确保所有 Windows 应用程序是否会针对给定的字体和字体大小发送相同的单色位图。

标签: windows fonts rendering


【解决方案1】:

我不熟悉 ESC/POS 打印机,但如果你能保证驱动程序总是将文本呈现为单色位图,那么相同字体和大小的字符相同的可能性非常高,但它们不是 100% .首先,您还需要考虑旋转、缩放和剪切。您需要考虑整个转换矩阵,而不仅仅是字体大小。

我能想到的至少还有两个其他故障点:1) 用透明胶片覆盖的文本和 2) 如果机器安装了具有相同名称的备用字体。例如,可以从许多来源获得像 Helvetica 这样的常见字体,并且它们之间的字符不会相同。第三种可能的故障是应用程序忽略了打印机是单色的并且以彩色或灰度打印的事实。将彩色或灰度转换为单色会为不同的颜色生成不同的位图。

关于OCR软件,Wikipedia有一个很好的OCR SDK对比图。

【讨论】:

  • 谢谢凯莉!!我想我可以通过以下方式避免前两个故障点:1)我认为你的意思是像“水印”这样的东西,对吧?我将运行我的软件的应用程序不会打印任何透明胶片。 2) 我可以将机器设置为使用来自常见来源的字体,例如 Windows 默认字体文件,以防 Helvetica。我不确定第三种情况,我正在尝试查看我将运行我的软件的应用程序是否会为单色打印机或彩色打印机打印。
  • 另外,您能否建议我一些资料来源(书籍、博客等),我可以在其中获得有关打印机窗口上字体渲染如何工作的更多信息?
  • 抱歉,我不知道有关 Windows 字体渲染的任何好的参考资料。简而言之,文本由打印驱动程序呈现。驱动程序可以将文本绘制为位图或使用线条绘制的多边形。现代字体几乎总是绘制为多边形,因为位图的缩放比例很差。但是,驱动程序可以告诉 Windows 它只生成位图文本,这是 ESC/POS 打印机必须执行的操作。渲染位图字体非常简单,相当于从最接近所需大小的字体中选择位图,然后将其传送到设备,如果不完全匹配则对其进行缩放。
  • 感谢凯莉的帮助!!我正在使用一个 Java 应用程序。它似乎使用 Arial 字体进行打印,但它发送的位图与在记事本上使用 Arial 生成的位图不完全匹配(逐个像素)。我怀疑这是由于您提到的第三个失败案例,除非您知道任何其他原因导致 Java 应用程序由于 JVM 生成不同的位图。我提到的应用程序是FloreantPOS,它使用Jasper Viewer 进行打印。你对此有什么想法吗?
  • 这可能是很多事情。它有什么不同?大小一样吗?
猜你喜欢
  • 2013-08-15
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2023-04-06
  • 2014-09-02
  • 2015-02-26
  • 2021-02-06
  • 2014-12-09
相关资源
最近更新 更多