dvipng 字距调整不当

dvipng 字距调整不当

我正在使用 dvipng 渲染无衬线字体文档,结果特别糟糕。在默认分辨率(100 dpi IIRC)下,存在一些严重的字距调整问题。在这里,我使用两种无衬线字体进行渲染;左侧是带有 的 Helvetica [scaled=0.92],右侧是默认的 CM sans。下面是 CM 衬线字体,由于某种原因,它很模糊。它也有字距调整问题,但由于衬线,乍一看并不明显。

一些事实:

Mediawiki 使用一个用 OCaml 编写的程序texvc来渲染所有方程式。基本上,它通过解析器验证方程式,并创建一个临时 latex 文件。它latex在文件上运行,并使用渲染结果dvidvipng我从未在 Wikipedia 中看到过字距调整不好的方程式,我认为这是因为它们使用默认 CM 衬线以更高的分辨率渲染。

我也尝试过以更高的分辨率进行渲染,字距调整在 120+ dpi 下看起来不错。但是缩小图像不是一个选项,因为它会干扰抗锯齿。我必须确保字距调整在屏幕分辨率下完美无缺,并且不会有任何质量损失。

有什么想法吗?

海尔维提卡 CM-Sans

CM 衬线

梅威瑟:

\documentclass[11pt]{article}

\setlength\paperwidth  {230pt}
\setlength\paperheight  {297mm}
\setlength\textwidth  {\paperwidth}
\setlength\textheight {\paperheight}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{layouts}
\usepackage{calc}
%\usepackage{uarial}
\usepackage[scaled=0.92]{helvet}
%\usepackage{helvet}
%\usepackage{nimbus}
\renewcommand{\familydefault}{\sfdefault}
\nofiles
\raggedright
\begin{document}
Giorgione’nin Fırtına adlı tablosuna baktığımızda 
kompozisyonun sanatsal açıdan bir hayli basit 
olmasına karşın figürlerin özel bir dikkatle 
çizildiğini ve resmin, her yere nüfuz etmiş 
ışık ve hava sayesinde kaynaşıp bir bütün 
oluşturduğunu görüyoruz. Figürlerden bu küçük 
tablonun çoğunu kaplayan manzaraya bakıyoruz, 
sonra tekrar figürlere dönüyoruz. Giorgione, 
kendisinden önce gelenler gibi önce nesneleri 
ve kişileri çizip sonra onları bir mekana 
yerleştirmiyor; doğayı, toprağı, ağaçları, ışığı, 
havayı, bulutları ve kentleriyle insanları bir 
bütün olarak düşünüyor.{\bf Bu parçada anlatılanlara 
göre Giorgione’nin eserini oluştururken güzelliğin 
hangi niteliğini öne çıkardığı söylenebilir?}
\end{document}

我通过以下方式创建 png:

latex myfile.tex
dvipng myfile.dvi

我使用不同的宽度、面等来运行它,每次运行都会出现不可接受的字距调整的情况。

编辑

可能是因为非 ASCII 字符吗?我用 运行了同一个文件,\lipsum结果还不错。可能是因为单词的长度吗?

使用 ASCII 编码进行字距调整:

ASCII

编辑

或许这可能有助于将来参考

答案1

有一篇很长的文章介绍了在低分辨率屏幕上渲染清晰字体所涉及的挑战和权衡:栅格悲剧

似乎dvipng不进行子像素定位(这是一个优势,因为这意味着可以通过仔细提示使单个字形更清晰,就像 freetype 所做的那样,如果您的版本dvipng已将此功能编译到其中)。不幸的是,这意味着字形宽度被限制为整数像素数,这与 TeX 宽度不匹配(我们不想强迫 TeX 使用像素宽度,因为 TeX/DVI 力求与设备无关)。大多数 DVI 处理器处理此问题的方法是允许几个像素的“漂移”在一个单词中累积,然后将此漂移吸收到下一个单词间空间中。如果在一个长单词中积累了太多的漂移,那么为了保持渲染忠实于与设备无关的理想,必须增加/减去一个像素作为两害相权取其轻的举动。例如,检查选项的文档-edvips这解释了为什么您会看到土耳其语文本中较长的单词有问题,但 lipsum 没有问题。

处理该问题的选项如下:

  1. 允许子像素字形定位,并接受字形不会那么清晰。这实际上就是你通过以更高分辨率渲染然后缩小所做的工作。例如,如果你进行 4 倍的线性缩放,那么你就允许字形定位在最终图像的 1/4 像素边界上。(实际上,最好直接在字形光栅化器的帮助下执行此操作,因为这样它至少可以安排水平线清晰(例如,EFLITeH 上的横线),即使垂直线无法做任何事情);或者
  2. 编写一个补丁来dvipng实现一些等效的功能,dvips -e1000 并接受单词间距可能不均匀,并且对齐文本的右边缘可能会分散注意力。

