ImageMagick 示例 --
文本到图像处理
索引
创建文本标签或向图像添加文本可能是 ImageMagick 最基本和最常见的操作之一。它也是最简单的操作之一,但也有一些非常花哨的结果。因此,这是一个开始探索 IM 功能的好地方。
如果您还指定了“
您还可以使用“
当然,如果您未为标签设置“
如您所见,通过设置“
您仍然可以通过调整“
当然,如果您未为标签设置“
基本上这意味着上面的“
此标签高 40 像素,文本的未定义点大小已调整以适合该高度,然后未定义的宽度设置为适合绘制的文本。完全符合您的预期。当然,在这种情况下,对于任何“
如您所见,“
IM 的一个重要功能是它可以读取要使用的文本数据来自文件。这是通过在文件名之前添加“at”字符“
请注意,我使用的文件名只是一个“
默认情况下,文本全部左对齐,但是从 IM 版本 6.2.0 开始,“
如果您同时为“
但是请注意,如果文本(高度方面)不适合您使用给定的“
请注意,最后两个示例之间唯一的区别是生成的图像“
您可以从文件或标准输入(来自先前的管道命令)读取要绘制的文本,使用“
如您所见,输入文本中的换行符(从 IM v6.2.5 开始)将被视为段落分隔符。这包括输入文件中的任何最终换行符。当然,“
如您所见,这效果好得多。但是,通常您希望将空行视为段落断行。这意味着您需要删除所有换行符,除了涉及空行的换行符。这是一个特殊的“
有关这些设置的更多详细信息,请参见下面的底色框以及绘图部分中的笔触、笔触宽度。
应该生成一个在 90 dpi 显示器上高度为 1 英寸的标签。在我的显示器上就是这样!您可以测量屏幕上这些图像的高度,以检查显示器的分辨率。由于每英寸的像素数更大,因此绘制的字体在图像的像素数方面也自然更大,从而产生更大的图像。不同的图像程序通常具有不同的默认密度,这可能会导致字体在由不同程序绘制时出现差异,即使在相同的点大小下也是如此。请注意,“
某些字体甚至会远远超出正常的行间距边界,延伸到行距之上或更常见的是之下。手写体字体尤其如此。字体的外观还会受到字体“
如您所见,IM 设法将此字体包含在标签中,而不会截断字体的引导或尾随图形。
出现此问题的原因是字体的“字形”或字符描述在特定字母的字体定义边界之外绘制,使它们能够与字体中的其他字符重叠(通常在上方或下方)。这是字体本身设计和定义方式方面的问题,并非 IM 的错误,尽管 IM 现在以用户的最佳利益处理这些奇怪的情况。在其他情况下,它仍然可能是一个问题,并且由于多行文本交互而无法简单地解决。有关更多信息,请参阅下面的边界框溢出示例,以获得更精确的描述。
但是,很少有人拥有正确设置以处理unicode 字符输入的键盘或编辑器。即使您无法直接键入 unicode 字符,一个简单的解决方案就是从某些现有的 UTF-8 文本文件或网页“复制粘贴”所需的字符。我做到了!如果您想要绘制的 UTF-8 文本已经生成,您可以使用“
我们还可以使用“GNU”的“
在其他系统(如 Mac OSX 和 Windows)上,您可以使用 perl 的“
有关更多信息并查找各种语言和符号的 unicode 字符代码,请参阅Unicode 字符代码图表。unicode 字符不仅可以包含国际字符,而且使用正确的字体,您还可以使用它定义的特殊“符号”集。其中最著名的是“DingBats”符号字体。这种字体已经变得非常普遍,现在已成为标准 Unicode 字体集的一部分。例如,这里我使用我编写的特殊“
需要记住的重要一点是,所有 truetype 字体实际上都是一种特殊的矢量图像格式。字体中有多个图像(每个字符一个)。由于它们是矢量图像,这意味着字体应该允许您“绘制”任何尺寸(比例)的字符、形状或符号,使用“
这里有一些我在各种符号字体中出于某种原因收集的其他有趣符号...
这只是可用内容的一小部分。几乎所有可以想象到的符号、形状或图像的庞大库都可以在 WWW 上供您浏览和下载。
请注意,实际的字距调整值可以是浮点值,甚至可以是负值。有关使用负“
请注意,您不仅可以增加单词之间空格字符的大小,还可以减小默认大小。但是请注意,空格会导致单词重新对齐到像素边界(与上面的字符间字距调整不同),因此空格设置为零的标签的输出仍将不同于根本不包含任何空格的标签。 字符间字距调整和单词间距也会影响 IM 自动将文本字符串调整到特定大小图像的能力的结果。
发生的情况是,通过设置“
为了最佳地利用此设置,您需要能够计算特定字体的正常行距。这就是“
当然,如之前针对字间大小所见,在使用自动点大小处理时,在文本元素之间添加固定数量的像素往往会使文本变小。也就是说,在没有“
使用负行距也可以作为一种粗略的方法来垂直“加粗”一行,只需重复该行,并减去比基线间距多 1 个像素。
当然,如果您确实想要两行而不是仅仅加粗文本,这将不起作用。它也更适合固定宽度的字体。
这些转义字符不仅会影响“
关于转义字符的另一个重要点是,虽然它们用于命令行文本参数。它们在任何时候都不会应用于从文本文件读取的数据(通常使用'
例如,这里我设置并报告了图像的'label'和'comment'元数据,使用两种方法从源文本文件设置这些信息。"
,(没有最后的换行符)。
请注意,IM没有扩展它使用'
如您所见,标签不仅包含输入字符串,还包含由于“
或者使用不会添加额外换行符(除非您专门请求)的内容。
或者您可以使用一个巧妙的 perl 单行命令“丢弃”最后的换行符……
在其他 API 中,您可以通过“管道打开”在将文本提供给 IM 命令之前查找最后的换行符。
是的,以上内容很棘手,但这是由于涉及的一些内部 IM 核心库限制。有关更多详细信息,请参见访问其他图像中的数据。
这是一个类似的“转义转义符”示例,用于“
当然,如前所示,从文件(使用'
换句话说,当从文件读取时,您不必担心转义内容,而只需编写您希望 IM 使用的精确文本即可。
您看到'
此“转义了什么”也是关于处理文件转义符的问题。在 IM v6.3.3 之前,以下操作将产生两行,而不是一行。
由于转义处理的结果在 IM 的 v6.3.3 之前的不同版本之间差异很大,因此我建议脚本测试其转义处理,如果它对程序的正确运行很重要,则调整自身。如果有人想为 IM 脚本创建自动测试,请贡献。或者如果您找到此类测试,请告诉我。
但是,您应该注意,一些之前的 文本属性 将无法与 pango 一起使用,这主要是由于其文本格式化要求。例如,虽然您可以设置“
您甚至可以使用 定义 “
但是请注意,虽然文本可以对齐,但文本格式化仍然会考虑空格和换行符。此外,pango 理解制表符的使用(不像标签和标题)。
但是,使用制表符生成列的效果并不好,因为您无法轻松地在 API 外部定义“制表位”。因此,不建议以这种方式使用制表符,除非作为行和段落的缩进。
“
请注意,大多数数值都乘以 1024,因此上面示例中“
但是,以这种方式处理文本存在一些问题。首先,文本绘制在一个较大的画布上,如果您不想要这些未使用的空间,则需要解决删除这些空间的问题。另一个问题是行不会“自动换行”,如果行太长,则会溢出画布并被截断。最后,对于非常长的文本文件,除非采取一些额外的预防措施,否则会生成多个页面(图像)。另一方面,“
绘制文本时,会创建一个较大的“字母”大小的页面(或使用“
我故意在上面使用了“
在上面的示例中,“
文本底部额外的空间是文本输入中最后一个“换行符”字符的结果,在图像中创建了一个额外的空白行。但正如您所看到的,输入文本的前导和尾随空格被保留了。如果您在上面使用透明背景颜色,则可以将修剪后的图像扁平化,以将未绘制的区域转换为与使用的“下划线颜色”相同的颜色。
上面结果(除了添加的“
请注意,在最后一个示例中,任何过长的文本行(超出页面宽度)都会溢出页面,并且不会“换行”。这将有效地裁剪并破坏行的末尾。此外,如果行数过多,“Postscript/PDF - 预格式化文本和图形输入
以下提供了一种标准的矢量图像处理技术,不仅可以用于“
现在我们可以将其转换为图像,并根据上面“
值“
但我建议谨慎使用这些调整,因为它们可能会使情况变得更糟。
如果您希望背景透明而不是白色,可以指定“
请注意,横幅仍然使用近白色作为其背景颜色,而不是也设置为透明或半透明。这是因为生成的 Postscript 实际上绘制了该背景,替换了页面的默认背景(无论是白色还是透明)。像这样使背景透明将允许您将 Postscript 图像叠加在特定的背景颜色上。使用Alpha 合成方法,您甚至可以将其叠加在特定的背景图像或平铺背景上。由于几乎所有 Postscript 打印机只能使纸张或投影胶片变暗(包括彩色打印机),因此当打印上述内容时,横幅会自动变为半透明。如果您也希望 IM 做同样的事情,就像打印机所做的那样,您可以使用特殊的“
作为最后一个实际示例,请查看我的光线跟踪四面体图像。在多面体研究中可以看到其他类似的图像。背景页面是从用于生成显示的 3D 数学对象的数据生成的。文本数据使用“
您可以让 GhostScript 直接执行此操作。
这样可以避免 IM 生成大型临时文件(出于安全性和管道化图像处理的目的)。因此,直接使用 GhostScript 可以节省大量文件处理和 IO 处理,并且在处理 Postscript 和 PDF 文件时可以显著提高性能。但是,“
然而,要使用它,我们需要生成一个适当大小的背景图像来绘制字体,当绘制一些未知文本时,这可能很棘手。请参阅字体的自动大小调整,了解解决此问题的方法。除了标准文本选项之外,许多额外的选项也会影响“
所有上述选项也可以在“
如果您真的想最大限度地利用“
另请注意,'
“
在此示例中,给出了所有四个注释参数。具体来说,X 轴旋转、Y 轴旋转以及字体在背景图像上的 X 和 Y 位置。另请注意,填充图案(使用“
这可以用于生成倾斜的浓缩标签。例如……
您还可以使用转义字符将有关当前图像的其他信息添加到注释字符串中。例如,让我们使用有关图像大小的信息覆盖内置的“
有关更多信息,请参阅下面的文本参数中的特殊转义字符。有关以各种方式(例如居中在侧面或在右下角旋转)将文本注释到较大图像上的其他示例,请参阅实用文本注释示例。
不幸的是,在猜测画布大小时,我在上面错拼了“
这种方法比尝试猜测最终图像应该有多大要好得多,但是“
可以使用“
上面的反转运算符用于重新排序图像,以便第一个图像成为组合的第三个“蒙版”图像。然后前景(“
正在建设中
特定的字体及其各个字符包含大量信息。这些信息非常有用,尤其是在您希望使用 IM 拼接许多不同字体的文本时。还必须记住,大多数字体都是比例字体,这意味着每个字符都将具有不同的宽度和不同的光标(或原点)的“自然”前进。因此,每个特定的字符“字符串”将以不同的长度呈现(绘制),而与字符串中使用的字符的实际数量无关。例外情况是“固定宽度”字体,例如“
如您所见,您会获得各种信息:从绘制字符串的声明边界(不一定为字符串的实际边界)相对于原点;到在绘制下一个字符串之前“光标”(原点)应前进的量。完整的调试输出(非常冗长,上面未显示)还报告了使用的实际字体文件(两次),因此您也可以使用它来检查您是否使用了正确的字体。
对于基本的字体度量,我们首先使用透明颜色(“
从上面的结果中,我们可以看到,72 点的“
另请注意,分隔行(实际上是基线)的距离应完全由字体的点大小决定,与字体的绘制方式无关。在我们的示例中,由于字体的大小为 72 点,并且点定义为 1/72 英寸,因此基线应相距 1 英寸。在当前输出分辨率(密度)为每英寸 72 像素的情况下,这意味着基线将相距 72 像素。有趣的是,这意味着对于此字体,边界框为 74 像素,字体在正确单倍行距文本的行之间绘制区域有 2 像素的重叠!此外,从上述测量结果中,我们可以看到,以这种字体以这种点大小绘制字符串“
在高度方面,字符在其定义的绘制边界内,其高度从 100 - 43 或 57 像素(紧靠其边界框)到 60 - 57 或仅 3 像素,低于字体的基线。换句话说,此字母在基线下方的绘制区域中没有“下降”部分。由此我们可以看出,“A”从光标前 3 像素(位于 +20,但最终图像位于 +17)到光标位置后 70 - 3 或 67 像素进行绘制。换句话说,此字体在绘制时略宽于其水平边界框。请注意,虽然这为您提供了实际绘制的字符串长度,但这与追加文本时所需的“光标”偏移量不同(由字符串的边界框定义,而不是其绘制长度)。换句话说,文本应使用其边界框而不是其实际绘制长度大小进行追加,就像我们在其他示例中所做的那样。当然,如果您遇到行为非常糟糕的字体,您可能希望检查特定字符串在其边界之外绘制的距离,以便您仍然可以为其提供空间,例如在行尾。
有关更多信息,请参阅文档TrueType 基础知识 (PDF)。这表明即使我上面的一般化也可能并不总是成立,尽管通常情况下是这样。请注意,以上示例只会返回整数像素中的尺寸,而字体使用的所有尺寸都是浮点数。事实上,字体是否甚至从整数像素(光标)起始点绘制,可能取决于应用程序,并影响字体的最终外观。
现在,虽然 IM 命令行并非设计用于“文字处理”,但这并不意味着您不能将其用于此目的。只是比较困难。在这里,我将提供一些混合不同字体和样式的文本的示例,为人们提供一个起点。人们通常想到的最简单的解决方案是将“
但是,如您所见,所有图像都垂直对齐到图像顶部,除非您使用类似的字体,否则看起来不会很好。或者,您可以使用追加对齐技巧将其沿底部对齐。
这样做是在每个标签的顶部添加了一些额外的填充,并在水平追加它们之前将它们全部裁剪到相同的高度。之后,使用简单的“
和之前一样,图像裁剪分两步进行。首先在包含一条垂直蓝线的底图上绘制文本。这样,当我们裁剪文本时,只会裁剪文本图像的宽度,使所有文字保持相同的基线高度。将它们拼接在一起后,我们现在可以通过将其完全透明来移除蓝色的构造线。如果您只是生成黑白图像,更好的方法是提取其中一个非蓝色通道,这样可以确保您真正获取所有构造线。第二次裁剪将裁剪顶部和底部部分,将其缩小到最大的边界框。最后,将图像扁平化到与边界框相同的颜色,从而消除其在构造线条中使用的所有痕迹。如您所见,现在所有文本都已正确对齐基线,无论使用何种字体或字号。当然,在这些示例中,我只使用了黑底白字文本。只要不干扰构造线和用于文本对齐的透明背景,就可以使用其他颜色。使用此技术,您现在可以生成混合字体的文本行,并将它们垂直拼接在一起形成更大的文档。您还可以看到,完成所有这些工作需要大量的工作,这些工作通常由文字处理器和网络浏览器隐藏在用户面前。如果您确实计划执行大量此类操作,我建议您查看我之前提到的替代方案。
在这种情况下,“表单图像”只是一个空白图像,但实际上可以是任何内容。我还将标签的背景颜色设置为“小麦色”,以便填充的区域可见,但您通常会将其设置为无。以上方法不使用临时文件,而是使用 MIFF 格式图像的管道。这是一个使用 图像流格式 的示例,其中单个图像简单地一个接一个地附加到文件或管道中。这只是一个起点。表单字段可以来自某些定义文件,而要填充的文本可以来自数据库或其他数据源。还可以设置其他属性,例如要使用的字体、文本旋转等。您还可以同时包含宽度和高度,或者如果文本应使用 标题 进行换行,则应使用 标签。另请参阅 地图中的图钉,了解此技术的另一个示例,非常类似于上述示例。
基本上,ImageMagick 可以做很多事情,但这并不意味着它是这些事情的最佳工具。对于较大的文档准备工作,最好将其视为更大整体的一部分。上面给出的各种“TeX”工具通常是大多数 Linux 系统的标准安装,并且可以将文本和图像组合成一个统一的整体。更重要的是,它将文本保留为文本,并根据您的指定适当地格式化文本,完成几乎所有文字和页面换行以及与图像排列的繁重工作。但不会用无用的格式化垃圾填充“doc”文件。您可以完全控制,或者可以将其留给它来做出决定。它们提供了一种生成任何类型文档的方法,从简单的页面、新闻稿到完整的书籍。如果您认真对待文档生成,那么这些工具非常值得一看和学习。
Pango(仅限 Linux 和 MacOSX)也提供了一种替代方案。它提供了 ImageMagick 中不可用的许多文本到图像处理功能。例如制表符、对齐方式、边距、页眉等。它甚至具有一种标记语言,允许在文本中间更改字体。
其他解决方案还包括许多文本到 Postscript 转换程序,例如“a2ps”,我在上面 Postscript 处理 中演示了生成 Postscript 文件的示例。它可以转换和格式化许多不同类型的文本文件,包括文字换行、加粗和制表符控制,以及相当不错的页眉、页脚、边框和多页选项。当然,这是通过 Postscript 或 PDF 中间语言进行的间接图像处理。另一种方法是使用 SVG 或 ImageMagick 绘图命令 布局文本,但随后您需要处理布局。有很多工具可以将文本转换为图像,并且大多数工具可以与 ImageMagick 结合使用以对文本图像进行后处理并将其合并到您的图像中。这使得 ImageMagick 可以专注于它最擅长的工作:图像处理。
![]() |
|
|
ImageMagick 中的文本操作符
ImageMagick 提供了许多不同的方法,您可以在图像中绘制文本,突出了图像处理库的多功能性。此页面详细介绍了绘制文本的特定方法和样式。在学习这些示例时,您需要牢记的是,ImageMagick 首先是一个图像转换器和修改器。因此,提供的每种方法都是简单的文本绘制操作符,例如向图像添加标签和版权信息。请参阅 注释图像。所有文本操作符也都理解并使用一组标准的文本处理设置,例如“-font
”、“-pointsize
”等。此外还有“-fill
”颜色设置,以及更复杂的文本绘制的“-strokewidth
”、“-stroke
”和“-undercolor
”颜色。在您实际创建新图像(例如标签和标题)的情况下,还会使用“-background
”颜色设置。最后还有更新的“-kerning
”和“-interword-spacing
”修饰符。ImageMagick 不是一个完整的格式化文本和文档处理器。如果您需要进行大量的文本处理,最好使用一个完整的交互式文字处理器或批处理文本格式化程序,例如“TeX
”(或其变体之一(请参阅下面的 完整的文本处理系统))。然后,可以将这些程序的输出(通常为 Postscript 格式)转换为图像,并由 ImageMagick 进行进一步修改。也就是说,使用合适的工具来完成合适的工作。也就是说,可以进行一些混合字体处理。有关起点,请参阅此页面底部的 创建混合字体样式的行。现在,让我们看一下将文本添加到图像的基本方法。在下一节 (复合字体) 中,我们将了解如何生成一些有趣的字体效果。标签 - 简单文本标签
基本标签
使用“label:
”图像创建字体图像,是在 ImageMagick 中快速绘制字体的更典型方法。最大的优点是它根据当前的“-background
”和“-fill
”颜色设置生成自己的画布,该画布的大小与绘制的文本相匹配。例如,这是一个典型的生成的标签。上面可能是标签最典型的用法,带有字体选择和“-pointsize
”定义结果。但它绝不是生成文本标签最有趣的方法。![]() ![]() |
生成的“label: ”图像也将设置“label ” 图像属性 元数据为相同的字符串。某些文件格式(例如 MIFF 和 PNG)将保存该特定属性,并可在以后的图像处理程序中使用。有关使用“label”元数据的示例,请参阅 使用已保存元数据的蒙太奇 以获取示例。 |
-size
”,则将在该大小下创建生成的标签图像。
|
![]() |
-gravity
”来设置标签在该较大框中的位置。
|
![]() |
-size
”,则生成的“label:
”中将没有额外的空间供“-gravity
”使用,这使得它变得毫无用处。同时使用“-size
”和“-pointsize
”的问题是文本可能会“溢出”指定的图像大小。
|
![]() |
![]() ![]() |
在 6.5.2-4 版本之前,如果也给出了“-size ”设置,则 IM 将完全忽略“-pointsize ”设置。这会导致上面图像中的文本根据“最佳拟合”处理自动调整大小(请参阅下一组示例)。 |
最佳拟合到图像
使用标签生成特定“-size
”图像的最大技巧是不要为标签指定“-pointsize
”。发生这种情况时,IM 将能够尝试选择一个最佳拟合请求的图像大小的字体大小。也就是说,绘制的文本将调整以适合给定的尺寸!
|
![]() |
-size
”设置,您最终可能会在图像右侧或下方获得一些额外的空间。![]() ![]() |
当 IM 创建“最佳拟合”标签时,它使用的实际点大小也会保存到“label:pointsize ” 图像属性 中,允许您稍后使用该信息。这是在 IM v6.6.2-7 中添加的,在论坛讨论 点大小报告 期间添加的。 |
-gravity
”设置来调整标签在该额外空间中的位置。
|
![]() |
-size
”,则生成的“label:
”中将没有额外的空间供“-gravity
”使用,因此只有在您要求图像具有特定大小时才有意义。现在是最好的消息。如果您给出的“-size
”设置仅包含标签的宽度或高度,则字体将调整以最佳拟合该给定尺寸。然后,未指定的另一尺寸将自动调整以适合该文本!
|
![]() |
label:
”将始终为 160 像素宽,并具有该宽度的最大字体大小。然后,标签的高度将调整以适应。如果指定了高度但未指定宽度,则也会执行相同操作。
|
![]() |
-gravity
”设置来说,几乎没有或根本没有额外的空间可以使用。
多行标签
“label:
”生成器(从 IM 版本 6.2.5 开始)可以生成多行标签。
|
![]() |
label:
”将“\n
”理解为表示换行符。这意味着您可能需要预处理输入文本以确保在将数据放在命令行上时转义任何特殊字符。有关更多详细信息,请参阅下面的 文本参数中的特殊转义字符。由于“-gravity
”也影响“label:
”生成(从 IM 版本 6.2.6 开始),因此您可以使用它来“对齐”多行标签。
|
![]() |
@
”并将其用作字符串参数来完成的。例如,这里我们从我的工作站的“每日消息”文件创建了一个标签...您还可以从标准输入管道读取标签的文本。例如,这里我将引号生成器的输出转换为多行标签。
mesgs ImageResolution |\ magick -background lightblue -fill blue \ label:@- label_file_multiline.gif |
![[IM Output]](label_file_multiline.gif)
-
”字符。这意味着该文件将从标准输入读取。请记住,您可以使用“@filename
”将任何命令行字符串参数读入 IM。这包括下面给出的所有其他文本输入方法。但是它只能用于替换整个字符串参数,而不是字符串参数的一部分。另请注意,在上面的示例中,在标签图像中添加了一条额外的空行。此空行是由输入文本文件中的最后一个换行符引起的。除非您以某种方式从输入文件中删除最后一个换行符(请参阅下面的 caption: 示例以了解解决此问题的方法),否则“label:
”将始终从输入文本文件中包含此空行。![]() ![]() |
大多数旧版本的 IM(v6.2.5 之前的版本)无法处理多行标签。在这些版本中,行会被附加在一起,形成一行非常非常长的行。 |
垂直标签
当然,您也可以在输入文本中添加换行符。例如,这里我取一个简单的单词,并在每个字母之间添加一个换行符,以创建一些居中的垂直文本。sed
”命令的用户可以移除“tr
”,并在 sed 命令中将“@
”替换为“\n
”,以便它直接在每个字符之间插入换行符。另请参见特殊属性行间距,该属性可用于调整字符之间的间距。标题 - 自动换行标签
来自文本输入生成器的“caption:
”图像在大多数方面都与“label:
”完全相同,除了它不扩展文本的大小以适合指定的“-size
”设置,而是自动换行任何不适合指定的“-size
”宽度的长行。“-size
”设置不是可选的,并且必须至少指定最大宽度(以像素为单位)。例如,这是一个长行的标题,它不适合指定的宽度。
magick -background lightblue -fill blue -font Corsiva -pointsize 36 \ -size 320x caption:'This is a very long caption line.' \ caption.gif |
![[IM Output]](caption.gif)
![]() ![]() |
生成的“caption: ”图像也将具有“caption ”图像属性元数据“set”设置为相同的字符串,允许您稍后重新使用该信息。所有常见的图像文件格式都将保存此信息以及图像。有关示例,请参见使用保存的元数据进行蒙太奇。 |
caption:
”出于文本对齐目的考虑会尊重“-gravity
”。
magick -background lightblue -fill blue -font Candice -pointsize 40 \ -size 320x -gravity Center caption:'ImageMagick Rules OK!' \ caption_centered.gif |
![[IM Output]](caption_centered.gif)
-size
”设置提供了高度和宽度,则图像高度也将设置为该高度。然后,您还可以使用“-gravity
”设置来垂直定位文本。
magick -background lightblue -fill blue -font Gecko -pointsize 32 \ -size 320x100 -gravity South caption:'Captions at their height!' \ caption_height.gif |
![[IM Output]](caption_height.gif)
-pointsize
”指定的“-size
”,则文本将超出框的范围。当前的“-gravity
”设置将自然决定文本的哪一部分被剪切。例如,这与前面的示例完全相同,但图像“-size
”对于结果来说太小了。
magick -background lightblue -fill blue -font Gecko -pointsize 32 \ -size 320x60 -gravity South caption:'Captions at their height!' \ caption_height_toosmall.gif |
![[IM Output]](caption_height_toosmall.gif)
最佳拟合标题
从 IM v6.3.2 开始,如果您同时提供了最终图像的宽度和高度,但未定义字体“-pointsize
”(或使用“+pointsize
”关闭字体大小),IM 将尝试自动调整字体大小,以便最佳填充您请求的图像“-size
”。例如,这里我要求 ImageMagick 填充一个相当大的区域...
magick -background lightblue -fill blue -font Candice -size 320x140 \ caption:'This text is resized to best fill the space given.' \ caption_filled.gif |
![[IM Output]](caption_filled.gif)
现在是相同字体和文本字符串的更小更薄的区域。
|
![]() |
-size
”。IM 调整了文本和自动换行,以便尝试最佳填充指定的图像大小。这对于将未知的文本片段放入给定空间而不会超出区域边界非常有用。但是,在内部,它等效于多次运行标题,因为 IM 正在搜索要使用的正确字体大小以最佳填充给定空间。换句话说,它通常比您提供要使用的特定“-pointsize
”慢 10 倍或更多。带段落的标题
“caption:
”图像操作符(从 IM v6.2.5 开始)理解“\n
” shell 转义符的使用(因此您需要使用双反斜杠“\\
”来转义反斜杠),表示换行或段落。在此版本之前,单独的段落必须由单独的“caption:
”操作进行处理。
magick -background lightblue -fill blue \ -font Ravie -pointsize 24 -size 360x \ caption:"Here I use caption to wordwrap.\nTwo separate lines." \ caption_multi_line.gif |
![[IM Output]](caption_multi_line.gif)
@
”文件名前缀,就像我们对“label:
”一样。
mesgs FilePrivate |\ magick -background lightblue -fill blue -pointsize 12 \ -size 320x caption:@- caption_file.gif |
![[IM Output]](caption_file.gif)
label:
”不会自动换行,而是保留它们。如果您确实希望将文件视为一个段落,则需要将换行符替换为空格字符,以便您的文本都在一行上。例如,这里我们采用相同的文本,但将换行符替换为空格,然后将单词之间的多个空格替换为单个空格...
mesgs FilePrivate | tr '\012' ' ' | sed 's/ */ /g' |\ magick -background lightblue -fill blue -pointsize 12 \ -size 320x caption:@- caption_one_line.gif |
![[IM Output]](caption_one_line.gif)
sed
”命令,用于将此类文本转换为“caption:
”所需的格式。在这种情况下,文本是“magick
”手册页的第一页。
man magick | col -b | expand | \ sed '/^$/d; :loop y/\n/ /; N; /\n$/! b loop; s/ */ /g; s/^ //' |\ head -n 7 | magick -size 400x caption:@- caption_manual.gif |
![[IM Output]](caption_manual.gif)
![]() ![]() |
标题没有“两端对齐”文本选项。但是pango:文本格式化程序(使用外部库)确实具有该功能,以及更多功能。 |
文本属性
最初影响文本处理的设置包括:“-font
”、“-fill
”、“-pointsize
”、“-size
”和“-gravity
”。我们已经在上面介绍了许多这些属性控件。但是还有一些不常使用的属性控件,最初不影响“label:
”或“caption:
”文本图像生成。从 IM v6.3.2 开始,您还可以使用“-stroke
”、“-strokewidth
”和“-undercolor
”。“label:
”或“caption:
”。例如,这里我使用了许多不同的设置来控制 IM 文本图像渲染的属性...
|
![]() |
![]() ![]() |
目前,您无法在“label: ”或“caption: ”中使用使用“-tile ”、“-fill ”、“-background ”和“-origin ”定义的平铺图像。只能使用纯色。尝试这样做只会产生未定义的(黑色)颜色。 |
点大小、密度和实际字体大小
像素是显示器或图像上的点,这是 IM 的工作原理。另一方面,图像以特定的分辨率打印(指定为“每英寸点数”(dpi)或每英寸像素数(ppi))。因此,图像的分辨率会影响其他程序如何将图像调整到特定介质上。例如:它会影响图像在现实世界中的物理尺寸。图像的分辨率(密度或 dpi)与图像的像素大小以及图像在内存或磁盘中占据的空间量无关。通常,它也与大多数 IM 图像操作无关。因此,对于 ImageMagick 而言,分辨率只是一组与图像一起存储的数字,通常会被忽略。只有在字体以及将 Postscript、PDF、MWF 等矢量格式转换为 IM 处理的光栅图像格式时,图像的分辨率或密度才会变得相关。“-density
”设置告诉 IM 输出设备上每英寸有多少像素(点)(ppi),然后它可以使用它来调整图像生成和字体大小以匹配。例如,默认情况下,IM 使用“-density
”设置为 72 ppi,这是在显示器或网页上显示图像的典型设置。由于字体大小以“点”(使用“-pointsize
”指定)为单位,并且根据定义,1 点等于 1/72 英寸,那么 72 点字体应该生成大小约为 1 英寸高的文本...
|
![]() |
但是,大多数现代显示器的分辨率都高于此,通常在每英寸 90 到 120 个像素(ppi)之间。因此...
|
![]() |
-pointsize
”实际上是指字体的**行间距**(实际上是其绘图区域高度),而不是指绘制字母的实际高度!因此,在相同的点大小和密度下,一种字体可能看起来比另一种字体更大或更小。只有字体的行间距实际上是相同的,其他任何内容都取决于字体和字体的设计者。因此,在默认的“-density
”为 72dpi(其中 1 点 = 1 像素)的情况下,12 点字体在两行文本的基线之间应具有 12 像素的间距。![]() ![]() |
请注意,生成的“label: ”图像的高度基于图像的绘图区域或边界框,这通常是字体的行间距和点大小。情况并非总是如此,因此仅垂直附加文本行实际上是不正确的字体处理!
|
-pointsize
”和“-density
”的影响。将字体的点大小加倍(“-pointsize 24
”)也会产生一个看起来与密度或分辨率加倍的字体大小相同的字体。但是,因为字体被设计成以特定的方式显示,所以字体中线条的粗细在更大的点大小下可能不会有太大变化。也就是说,更大的字体大小略有不同。但如果您只是将密度加倍(“-density 144
”),则 12 点字体将以其尺寸加倍绘制,仍然应该看起来像原始的 12 点字体,只是以更大的比例绘制,并具有更好的边缘平滑效果。但是,在非常低的分辨率下,像素的物理尺寸限制也可能影响字体的外观。这意味着由于密度定义的像素尺寸较大,细线在较低的密度下可能会变粗。'密度'和'点大小'之间的关系是一个非常复杂的问题,只有专业的字体图形设计师才能完全理解并设计他们的字体以正确处理。根据来自 IM 论坛的Lithium...我认为这是 TrueType 字体渲染器的一个特性。TrueType 字形不仅是一组曲线,它可能包含多个细节级别和指令,这些指令根据像素输出大小调整点坐标,在像素尺寸较小的情况下更为明显。因此,小文本看起来与缩小的大文本不同(更清晰,可以注意到)。
未来示例:相同“像素”大小但不同密度和点大小的字体之间的差异。
基本上,在减少另一个因素的同时增加其中一个因素可能不会产生相同的结果。尤其是在字体线条粗细和整体“样式”方面。最好根据您的操作调整正确的因素。在为输出设备缩放字体或稍后调整字体大小时使用“-density
”,并在进行正常的字体大小更改时使用“-pointsize
”。如果您想了解更多关于字体的知识,请查看文档TrueType 基础知识 (PDF),我发现它非常有趣。标签图像边界
在使用某些特殊字体时,字体可能会使用扩展字符,并且在过去,IM 在为这些字体创建标签时遇到了很多麻烦。也就是说,文本超出了提供的画布。例如,这里是在类似于某种著名软饮料的“LokiCola
”字体中的两个大写字母。
|
![]() |
![]() ![]() |
在 IM v6.3.2 之前,“label: ”会截断“H”的引导部分和上述示例中两个字符的尾部部分。 |
Unicode 或 UTF8 格式文本
这种向 IM 提供字符串参数的方法非常重要,因为它允许您执行某些通常从命令行很难执行的操作。特别是处理“unicode 文本”或使用字符代码选择特定字符。现在,如果您可以在命令或脚本中键入 unicode 字符,则可以直接使用它们。
magick -background lightblue -fill blue -pointsize 32 \ label:' é è à ù ç Ö ÿ ‘ ’ “ ” ° ² ³ € x ÷ ' label_i8n.gif |
![[IM Output]](label_i8n.gif)
@filename
”直接从文件中读取它。例如,这里我从一个UTF-8 编码的中文文本文件(文件末尾没有换行符)创建了一个中文标签。
magick -background lightblue -fill blue -pointsize 48 \ -font ZenKaiUni label:@chinese_words.utf8 label_utf8.gif |
![[IM Output]](label_utf8.gif)
![]() ![]() |
上述示例中使用的字体是一种特殊的字体,定义了完整的中文字形集,例如 fedora linux 字体“SimSun ”(或在字体文件中“gkai00mp.ttf ”)、“ZenKaiUni ”(在文件中“ukai.ttf ”)或“ShanHeiSunUni ”(在任何文件中“uming.ttf ”或“zysong.ttf ”或“bsmi00lp.ttf ”)。请注意,windows 字体“ Mincho ”(在后面的示例中使用)也定义了许多中文字形,但并不完整。如果您将其与上述内容一起使用,则对于未定义的字形,您将得到一些问号。特殊的脚本“ imagick_type_gen ”用于查找、提取字体的正确名称,并将字体添加到 ImageMagick“type.xml ”配置文件中。 |
printf
”程序(在 linux 系统上)从 unicode 字符代码生成 UTF-8 字符串,在本例中,是正确的排版开合引号(UTF-8 输入中同样没有最后的换行符)。例如,这里我使用 unicode 字符代码生成 UTF-8 文本,并使用命令管道将其馈送(使用“@-
”从“stdin”读取),而不是从实际文件馈送。
env LC_CTYPE=en_AU.utf8 \ printf "\u2018single\u2019 - \u201Cdouble\u201D" | \ magick -background lightblue -fill blue -pointsize 36 \ label:@- label_quotes.gif |
![[IM Output]](label_quotes.gif)
printf
”从 unicode 字符代码输出 UTF-8 编码的字符字符串。
perl -e 'binmode(STDOUT, ":utf8"); \ print "\x{201C}Unicode \x{2018}\x{263A}\x{2019} Please\x{201D}";' |\ magick -background lightblue -fill blue -pointsize 36 \ label:@- label_unifun.gif |
![[IM Output]](label_unifun.gif)
graphics_utf
”shell 脚本提取“DingBats”unicode 符号区域的前 24 个字符,以生成 UTF-8 文本的“块”。以上问号是 unicode 或 windows“Mincho
”字体中未定义的特定字符。更具体地说,原始“dingbat”字体中的一部分符号存在于 unicode 中,但使用的是另一个 unicode 字符代码,而不是预期的 dingbat 代码。有关更多详细信息,请参阅Dingbats Unicode 规范图表,以及它对用于“缺失”dingbat 字符的正确 unicode 字符的引用。许多字体对于此类未定义的字符不会显示问号,而是会打印一个方块或空白字符。如果在输出中看到太多此类字符或缺失字符,则可能应该使用不同的字体。作为庞大的 unicode 字符字体的一部分,还提供了其他符号集,包括:托尔金符文符号、数学符号、罗马数字、箭头、盲文和技术符号。这是一个庞大的集合,您可以探索它,“graphics_utf
”shell 脚本可以帮助您探索它。这是 Microsoft“Mincho”字体可以呈现的 unicode 字符的另一个示例。在本例中,来自“其他符号”部分...在 DOS 脚本中使用 unicode 比在 UNIX 和 LINUX 下要困难得多。Wolfgang Hugemann 在Windows 字符编码中提供了有关从该环境中使用 unicode 的特殊说明。符号字体
寻找特殊文本图像的人更常使用特殊的“符号字体”。它们比完整的 Unicode 字体小得多,因为它们只用一组不同的特定形状和图像替换正常的标准 ASCII 字符(字母和数字),尽管有时(很少)它们在拉丁元字符区域中也包含更多符号。“DingBat”字体符号最初就是这样开始的,但如上所述,它们现在已成为 Unicode 字符集的一部分。例如,我比较喜欢使用的符号来自“WebDings”字体。它是一个相当不错的“曲线心形”符号,它替换了该字体定义中正常的“Y
”字符...
magick -size 20x20 -gravity center -font WebDings label:Y label_heart_20.gif magick -size 40x40 -gravity center -font WebDings label:Y label_heart_40.gif magick -size 60x60 -gravity center -font WebDings label:Y label_heart_60.gif magick -size 80x80 -gravity center -font WebDings label:Y label_heart_80.gif |
-size
”、“-pointsize
”和“-density
”提供的控件。如您在上面看到的,“曲线心形”几乎可以按照我想要的任何大小“呈现”。有些字体非常专业。例如,您可以从IDAutomation获取名为“IDAutomationHC39M.ttf
”的字体文件,该文件可用于生成条形码。例如...
![]() ![]() ![]() ![]() |
||
|
![]() |
magick -pointsize 48 -font WebDings label:' " _ ~ ) - ' label_webdings.gif magick -pointsize 48 -font LittleGidding label:' x o w ' label_ltgidding.gif magick -pointsize 48 -font WingDings2 label:'ab' label_wingdings2.gif magick -pointsize 48 -font Zymbols label:' ? , - I Z ' label_zymbols.gif magick -pointsize 48 -font TattoEF label:' B Y D I H ' label_tatooef.gif magick -pointsize 48 -font SoundFX label:' V 3 t f 9 ' label_soundfx.gif |
![]() ![]() ![]() ![]() ![]() ![]() |
|
![]() ![]() |
请记住,每个绘制的字符都有两个可以绘制的独立部分:“填充”区域(我在上面显示过)和“描边”或轮廓,它可能看起来与填充区域非常不同。这两个区域可以分别绘制或使用不同的颜色绘制,因此最好以多种方式仔细检查有希望的符号或形状。您可能会得到非常令人惊讶的结果。有关执行此操作的一些示例,请参阅复合字体,描边。 |
![]() ![]() |
许多符号字体的创建者使用简单的扫描仪和位图到矢量转换器生成形状,而没有任何图像或形状的正确设计或清理。查看此类“扫描”字体时,建议谨慎。 上面显示的最后一个字体就是这样一种“扫描”字体的示例,与其他设计更合理的字体相比,它具有外观较差的“点状”质量。 |
字符间字距调整
从 IM v6.4.7-8 开始,您可以使用“-kerning
”在文本字符串中每个字母之间插入额外的字符间空格。例如
|
![]() ![]() ![]() ![]() ![]() |
-kerning
”值的另一个示例,请参阅连接的复合字体示例。词间距
此外,从 IM v 6.4.8-0 开始,选项“-interword-spacing
”可用于修改单词之间使用的空格字符的大小。例如
|
![]() ![]() ![]() ![]() |
|
![]() ![]() ![]() |
-interword-spacing
”,'空格'字符的大小不再随文本大小的其余部分而改变。因此,当 IM 尝试计算最佳“-pointsize
”时,每个单词之间的空格是固定的,因此在将文本拟合到给定的固定宽度中不起作用。结果,"-interword-spacing
"越大,实际需要将文本行拟合到相同指定图像宽度所需的字体就越小。可以使用负值,实际上可以使单词重叠,或使用特定字符和字体产生不寻常的效果。但如果设置得太负,则可能会出现未定义的行为。如果您尝试这样做,建议谨慎操作。虽然以上内容不是文本对齐的示例(尽管看起来像),但您可以将这些选项作为提供正确文本对齐的起点。如果您确实需要这种级别的文本格式和对齐,那么您最好考虑其他生成预格式文本或Postscript的方法,例如基于命令行的“TeX”或“LaTeX”软件。更好的是,您可以使用SVG(rsvg 库版本)或Pango 标记语言(见下文)来生成对齐的文本。行间距
从 IM v6.5.5-8 开始,添加了另一个选项“-interline-spacing
”。这是用户根据之前的设置强烈要求的,并且在很多方面都更有用。基本上,它将在文本的各个行之间添加或减去这么多像素。也就是说,您可以使用它来扩展或压缩文本的各个行。例如……
magick label:'First\nSecond' label_lspace_off.gif magick -interline-spacing 5 label:'First\nSecond' label_lspace_5.gif magick -interline-spacing 10 label:'First\nSecond' label_lspace_10.gif magick -interline-spacing 20 label:'First\nSecond' label_lspace_20.gif magick -interline-spacing -5 label:'First\nSecond' label_lspace-5.gif magick -interline-spacing -10 label:'First\nSecond' label_lspace-10.gif |
![[IM Output]](label_lspace_off.gif)
![[IM Output]](label_lspace_5.gif)
![[IM Output]](label_lspace_10.gif)
![[IM Output]](label_lspace_20.gif)
![[IM Output]](label_lspace-5.gif)
![[IM Output]](label_lspace-10.gif)
-pointsize
”的实际定义,它与当前分辨率或“-density
”设置一起定义了字体的行距。它实际上并没有定义字体的实际高度或行粗细,尽管它会影响特定字体的这些方面。因此,取“-density
”为'72
'点每英寸,并且知道根据定义每英寸有 72 个'点'。您可以计算出 12 点字体将具有 12 像素的行距。有了这些信息,您可以通过使用“-interline-spacing 12
”设置来“双倍行距”您的 12 点文本行。这将在行之间添加 12 个额外的像素。
|
![]() |
-pointsize
”设置的情况下,提供了最终图像“-size
”。
|
![]() |
|
![]() |
文本参数中的特殊转义字符
我们已经在上面介绍了在各种文本参数中使用的特殊转义字符。具体来说,您可以使用反斜杠'\
'转义换行符等特殊字符,或者您可以使用百分号'%
'转义符将额外信息插入字符串中,如图像属性页面中所定义。此外,还有一个特殊的'@
'转义符,如果在行的开头使用,则会将文本参数的其余部分用作文件名,以从指定的文件(或使用'-
'的 STDIN)读取数据。![]() ![]() |
某些系统(如 ubuntu)使用安全策略禁用'@{file}'转义符的使用。键入magick -list policy 以查看系统上存在哪些策略以及它们是从哪里设置的。 |
-format
”(供“magick identify
”(以及“-identify
”和“info:
”)使用),还会影响“label:
”和“caption:
”文本到图像生成器,并控制图像元数据设置选项“-label
”、“-comment
”、“-caption
”。最后,它们也由“-annotate
”使用。![]() ![]() |
虽然反斜杠'\ '由“-draw ”'text '方法使用,但百分号'% '转义符不会使用,因为它会干扰 ImageMagick 的 SVG 图像处理。这是为 IM 版本 6 创建“-annotate ”运算符的原因之一。 |
@
'转义符读取)。这意味着您不必担心为文本文件数据转义'转义符',但也意味着如果您需要将信息插入文本中,则必须在 IM 外部自己处理文件数据。![]() ![]() |
保护输入文本文件免受转义处理在 IM 版本 6.3.3 中最终确定。 |
info.txt
"文件包含字符串
![[IM Text]](info.txt.gif)
|
|
@
'文件读取转义符读取的任何转义字符序列。这很重要,因为这意味着任何时候 IM 从文件读取文本,它永远不会处理该文件中存在的任何特殊字符。
IM 读取文本文件作为纯文本,没有任何转义符
不幸的是,这也包括可能存在于正在读取的文件(或流)中的任何最终换行符!当输入文本末尾有换行符(一种非常常见的做法)时,这可能会导致结果图像中出现额外的“空白”行。例如……
|
![]() |
echo
”命令在末尾添加的换行符而产生的额外空白行。如果您不希望出现最后的换行符,则需要自己将其删除。但是,这可能是一个棘手的问题,具体取决于文本的来源和创建方式,以及您从中运行 IM 的 API。最好的方法是首先尝试不生成最后的换行符。例如,对“echo
”使用'-n
'标志。
|
![]() |
|
![]() |
|
![]() |
用户定义的选项转义
一个主要问题是尝试在某个其他图像中使用来自一个图像的转义信息,例如在生成单独的“label:
”或“caption:
”图像时。这是一个非常困难的问题,目前的解决方案(对于单个图像)是创建一个特殊的“用户选项”,附加到正在处理的图像上。然后,“label:
”、“caption:
”或“-annotate
”可以在需要时将其作为百分比转义序列查找。例如,这里我使用内置的 rose 图像中的信息创建一个全新的标签图像。然后删除该信息源图像,尽管我也可以轻松地将新标签附加到原始图像。
|
![]() |
转义转义字符
如果您必须将字符串作为参数提供给 IM(尤其是在 API 调用中),但又不想让 IM 展开转义符,您可以简单地使用额外的反斜杠'\
'“转义”所有三个转义符。请注意,'@
'仅在它是第一个字符时才需要“转义”,并且为了向后兼容,也可以通过将其加倍来转义百分比转义符。也就是说,'%%
'将生成一个百分比。例如……
|
![]() |
![]() ![]() |
在 IM 版本 6.3.2 之前,您无法使用反斜杠转义初始'@ '以关闭“从文件读取”功能。在这种情况下,转义初始'@ '的唯一方法是从文件读取它。这在 API 中不太实用。 |
-annotate
”……
|
![]() |
@
'转义符)读取文本将始终被视为字面量,没有任何特殊含义。这避免了对文本进行任何预处理的需要,只需注意任何最终换行符。
|
![]() |
旧版 IM 上的转义符
以上定义仅在 IM 版本 6.3.3 中最终确定。在此之前,有时会在某些选项中处理转义符,有时则不会,具体取决于 IM 用户发送的任何请求、问题和投诉。对于“label:
”和“caption:
”的百分比转义符尤其如此,这在一段时间内被认为是“不合理的”。例如,在以下标签图像中是否看到'%c
'在很大程度上取决于版本(至少在 IM v6.3.3 之前)。
|
![]() |
abde
'(应用了百分比转义符)或'ab%cde
'(未应用百分比)取决于您使用的 IM 版本。![]() ![]() |
IM v6.2.4 中,从“label: ”和“caption: ”中删除了百分比转义符,因为它们不合理。但是,它们在 IM v6.3.2 中作为新的' %[fx:...] '构造返回,该构造可以引用任何图像,这使得文本到图像生成器中的百分比转义符再次变得有用。请参见FX 表达式转义符。 |
|
![]() |
Pango - 基本格式化文本
“pango:
” 文本编码器(从 IM v6.7.6-3 版本开始完全可用)的工作方式与 标签 和 标题 编码器非常相似。它在安装了“Pango”的系统上提供了一种有限的文本格式化语言。在 Linux 和 MacOSX 系统上,pango 是标准的,在 Windows 上它是可选的。以下是一个不使用任何特殊 pango 格式的简单示例...
|
![]() |
-background
”颜色,但您无法设置默认填充色或下划线颜色,也无法设置要使用的特定字体。这是因为这些属性可以通过 Pango 标记语言来选择(请参见下文)。建议您使用“-size
”来定义输出图像的宽度和高度限制,pango 会自动将输入文本换行(或对于中文进行字符换行)。
|
![]() |
pango:justify
”让 Pango 正确地“对齐”文本...
|
![]() |
|
![]() |
![]() ![]() |
请注意,虽然上面的“printf ”命令可以使用“\t ”转义符生成制表符,但 IM 不理解这种转义符的使用。但是,它理解字符串中的“\n ”转义序列。 |
Pango 标记语言
然而,pango 的真正强大之处在于“Pango 标记”语言,该语言默认启用。您可以使用“-define pango:markup=false
”关闭 pango 标记,但那样的话您不妨使用 标题。 “Pango 标记”非常类似于 HTML,因为它使用一组隐藏在文本中的“<...>
”标记标签,用于控制文本的格式化方式。以下是一些关于标记语言的指南(不包含 API 相关内容)- Pango 标记语言
- Pango 文本属性标记语言 (来自 Gnome)
- Pango 文本属性标记语言 (来自 GTK)
- Pango 脚本库(示例)
|
![]() |
<span ... >
”标签是 pango 标记中使用的主要标签。它允许您控制包含文本的确切大小、颜色和位置。例如..
|
![[IM Output]](pango_span.gif)
size="49152"
”的值表示文本字号为 48 点。而负的上升值(“rise="-20480"
”)表示将文本位置降低 20 点(或在 72dpi 时降低 20 像素)。但是,除了指定文本的字号外,我还可以使用特殊的字号标签,例如“size="x-large"
”。请参阅下一个示例的源代码。注意上面引号内的引号。标签内的引号是必需的。但是,标签内的换行符和额外的空格不会参与文本的格式化。因此,隐藏标记标签或标记注释“<!-- ... -->
”中的额外换行符非常有用。同样,请参阅下一个示例的源文本。作为 pango 格式化功能的最后一个示例,我在这里使用它来格式化一个预先准备好的文件“pango_test.txt
”。它包含了您可能使用的最常见的 pango 标记标签。将此标记文件与下面的结果图像进行比较。
Pango 注意和问题
- 重力
- 我无法让 pango 选择性地只居中一行文本。您只能通过“
-gravity
”设置来居中所有内容或不居中任何内容。这样做的原因似乎是 pango 旨在为应用程序生成单独的文本标签。也就是说,标题通常与显示文本的主体分开生成。Pango 不是一个完整的文本页面格式化引擎。 - 字体
- Pango 可以在渲染过程中更改字体。对于粗体和斜体文本,它已经可以轻松地做到这一点。但是,字体规范来自 GTK,因此与 ImageMagick 的通用系统有所不同。您可以通过运行“gtk-demo”程序,双击“Pickers”和“Text Widget”来了解更多关于 GTK 中字体的知识。
- 定义
- 有很多特殊的 定义 可用于全局控制 pango 文本格式化的各个方面。这些定义目前列在 伪文件格式 中,但我自己还没有探索所有这些定义。以下是我使用过的一些定义...
-define pango:markup=false
- 关闭标记语言标签。然后,所有标签都将包含在输出中。文本中不允许进行 pango 格式化。这在调试中特别有用,可以让您准确地看到 pango 用于输入的内容。
-define pango:justify=true
- 使文本在图像宽度的范围内对齐。也就是说,在单词之间添加额外的间距,以便文本块的左右边缘对齐。
更多关于 Pango 的信息
要了解 pango 的可能性,请参阅 Pango 脚本库。如果您使用 pango 做了一些有趣的事情,请分享您的成果。您可以通过邮件联系我(页面页脚有我的地址),或在 IM 讨论论坛 上发布。![]() ![]() |
在安装了 pango 的系统上,您还可以使用“pango-view ”命令生成 pango 格式化的图像。但是,它的默认“密度”或“dpi”设置是您的显示器(IM 默认使用 72 dpi),因此可能因主机而异。 |
文本 - 纯文本页面
“text:
”输入格式旨在将纯文本转换为包含每个文本页面一个图像的图像。它是 ImageMagick 的“分页文本”输入操作符。换句话说,它的目的是将较大的预格式化文本文件转换为页面,就像打印机将纯文本打印到单独的纸张上一样。![]() ![]() |
不要将“text: ”文件输入格式与类似的“txt: ”输入格式混淆。后者将首先尝试将文件读取为“IM 像素枚举 ”图像格式。这并不意味着扩展名为“ .txt ”的纯文本文件会失败。事实上,这样的文件可能会按预期进行转换,因为如果未识别出枚举图像,“txt: ”文件格式会自动回退到“text: ”格式。 |
text:
”几乎可以处理任何文本文件,而无需修改生成的最终图像大小或自动换行非常长的行。您也不需要像在命令行上使用文本时那样预处理特殊字符。最后,更重要的是,如果使用固定宽度字体(如 Courier),则包含数据列的带空格的文件仍然会在数据列之间保留空格。基本上,“text:
”会“按原样”处理输入文件。![]() ![]() |
从文件中读取的输入文本数据基本上会直接传递给字体库以绘制 UTF 文本。因此,某些控制字符可能会使用不寻常的“字形”绘制。这包括在撰写本文时“freetype”库处理错误的TAB 和FORMFEED 字符。如果这是一个问题,您可能希望使用过滤器程序(例如“ expand ”)预处理您的文本文件,以将TAB 字符转换为适当数量的空格。 |
-page
”指定的页面大小或类型)在当前分辨率下(使用“-density
”设置)。默认情况下(在 72 dpi 时),大小为“612x792
”像素,对于大多数用途来说都非常大。例如,以下是“magick
”命令的纯文本格式手册直接转换为图像的示例(它很大,因此要查看它,请选择右侧的“页面”图像来查看它)...
|
![]() |
![]() ![]() |
但是,以上手册到图像的转换会生成多个页面(图像),因此我 删除 了第二个及以后的页面,只保留第一个页面,而不是所有页面的 GIF 动画。 我还可以附加一个 读取修饰符“ [0] ”输入文件名,例如“text:-'[0]' ”,以告诉 IM 只读取生成的第一个图像。尽管目前所有页面选择仍然通过生成所有页面并删除不需要的页面来处理。 |
CourierNew
”这种“固定宽度”字体,以保留打印页面中存在的字符间距格式。请注意,此输出与上面标题:的输出有何不同。还可以使用Postscript部分中给出的相同技术来改进此图像的整体外观。如果您只想了解“A5”页面在 100 dpi 下的大小,那么此命令会生成一个此尺寸的空白页面并返回其像素大小。文件名“/dev/null
”是 UNIX 中一个特殊的始终为空的文件。
|
![]() |
修剪文本页面
由于文本绘制在一个较大的画布上,您可能希望删除所有生成的未使用空间。这可以通过使用图像操作“-trim
”、“+repage
”,然后为了使其看起来合理,使用“-border
”重新添加一些边缘空间来完成。当然,您还需要将用作“-bordercolor
”的“-background
”颜色匹配起来。听起来很复杂?其实并不,例如...
echo " Hello Cruel World " |\ magick -background lightblue -fill blue -pointsize 18 \ text:- -trim +repage -bordercolor lightblue -border 3 \ text_trimmed.gif |
![[IM Output]](text_trimmed.gif)
-trim
”用于删除“text:
”页面图像中大量的额外空白。但是,这也会删除行前面的任何前导空格!但是,有一种有趣的技术可以让你将图像“-trim
”缩减到实际绘制到页面上的文本的大小,包括输入中的任何前导和尾随空格。这使用了特殊的“-undercolor
”设置(稍后详细介绍)。
echo " Hello Cruel World " |\ magick -background white -undercolor lightblue -fill blue \ -pointsize 18 text:- -trim +repage \ -bordercolor white -border 3 text_boxed.gif |
![[IM Output]](text_boxed.gif)
echo " Hello Cruel World " |\ magick -background none -undercolor lightblue -fill blue \ -pointsize 18 text:- -trim +repage \ -bordercolor lightblue -border 3 \ -background lightblue -flatten text_box_trimmed.gif |
![[IM Output]](text_box_trimmed.gif)
-border
”)实际上几乎完全等同于 IM 现在使用“label:
”并从以“@
”转义的文件名读取时产生的结果。但是“label:
”以更快、更简洁的方式实现了这一点(通过“freetype
”库而不是 Postscript 转换)。您可以指定更小的“-page
”尺寸,可以是像素(参见下一个示例),也可以使用媒体页面尺寸(例如“A5
”),使用“-density
”或像素分辨率设置。您还可以指定在页面上开始绘制文本的偏移量,相对于左上角。例如……
echo "This is a long line that shows that 'text:' does not word wrap." |\ magick -background lightblue -pointsize 18 \ -fill blue -page 320x95+50+10 text:-'[0]' +repage text_page.gif |
![[IM Output]](text_page.gif)
![]() ![]() |
几乎所有其他图像创建操作符都使用“-page ”设置来设置更大的虚拟“画布”和图像在该画布上的“偏移量”,通常用于分层图像或生成动画。因此,在任何“text: ”或“ps: ”操作之后,最好使用“+page ”重置页面设置,否则您在同一命令行中稍后读取的任何辅助图像可能会得到意外的结果。这也是我在上面示例中添加“ +repage ”操作符的原因,否则文本会偏移,生成的图像也会偏移!有关使用此偏移量的更多详细信息,请参阅页面图像属性。 |
text:
”将生成多个页面,从而生成多个图像,每个页面由文本文件的 Postscript 转换生成一个。如果您只对第一个文本页面感兴趣,或者只是想避免出现多个图像的可能性,请在“text:
”文件名中添加“[0]
”,告诉 IM 只读取文本转换为图像之后生成的第一个页面(参见前面的示例)。 Postscript/PDF - 预格式化文本和图形输入
(或其他矢量图像格式)
以下提供了一种标准的矢量图像处理技术,不仅可以用于“PS:
”(Postscript)图像,还可以用于所有使用矢量图形处理的其他图像。这包括图像格式,例如:“PDF:
”(便携式文档格式),“TEXT:
”(分页纯文本),甚至“SVG:
”(可缩放矢量图形)和“WMF:
”。此方法可以扩展,让您可以非常精细地控制文本作为图像的显示方式。例如,使用正确的“文本到 Postscript”过滤器,您可以控制文字换行、对齐方式、多种字体处理、加粗、边框、标题、文件名、日期和其他修饰内容。但是,由于本节内容是关于文本到图像的,这意味着您需要先将文本转换为格式化的 Postscript 文件。有很多外部程序可以用来做到这一点。例如,“a2ps
”、“enscript
”或“pstext
”。本质上,您可以使用文字处理器(如“OpenOffice
”或“Word
”,甚至“Notepad
”),或者如果您需要一个批处理文本处理系统,您可以使用“TeX
”和“LaTeX
”来生成您的预格式化文本(参见下面的完整的文本处理系统)。这些程序都设计用于处理混合普通文本、粗体、不同大小和字体的复杂性,以及文字换行、对齐和段落控制。然后,可以将这些程序的输出传递给 IM,将其转换为您所需的尺寸和质量的图像。因此,让我们首先生成一些 Postscript(从个人财富程序转换文本)。
|
![]() |
text:
”示例中的说明裁剪结果,以删除默认页面/画布生成的额外空白区域。请注意使用“[0]
”将输入限制为仅第一页。如果您的 Postscript 图像生成多个页面,它仍然会被“ghostscript
”委托完全处理,但 IM 仅读取返回的第一个图像,而不是生成多个图像,每个页面一个图像。如果您的 Postscript 文件非常大,您可能希望使用其他 Postscript 实用程序来限制页面数量,然后再使用 IM 和“ghostscript
”进行处理。正如您所看到的,转换为默认“-density
”72 dpi 的 Postscript 通常看起来并不像预期的那样好,只有最少的抗锯齿效果。在处理 Postscript 字体时尤其如此,因为这些字体并非设计为在这些低分辨率下工作。为了改进这一点,您可以使用超级采样技术来生成更好的图像。在这种情况下,您要求“ghostscript
”以更高的分辨率绘制页面(或图像“-density
”)。然后,您可以“-resample
”(一种专门的调整大小)将此较大的图像缩小回更“正常”的屏幕分辨率密度。
magick -density 196 ps_version.ps'[0]' -resample 72 \ -trim +repage -bordercolor white -border 3 ps_version.gif |
![[IM Output]](ps_version.gif)
196
”是最终 72 dpi 的 3 倍,这意味着当使用“-resample
”时,大约 3×3 个像素合并到每个像素中。这会在文本边缘产生更好的抗锯齿像素,从而改善最终结果的外观。另请注意,使用更大的密度或分辨率与仅放大字体并不完全相同。字体定义可能包含用于处理低分辨率情况的调整。例如,比较两个图像中字母“e
”的孔。原始版本更清晰,因为字体内部进行了特殊处理,尽管总体而言,后来的超级采样版本更清晰。有关更多信息,请参见下面的分辨率、点大小和实际字体大小。您不必使用上面的值,因为有时稍微不同的值可能会产生更好或更理想的结果。当然,让“ghostscript
”生成大 2 倍、3 倍甚至 4 倍的图像也意味着 IM 生成图像的时间将增加 4 倍、9 倍或 16 倍!它还会使用更多的内存和临时磁盘空间!但是结果通常是值得的。最好的办法是针对您自己的文档进行尝试,看看哪种方法能为您提供最佳结果。此外,如果您需要更多抗锯齿效果,而不是使用更大的输入分辨率,您可以尝试在减小图像尺寸之前对其进行亚像素模糊(例如“-blur 0x0.7
”)。我有时还发现,在调整大小后进行少量锐化(一种常见的 Photoshop 技术)可以改善最终结果的整体效果。
magick -density 196 ps_version.ps'[0]' \ -blur 0x0.7 -resample 72 -unsharp 0x0.7 \ -trim +repage -bordercolor white -border 3 ps_unsharp.gif |
![[IM Output]](ps_unsharp.gif)
如果您希望背景透明而不是白色,可以指定“
-channel
”设置为“RGBA
”,以在图像中包含 Alpha 通道。当然,您需要使用可以处理半透明颜色的图像格式。
magick -channel RGBA -density 196 ps_version.ps'[0]' -resample 72 \ -trim +repage -bordercolor none -border 3 ps_transparent.png |
![[IM Output]](ps_transparent.png)
Multiply
”Alpha 合成,将“白色背景”图像叠加在所需的“纸张”背景上。如果您有彩色 Postscript 图像,您还可以通过使用特殊的“BumpMap
”合成方法模拟纯黑白打印机在彩色纸张上的效果。这将在使用 Multiply 合成图像之前将源叠加图像转换为灰度。您还可以生成投影胶片幻灯片的灰度图像等效项。这基本上使用不透明的白色背景图像(来自上面)作为“蒙版”,使用Alpha 形状操作符设置形状透明图像。与上面的“text:
”转换器类似,“ps:
”转换器也利用“-page
”设置来设置绘制页面的图像“媒体”的画布大小。尽管提供的偏移量将被忽略。但是,由于大多数 Postscript 文件在内部定义了绘图媒体大小,因此通常不需要这样做。![]() ![]() |
大多数其他图像创建操作符都使用“-page ”设置来设置“虚拟画布”以及该虚拟画布上的偏移量(例如,生成 GIF 动画)。因此,在使用“text: ”或“ps: ”图像读取操作之后,最好使用“+page ”将其重置,否则您在后面的图像中可能会得到意外的结果。有关使用此偏移量的更多详细信息,请参阅页面图像属性。 |
a2ps
”进行转换,然后使用 IM 将其转换为图像。在此图像上,添加了相同数学对象的预先准备好的线条图。然后将此最终图像(以“targa”或 TGA 格式保存)传递给“PovRay
”光线跟踪器,以包含在最终图像或光线跟踪场景中。直接使用 GhostScript
虽然这并非严格意义上的 IM,但Richard Bollinger 报道称,直接运行“ghostscript
”委托效率更高,由于 IM 的文件处理减少,处理速度提高了一个数量级。例如,而不是运行……
magick -density 300x300 -compress Group4 file.ps file.tif |
gs -dBATCH -dNOPAUSE -sDEVICE=tiffg4 -r300x300 \ -sOutputFile=file.tif file.ps |
ghostscript
”无法调整图像大小(除了调整输出密度或分辨率),并且可能无法以您所需的图像文件格式或质量输出图像。但是,您始终可以将 GhostScript 输出馈送到 ImageMagick 以完成任务。也就是说,如果您想对结果进行超级采样(更高分辨率的输入,调整大小为更小的输出),尤其如此。GhostScript 可能是一个难以弄清楚如何使用或修复特定类型 Postscript 的程序。Cristy 不断代表 IM 用户解决这些问题,在这方面他付出了巨大的努力。不幸的是,在处理可能发生(并且确实发生)的许多事情时,IM 无法为通过 GhostScript 处理 Postscript/PDF 提供简化的方法。
Draw - 在现有画布上绘制文本
通过使用低级“-draw
”操作符绘制字体,我们获得了更多控制权,尤其是在字体的确切位置和绘制到其中的图像大小方面。
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \ -fill blue -draw "text 25,65 'Anthony'" text_draw.gif |
![[IM Output]](text_draw.gif)
-draw
”如何在图像上实际绘制文本。您不仅可以指定“-fill
”颜色,还可以指定“-undercolor
”,以及边缘或“-stroke
”颜色,这两者默认情况下都关闭(设置为颜色'none
')。“-fill
”颜色也可以被“-tile
”图像图案替换,而描边宽度可以使用“-strokewidth
”更改。然后,可以使用“-gravity
”设置更改绘制文本的相对位置。例如,这里我使用了刚才提到的许多额外功能。
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \ -tile bg.gif -undercolor dodgerblue -stroke navy -strokewidth 2 \ -gravity center -draw "text 0,0 'Anthony'" text_options.gif |
![[IM Output]](text_options.gif)
![]() ![]() |
从 IM 6.2.4 版本开始,“-draw text”操作不再理解将'\n '作为换行符的使用,也不理解百分号'% '图像信息转义的使用。(请参阅绘制百分号错误)。然而,这些功能和问题在新的 IM v6 运算符“ -annotate ”中仍然可用。请参阅下面的注释文本绘制运算符。 |
-draw
”(MVG - 魔力矢量图形)字符串中使用。但是,如果在绘制参数中设置了上述选项,则该选项仅适用于该特定的绘制 MVG 字符串。最重要的是,绘制 MVG 格式可以做更多的事情,例如文本旋转和字体“装饰”,当然您还可以绘制各种形状,例如圆形到图像上。例如,这里我们在几个背景圆圈上绘制带下划线和旋转的文本。
magick -size 320x120 xc:lightblue \ -draw "fill tomato circle 250,30 310,30 \ fill limegreen circle 55,75 15,80 \ font Candice font-size 72 decorate UnderLine \ fill dodgerblue stroke navy stroke-width 2 \ translate 10,110 rotate -15 text 0,0 ' Anthony '" \ draw_mvg.gif |
![[IM Output]](draw_mvg.gif)
-draw
”来创建您的图像,我建议您查看绘制示例页面。底色框
如上所示,以及稍后在下面演示的“-undercolor
”颜色设置将为该字符和字体的定义绘制区域着色。通常它只是适合绘制的字符。对于绘制字体的左右边缘尤其如此,因为上下边缘通常足够大以容纳所有字符。绘制区域基本上表示围绕绘制字体的区域的字符“单元格”边界。使用“-undercolor
”选项的主要用途是作为一种简单快捷的方法来清除文本周围的“噪声”背景。例如,请查看在顶部图像上进行注释。但是建议您在这种情况下在绘制的字符串的开头和结尾添加额外的空格字符。边界框溢出
在绘制文本或一般处理字体时,您可能会遇到最大的问题之一是,并非所有字体都遵循正常规则。字体设计师可以在相对于当前文本位置(称为插入点)的任何位置“绘制”单个字符(或“字形”)。字体位置甚至不必向前移动,在某些国际字体中甚至可以向后移动!这种设计自由的结果是,某些“字形”不适合字体声明字符适合的定义绘制区域,尤其是在倾斜或手写体字体中,某些字母的部分会延伸到边界之外,并进入后来(或先前)字符使用的区域。我见过的这方面最糟糕的字体是'LokiCola
'字体,它绘制了大约一半的大写字母,带有长长的波浪形尾巴,远远超出了单个字符单元格的边界。该字体基本上假设每个大写字母后面都会跟着 3 个或更多的小写字母。为了展示这一点,我将分别绘制该字体的一些大写字母,让您了解字母可以扩展到单元格“底色”或绘制边界的范围之外。我还使用其中几个来构成字体的名称,以便您可以看到它们的设计使用方式,以及为什么它们会超出其边界框。
magick -size 500x200 xc:lightblue \ -font LokiCola -pointsize 72 -undercolor dodgerblue \ -draw "text 15,65 'L'" -draw "text 130,65 'C'" \ -draw "text 245,65 '1'" -draw "text 360,65 'H'" \ -gravity South -draw "text 0,10 'Loki Cola'" draw_undercolor.gif |
![[IM Output]](draw_undercolor.gif)
H
'实际上在其绘制区域的左侧和右侧都溢出了。这可能使其难以在行的开头使用。![]() ![]() |
请记住,此问题不是 IM 中的错误,而是由 IM 使用的字体库与字体本身内的设置之间的交互引起的,通常是字体设计师有意为之。IM 只是按字体中编程的方式使用结果,这并不总是产生用户预期的结果。因此,在使用不寻常的字体时应谨慎。 |
注释 - 文本绘制运算符
使用 IM 版本 6,提供了一个新的字体绘制运算符“-annotate
”。在很多方面,此运算符比使用“-draw
text”操作简单得多,但由于它使用了'annotate()
' API(应用程序编程接口),因此也更强大。虽然该运算符确实使用了“-draw
”基元,但它以更复杂的方式这样做,例如扩展特殊的转义字符以添加额外的图像信息甚至多行,并对绘制的文本应用坐标系变换以产生倾斜和旋转。因此,该运算符现在是所有 ImageMagick 文本绘制和图像注释的首选文本绘制运算符,这些示例页面现在也反映了这一点。这是一个使用此运算符的基本示例。
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \ -fill blue -annotate +25+70 'Anthony' annotate.gif |
![[IM Output]](annotate.gif)
-annotate
”运算符的额外功能之一是,它可以完全独立地旋转绘制文本的 X 轴和 Y 轴。这是通过在运算符的参数中提供每个轴旋转的角度作为“图像大小”来完成的。为了展示单个“-annotate
”操作可以多么复杂,这里有一个带边框、描边和倾斜的图像……
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \ -tile bg.gif -undercolor dodgerblue -stroke navy -strokewidth 2 \ -annotate 0x20+20+67 'Anthony' annotate_opts.gif |
![[IM Output]](annotate_opts.gif)
-tile
”设置)也与字体一起倾斜。也就是说,因为它使用剪切/旋转的坐标系绘制,该坐标系也剪切并填充绘制文本内的平铺图案。此剪切功能的进一步示例是剪切阴影字体示例。将其与使用等效“-draw
”MVG 字符串创建的倾斜字体进行比较。有关“-annotate
”剪切操作效果的总结表,请参阅注释参数用法。例如,这里有一些略微旋转的文本……
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \ -annotate 350x350+20+90 'Anthony' annotate_rotated.gif |
![[IM Output]](annotate_rotated.gif)
![]() ![]() |
请注意,为了让 IM 正确理解,“-annotate ”给定的角度必须为正。例外情况是如果使用逗号分隔的 4 个数字形式的几何参数。例如“-annotate '-10,-10,20,90' 'Anthony' ”,可以在上一个示例中使用。 |
|
![]() |
rose:
”图像。为了将文本居中在图像上,我们使用“-gravity
”设置,并通过使用'0
'的“-annotate
”参数关闭任何和所有旋转和偏移。
|
![]() |
自动调整大小的注释文本画布
通常,您需要的控制比“label:
”所能提供的要多得多。例如,您想使用平铺或渐变图像,这需要您注释文本。不幸的是,您随后需要预先知道注释文本所需的画布大小。这是一个典型的问题示例。当我第一次设置此命令时,我将大小设置为我想要的结果,起初效果非常好。但后来我得到了这个……
magick -size 480x80 gradient:yellow-green \ -font ArialBkI -pointsize 70 -tile gradient:blue-red \ -annotate +10+65 'Gradient Fun' funfont_gradients.jpg |
![[IM Output]](funfont_gradients.jpg)
Gradient
”一词(缺少字母'i
')。当然,当我修复拼写错误后,我的图像大小现在错误了,产生了上面显示的错误结果。我们需要能够使用“-annotate
”运算符,但画布大小要适合注释文本。一种解决方案是使用更大的画布,然后“裁剪
”背景到正确的大小。我还添加了一个“边框
”以在字体和图像的最终边缘周围添加一些额外的空间,以获得更好的外观。
magick -size 800x120 xc:black -font Corsiva -pointsize 100 \ -tile tile_disks.jpg -annotate +20+80 'Psychedelic!' \ -trim +repage -bordercolor black -border 10 funfont_groovy.jpg |
![[IM Output]](funfont_groovy.jpg)
画布裁剪
”不会裁剪平铺的多色背景。更好的解决方案是使用“label:
”创建画布,以生成正确大小的画布。然后使用绘制颜色填充在画布(和标签文本)上平铺图像,最后我们使用另一个平铺图像注释我们的文本。
magick -font Ravie -pointsize 72 label:'Get Wet!' -border 10 \ -tile tile_aqua.jpg -draw "color 0,0 reset" \ -tile tile_water.jpg -gravity center -annotate +0+0 'Get Wet!' \ autosize_wet.jpg |
![[IM Output]](autosize_wet.jpg)
![]() ![]() |
请注意,居中的“label: ”图像中文本的位置可能与居中的“-annotate ”操作的位置不完全匹配。这两种方法遵循完全不同的处理算法,因此可能不匹配。尤其是在涉及不寻常的字体时。 |
使用“底色框”自动调整大小
您可以不用“label:
”图像,而是使用底色框和较大的描边宽度在大型画布上绘制字体,然后再裁剪画布以使其适合。例如
magick -size 500x100 xc:lightblue -font SheerBeauty -pointsize 72 \ -gravity center -undercolor white -stroke none -strokewidth 3 \ -annotate +0+0 ' Invitation ' -trim +repage -shave 1x1 \ invitation_box.jpg |
![[IM Output]](invitation_box.jpg)
-strokewidth
”设置调整字体周围的空间量。唯一重要的要求是初始画布的颜色与背景颜色不同(在本例中为'lightblue
'),并且大于最终结果。提醒一句,某些字体会在单个字符绘制区域之外绘制字符。(例如,请参阅上面的底色框)。在这种情况下,上述结果将有效,但可能需要您使用透明画布,然后将结果叠加在白色上(例如,使用“-background white -flatten
”之类的操作),以将未使用的且仍然透明的区域变为白色。但是,该字符可能会接触到结果图像的边缘。基本上,在所有情况下,您都无法真正获胜,只需尽力而为即可。
为灰度文本图像着色
我特意将上面的图像生成为灰度黑白图像,因为它可以用作蒙版模板。从这样的纯图像中,您可以分别或同时为图像着色背景和前景。例如,这里我使用按颜色级别运算符,“+level-color
”,全局修改图像颜色,以便为前景和背景颜色分配特定的值。例如,这里我使用合成蒙版用图案图像替换背景和前景。
|
![[IM Output]](invitation_rose.jpg)
plasma:
”)图像成为第一个,背景位于中间。有关此类灰度图像着色的其他技术,请参阅使用蒙版限制合成区域。更一般地,请参阅使用蒙版与图像。有关生成平铺渐变的其他方法,请参阅颜色渐变、稀疏颜色点和随机画布。字体


As for ordering the font paths, that is simply ordering the fonts specified in the XML files. The start point is the system fonts, followed by the system installed "type.xml" file, on my system this is "/etc/ImageMagick-6/type.xml". This system installed "type.xml" file is typically just a list of 'include' other type-* files. And the order of the includes will specify the order of Extra System Fonts, verses Ghostscript Fonts. After that file other "type.xml" files are looked for, such as in 'home' directories, or even current directory. Later fonts will NOT replace earlier fonts, as such if two fonts have that same name, only the first one will be noted by IM. (a security measure). To see the fonts loaded use magick -list font It lists "Path:" of the type file each font list was found in, but the paths are listed in REVERSE order, with system fonts at the end. I have for example a personal Font named "Courier", but it is not listed in the above list as it was defined after the "Courier" that was found in the "System Fonts" area, (which is listed at the end of the above output). On the other hand my own personal font "CourierNew", is listed, as it does not clash with any system or system config defined font. To see what font glyph file is selected for soem specific request use... magick -debug annotate xc: -font Courier \ -annotate 0 'Test' null: 2>&1 | grep '^ *Font '
确定字体度量,无需使用 API
![[示意图]](../img_diagrams/glyph_metrics.gif)
Courier
”、“Typewriter
”或“Terminal
”字体,其中所有字符都具有相同的宽度,允许您轻松生成文本列。调试设置“-debug annotate
”可用于使 IM 直接报告特定字符串的 TTF 字体的度量。例如……
|
![]() |
![]() ![]() |
“-debug annotate ”方法已添加到 IM v6.3.9-2 中。 |
较旧的技术
但是,此调试输出可能不方便,或者您可能需要处理比此版本更旧的 IM。以下是较旧的示例,其中文本实际上以各种方式和颜色绘制,然后从生成的图像中提取信息(作为整数)。例如,让我们找出相对于固定基线以 72 点绘制的“Ravie
”字体的尺寸。这是我们将要研究的图像,作为参考。您实际上不需要将其绘制并保存为图像,因为我们只提取数据,而不是图像。此图像的颜色将被修改,以便我们可以使用“-trim ”分别查看白色和黑色部分以提取使用的度量。
|
![]() |
None
”)绘制字体本身,以便我们可以测量并找到此特定字符的此字体的边界框或绘制区域的大小和位置。请注意,对于高度信息,您可以绘制任何内容。
|
![]() |
Ravie
”字体将具有 74 像素的总边界框高度。框的顶部距图像顶部的距离为 42 像素,因为基线位于 100 像素的 y 坐标处,框的起始位置为 100 - 42 或 58 像素,高于基线。这为基线下方的下降部分的边界框留下了 74 - 58 或 16 像素。![]() ![]() |
请注意,并非所有字体都将其绘制限制在其定义的绘制边界框内!但是,某些字母可能会远远超出这些边界。也就是说,为什么上面的示例设置“-fill ”颜色为“none ”。这样,行为不佳的字体就不会影响上述测量。 |
A
”时,下一个字符应绘制在起始点(称为光标)右侧 66 像素处。这是字符串的“逻辑”长度。也就是说,下一个字符的“光标”或起始点应从 20 + 66 开始,或在“+86+100
”(基线在垂直方向上不发生变化)处开始。请注意,某些阿拉伯字体实际上可以从右到左绘制,因此“光标”偏移量将为负。这为我们提供了字符“A”的字体度量,但绘制的“A”相对于“光标”或起始点的物理尺寸呢?好吧,只需交换两个颜色设置……
|
![]() |
![]() ![]() |
从字体中提取的尺寸也将随用于绘制字体的当前“-strokewidth ”而变化。如果增加轮廓笔划的大小,则绘制字体所需的尺寸(和边界框大小)也会扩展相同的量以适应更粗的轮廓。 |
![]() ![]() |
尺寸也因操作系统(类型和版本)以及 IM 在该系统上使用的委托字体绘制库的版本而异,即使确切相同的字体库和 IM 版本没有更改。建议在使用不同的计算机进行文本绘制时谨慎操作,因为即使对于相同的字体,结果也可能会有所不同。 |
创建混合字体样式的行
使用多种字体、点大小和样式创建单行并不是 IM 的真正设计目的。当您还开始考虑诸如文本对齐、自动换行以及环绕图像和其他内容等内容时,情况会变得更糟。这是文字处理器、Web 浏览器、文档打印机等程序做得非常好的事情,通常是在用户交互下,但很少有程序能够在程序控制下做得这么好。一个例外是“TeX
”及其程序系列(请参阅下面的完整的文本处理系统),因此如果您认真考虑以图形方式处理文本,我建议您查看此程序系列。另一种选择是查看各种文档“漂亮”打印程序,例如 HTML 转换器。您可以使用它们将 magick 程序生成的文档转换为 PostScript,然后 IM 可以将其快乐地后处理成您想要的任何图像格式或样式。“El Supremo”(来自 IM 讨论论坛)在其FontMetrics程序中创建了一个 API 解决方案(使用 C MagickWand API 接口),这里还有“FontMetrics”的示例输出。现在,虽然 IM 命令行并非设计用于“文字处理”,但这并不意味着您不能将其用于此目的。只是比较困难。在这里,我将提供一些混合不同字体和样式的文本的示例,为人们提供一个起点。人们通常想到的最简单的解决方案是将“
label:
”图像拼接在一起……
magick -font LokiCola -pointsize 36 label:'LokiCola ' \ -font Candice -pointsize 24 label:'Candice ' \ -font SheerBeauty -pointsize 48 label:'SheerBeauty' \ +append wp_label_append.jpg |
![[IM Output]](wp_label_append.jpg)
magick -size 1x50 xc:none +size \ \( -background white -font LokiCola -pointsize 36 \ label:'LokiCola ' \ -clone 0 +swap -background none -append \) \ \( -background white -font Candice -pointsize 24 \ label:'Candice ' \ -clone 0 +swap -background none -append \) \ \( -background white -font SheerBeauty -pointsize 48 \ label:'SheerBeauty' \ -clone 0 +swap -background none -append \) \ -delete 0 -gravity South -crop 0x50+0+0 +append \ -bordercolor none -border 1 -trim +repage \ -background white -flatten wp_label_bottom.jpg |
![[IM Output]](wp_label_bottom.jpg)
-trim
”和“-flatten
”将行的长度设置为最高标签,并填充背景。如您所见,这产生了更好的效果,但小字体往往会产生下标行为,而不是正确对齐的文本。我们真正需要做的是根据其“基线”对齐所有文本字符串,这在没有更多文本信息的情况下非常困难。此信息在程序 API 下很容易获得,但从命令行获得则困难得多。前一个示例部分显示了一种方法。但是,可以在不实际收集基线信息的情况下根据其基线对齐单词。“label:
”文本图像没有提供任何有关图像基线的线索,但您可以专门在固定基线上绘制图像。如果没有 API,您也无法直接找出绘制文本的长度或高度,因此您首先需要使用足够大的画布以确保我们不会丢失有关文本图像的任何信息。然后,为了保留尾随空格和文本高度,您还必须充分利用文本注释可用的(“-undercolor
”)功能并为图像裁剪提供边界。因此,让我们看看如何在命令行中执行此操作。
magick -size 500x100 xc:none -fill blue -draw 'line 15,0 15,99' \ -undercolor white -fill black \ \( -clone 0 -font LokiCola -pointsize 36 \ -annotate +5+60 'Loki Cola ' \) \ \( -clone 0 -font Candice -pointsize 24 \ -annotate +5+60 'Candice ' \) \ \( -clone 0 -font SheerBeauty -pointsize 48 \ -annotate +5+60 'Sheer Beauty' \) \ -delete 0 -trim +repage +append \ -transparent blue -trim +repage \ -background white -flatten wp_draw_baseline.jpg |
![[IM Output]](wp_draw_baseline.jpg)
表单填充
您有一个标准填写表单的图像,您想填写位于已知位置的字段。因此,您有一个数据文件,例如“text_data.txt
”,如下所示...
这些字段包括文本宽度、重力(对齐方式)、颜色、位置 x、y 以及为此字段放置的实际文本。现在,您可以使用简单的循环 shell 脚本生成如上所述的文本标签,在表单(背景)图像中定义的文本位置分配相应的文本。
|
![[IM Output]](text_layered.jpg)
文本处理替代方案
生成完全格式化的文本文件和文档的理想方法是将 ImageMagick 用作更大的图像和文本处理系统的一部分。工具 | 用于... |
ImageMagick | 图像批量处理和准备 |
Gimp | GUI 图像编辑,用于解决一次性问题 |
LyX | GUI 文字处理,构建用于生成... |
LaTeX | 文档和书籍的文本处理器... |
TeX | 底层文本格式 (在页面上定位符号和字体) |
Metafont | TeX 字体生成器 |
Pango(仅限 Linux 和 MacOSX)也提供了一种替代方案。它提供了 ImageMagick 中不可用的许多文本到图像处理功能。例如制表符、对齐方式、边距、页眉等。它甚至具有一种标记语言,允许在文本中间更改字体。
其他解决方案还包括许多文本到 Postscript 转换程序,例如“a2ps”,我在上面 Postscript 处理 中演示了生成 Postscript 文件的示例。它可以转换和格式化许多不同类型的文本文件,包括文字换行、加粗和制表符控制,以及相当不错的页眉、页脚、边框和多页选项。当然,这是通过 Postscript 或 PDF 中间语言进行的间接图像处理。另一种方法是使用 SVG 或 ImageMagick 绘图命令 布局文本,但随后您需要处理布局。有很多工具可以将文本转换为图像,并且大多数工具可以与 ImageMagick 结合使用以对文本图像进行后处理并将其合并到您的图像中。这使得 ImageMagick 可以专注于它最擅长的工作:图像处理。