实际上没有其他选择。在屏幕上呈现文本完全是权衡和妥协。操作系统呈现的文本大多看起来不错,因为它不尝试独立于设备的布局,并且可以随意重新排列文本以吸收漂移。但是,如果您查看独立于设备的文本(例如,从您选择的 PostScript 或 PDF 查看器中),您会发现它们都有模糊的字形或不均匀的间距。它们可能看起来比 dvipng 的尝试要好一些,因为它们可以访问子像素字形渲染(显着减少每个字形的漂移)。但是,您不会希望 dvipng 实现子像素渲染,因为您需要对查看者的显示器设置做出假设。

答案2

这是从我的评论中移植过来的。更新:我忘记了一个有用的开关,它可以为输入的每一页生成一个图像。

我根本不是图形方面的专家,但看来幸运的是,我的建议gs -sDEVICE=pnggray -r500 -dDownScaleFactor=5 -o file.png file.ps被发现是有用的。

可以有更完整的开关集(根据 Lev Bishop 的建议进行编辑)

gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pnggray -r500 -dDownScaleFactor=5 -o file%d.png file.ps

附加开关(除了-o指定输出文件的名称之外,还具有使%d原始文件的每一页提供单独的 png 图像的功能)可抑制交互式提示并启用一些安全检查。

此处的命令应用于,file.ps但其工作原理也完全相同file.pdf。在我的工作流程中,我首先将其应用于pdfcrop原始pdf文件,以便将png图像缩小到每页上的实际墨水。

对我们来说,这里最重要的开关是-sDEVICE-r500-dDownScaleFactor=5-r开关只是告诉gs在 内部工作500dpi。然后-dDownScaleFactor=5告诉它智能地减少到100dpi-sDEVICE=pnggray开关告诉gs使用灰色颜色模型生成 PNG 图像。以下是 ghostscript 文档(我的系统上的版本 9.05,TL2012,在 中/usr/local/share/ghostscript/9.05/doc/Devices.htm#PNG)的相关摘录:

Ghostscript 提供了多种 PNG 输出设备,其位深度各不相同。对于正常使用,我们建议使用 png16m 输出 24 位 RGB 颜色,或使用 pnggray 输出灰度。png256、png16 和 pngmono 设备分别提供 8 位颜色、4 位颜色和黑白,以满足特殊需求。pngmonod 设备也是黑白设备,但输出由内部 8 位灰度渲染形成,然后进行误差扩散并转换为 1bpp。

pngalpha 设备是 32 位 RGBA 颜色,透明度表示像素覆盖范围。除非明确填充,否则背景是透明的。PDF 1.4 透明文件不会使用此设备提供透明背景。默认情况下启用文本和图形抗锯齿。选项

pngmonod、png16m 和 pnggray 设备均响应以下内容:

-dDownScaleFactor=integer 这会导致内部渲染在输出之前按给定的(小整数)因子缩小。例如,以下内容将从 300dpi 的内部渲染生成 200dpi 的输出 png:

        gs -sDEVICE=png16m -r600 -dDownScaleFactor=3 -o tiger.png                  examples/tiger.png

Ghostscript 文档中的更多内容:

如何使用 Ghostscript 将 postscript 转换为 PNG 图像文件的示例:

gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -dGraphicsAlphaBits=4 >          -sOutputFile=tiger.png examples/tiger.png

gs -dSAFER -dBATCH -dNOPAUSE -r150 -sDEVICE=pnggray -dTextAlphaBits=4 >          -sOutputFile=doc-%02d.png doc.pdf

从我的记录中,我发现该设备pngmonod似乎不可用,并且该设备pngmono无法与 结合使用-dDownScaleFactor

我选择了内部 500dpi 渲染,因为就我而言,无论是质量还是文件大小,它似乎都能从pdf输入中产生dvipng与类似dvi输入类似的结果。如果它解决了 提到的字距调整问题nrs,那纯粹是意外发现,我对此没有任何好处。

最后需要注意的是,与 不同dvipnggs会在图像中放置png相对于像素绝对大小的信息。这不会改变网络浏览器中的任何内容,因为网络浏览器似乎可以运行该模型1 image pixel=1 screen pixel

编辑:

使用 gs 的结果:

在此处输入图片描述

为了进行比较,结果为:

dvipng -D500 --freetype0 -Q1 dvipng
convert dvipng1.png  -resize 20% dvipng1r.png

在此处输入图片描述

相关内容