ImageMagick 示例 —— 图像扭曲
- ImageMagick 示例前言与索引
- 简单图像扭曲 (重新排列像素顺序)
- 翻转与镜像图像
- 对角线转置与反转置
- 矩形旋转
- 滚动图像 (像信号不好的电视)
-
旋转图像 (简单图像旋转)
- 错切图像 (线性位移)
-
波浪图像 (正弦波位移)
- 外爆图像
-
动画 (有趣的示例) 本节我们来看看 ImageMagick 提供的一些通用且较为简单的图像扭曲与变形运算符。这是为了勾起你对后续章节中将要探讨的更高级、更复杂的变形的兴趣。
简单图像扭曲
简单图像扭曲运算符只是重新排列图像中的像素。像素的数量乃至图像的尺寸都保持不变。其关键特征在于图像不会丢失任何信息,只是被重新排列,因而无需任何质量损失即可轻松还原(保存时类似 JPEG 的有损压缩除外)。基本上,它只是重新排列像素,而不破坏、覆盖、复制、混合颜色或以其他方式修改原图的内容。仅仅是在图像内移动像素的位置。
翻转与镜像
这些示例就用这张看起来很可爱的考拉图像吧。 最简单的图像变形,就是重新排列图像中的像素,把它上下“-flip”翻转过来。 |
magick koala.gif -flip flip.gif
![[IM Output]](../static/img/warping/flip.gif)
或者,使用“-flop”可以生成镜像。 |
magick koala.gif -flop flop.gif
![[IM Output]](../static/img/warping/flop.gif)
| 在 IM v6.6.6-5 之前,“[-flip](https://imagemagick.org/command-line-options/#flip)”与“[-flop](https://imagemagick.org/command-line-options/#flop)”这两个运算符都不会修改图像相对于可能存在的更大虚拟画布的虚拟画布偏移
---|---
对角线转置与反转置
“-transpose”与“-transverse”这两个图像操作会生成图像的对角镜像。 “-transpose”沿图像左上到右下的对角线对图像进行镜像。 |
magick koala.gif -transpose transpose.gif
![[IM Output]](../static/img/warping/transpose.gif)
而“-transverse”则沿图像左下到右上的对角线对图像进行镜像。 |
magick koala.gif -transverse transverse.gif
![[IM Output]](../static/img/warping/transverse.gif)
| 在 IM v6.6.6-5 之前,“[-transpose](https://imagemagick.org/command-line-options/#transpose)”与“[-transverse](https://imagemagick.org/command-line-options/#transverse)”这两个运算符都不会修改图像相对于可能存在的更大虚拟画布的虚拟画布偏移
---|---
矩形旋转
上面展示的四种操作,本质上都会生成原图的镜像。“-rotate”运算符则提供图像的其他非镜像版本,包括原图本身。
magick koala.gif -rotate 0 rotate_0.gif
magick koala.gif -rotate 90 rotate_90.gif
magick koala.gif -rotate 180 rotate_180.gif
magick koala.gif -rotate -90 rotate-90.gif
magick koala.gif -rotate 360 rotate_360.gif
请注意,只有当你使用 90 度倍数的旋转角度时,“-rotate”才是简单变形。其他任何角度都会给图像引入更复杂的像素级变形。参见下面的旋转。 |
你可能会注意到正的旋转角度是顺时针方向,这看起来在逻辑上并不正确。然而在内部它在数学上是正确的,这是因为使用了取反的 Y 轴。也就是说,Y 轴从顶部的 0 开始向下为正。正因如此,坐标系被翻转了,于是旋转角度在数学上也随之翻转。 |
|---|---|
数码照片也可以使用“-auto-orient”运算符旋转,以匹配所记录的相机方向。此功能在 IM v6.2.7-8 中加入。 |
|
| --- | --- |
像信号不好的电视那样滚动图像
你还可以把图像水平“-roll”滚动(就像失去同步的电视)。滚动的量(图像的位移)以像素为单位给出。 |
magick koala.gif -roll +0+20 roll_horiz.gif
magick koala.gif -roll +30+0 roll_vert.gif
magick koala.gif -roll +0-20 roll-horiz.gif
![[IM Output]](../static/img/warping/roll-horiz.gif)
滚动对于平铺图像尤其重要,因为它在不破坏图像“可平铺性”的前提下重新定位平铺原点。事实上,这正是“-tile-offset”设置所定义的内容,即当“-tile”选项读入平铺图像时,对其施加多少滚动。
简单图像扭曲小结
所有这些运算符最重要的一点在于,你可以用许多不同的方式把它们组合在一起,使得结果_恰好_如同完全没有执行任何操作一样。 |
magick koala.gif -roll +25+0 -rotate 90 -flop \
-roll +0-25 -flip -rotate 90 original.gif
旋转与错切
上面的简单变形运算符会保持图像的尺寸与颜色,而接下来的这一组则不会。这些运算符的结果无法容纳于原始尺寸,甚至无法容纳于图像原始的栅格网格。
旋转图像 —— 简单图像旋转
正如你在上面看到的,当你以 90 度为单位旋转图像时,“-rotate”运算符可以执行简单的、保持图像的变形。 然而对于其他角度,旋转后的图像无法很好地容纳进矩形图像中。因此,为确保不丢失任何图像数据,最终图像的尺寸会被放大到恰好足以容纳旋转后的图像。 |
magick koala.gif -rotate 30 rotate.jpg
![[IM Output]](../static/img/warping/rotate.jpg)
请注意,旋转的方向是顺时针的。这在数学上可能显得不合逻辑,直到你意识到图像坐标系是相对于图像的左上角,而不是数学惯例中的左下角。其结果是旋转角度与你在逻辑上可能预期的相反。在处理任何形式的图像旋转(相较于数学旋转)时,记住这一点很重要。 ImageMagick 添加的额外空间会用当前的“-background”颜色设置着色。这让你可以指定填入四角的颜色。 |
magick koala.gif -background lightskyblue -rotate 30 rotate_color.png
![[IM Output]](../static/img/warping/rotate_color.png)
当然,如果你想用透明色填充,就需要确保图像能够处理透明度(通过启用、添加alpha 通道),并保存为能够处理透明度的图像格式。 |
magick koala.gif -alpha set -background none -rotate 30 rotate_trans.png
![[IM Output]](../static/img/warping/rotate_trans.png)
如果额外空间显示为黑色,那么你的输出图像格式不允许使用 alpha 通道(很可能是 JPEG 格式),因此透明度默认为黑色。 | 在 6.1.2 版本之前,“-rotate”不能正确处理透明度,会在旋转后图像的四角产生黑色与透明的条纹。这个问题的变通办法相当复杂,需要把 alpha 通道与颜色分开旋转。
---|---
但如果你不想要那些额外空间,希望保持图像的原始尺寸呢?那么你可以使用居中的“-crop”把图像还原到其原始尺寸。如果你不知道原始尺寸是多少,可以使用一种 alpha 合成技巧(参见“[Src](compose.html#src)”合成方法)把图像恢复到其原始尺寸。 |
magick koala.gif -alpha set \( +clone -background none -rotate 30 \) \
-gravity center -compose Src -composite rotate_resized.png
![[IM Output]](../static/img/warping/rotate_resized.png)
“-rotate”运算符还能识别两个额外的标志。如果在旋转参数中(数字之前或之后)加上“>”符号,那么只有当图像的宽度大于高度时才会被旋转。也就是说,“90>”只会把“横向(landscape)”(宽)样式的图像旋转成“纵向(portrait)”(高)样式的图像,从而使所有图像都是“纵向”样式。另一个标志“<”作用相反,只旋转高度大于宽度的图像。例如“90<”会确保所有图像都是“横向”。这个标志的另一种用法是,把“纵向”和“横向”图像旋转不同的量。也就是说,你可以给出两个不同的“-rotate”操作,使“纵向”朝一个方向倾斜,“横向”朝另一个方向倾斜。数码照片也可以使用“-auto-orient”运算符旋转,以匹配(基于图像 EXIF 元数据的)相机方向。不过请记住,保存回 JPEG 格式或许不是个好主意。
旋转运算符的内部机制
从 IMv6.7.3-4 起,旋转运算符现在使用变形运算符与缩放-旋转-平移(SRT)变形。 下面是使用其底层 SRT 变形进行的更直接的旋转。 |
magick koala.gif -virtual-pixel background -background lightskyblue \
-distort SRT 30 +repage rotate_srt.jpg
magick koala.gif -virtual-pixel background -background lightskyblue \
+distort SRT 30 +repage rotate_srt2.jpg
![[IM Output]](../static/img/warping/rotate_srt2.jpg)
通用变形运算符还提供许多其他控制,比如旋转中心的精确定位、缩放、滤镜控制、输出图像尺寸,以及对图像分层的控制,而较简单的旋转运算符并不提供这些。在 IMv6.7.3-4 之前,旋转运算符是通过简单的 90 度旋转变形再跟上三次图像错切来实现的,这种技术被称为“错切旋转(Rotate by Shear,RBS)”。这是由 Alan Paeth 首先在研究论文中发表的技术。遗憾的是,由于它需要 3 次独立的错切操作,你会得到高度不稳定且严重的模糊效果,尤其是在错切细线时,这正是旋转如今改用变形来实现的原因。你可以在下面的旋转动画中看到这种不良效果。以“错切”方式进行旋转的库函数在 API 中仍然可用,但除非你自己进行错切,否则不再能从命令行使用。该技术的完整细节参见下面的错切运算符。若想更深入地理解各种图像旋转算法、它们如何工作以及所涉及的问题,参见 Leptonica Rotation,以及通用变形技术中使用的示例。
错切图像 —— 线性位移
“-shear”运算符取每一行(或每一列)像素并将它们滑移,使得每一行(或每一列)相对于相邻的行(或列)位移相同的量。它的两个参数以角度的形式给出。就像“-rotate”一样,该操作会增大结果图像的尺寸,以免丢失任何信息。不过错切更复杂,因为它其实是一次双重操作。
magick koala.gif -background Blue -shear 20 shear_rot.gif
magick koala.gif -background Blue -shear 20x0 shear_x.gif
magick koala.gif -background Blue -shear 0x50 shear_y.gif
magick koala.gif -background Blue -shear 20x50 shear_xy.gif
magick koala.gif -background Blue -shear 20x0 -shear 0x50 shear_xy2.gif
magick koala.gif -background Blue -shear 0x50 -shear 20x0 shear_yx.gif
如果你观察这些结果,会发现一次完整的 X-Y“-shear”(第四张图)实际上等价于先做 X 错切、再做 Y 错切(并进行适当的图像修剪),正如第五张、也就是倒数第二张图所示。请注意,错切的顺序会产生不同的结果。如果只提供一个数字(参数中不含任何“x”,如第一张图),那么“-shear”会将它同时应用于 X 和 Y 两个方向,作为一种蹩脚的旋转。 “-background”颜色设置当然会被用作所添加额外空间的颜色。 |
magick koala.gif -background none -shear 30 shear_trans.png
![[IM Output]](../static/img/warping/shear_trans.png)
| 在 IM 6.1.2 版本之前,“-shear”不能处理透明度。这个问题的变通办法相当复杂,需要把 alpha 通道与颜色分开错切。
---|---
请注意,以这种方式使用“-shear”并不是旋转图像的正确方法。要真正用错切正确地旋转图像,你需要以“-shear {X}x{Y} -shear {X}x0 -crop ...”的形式执行多次错切操作,不过要算出“{X}”“{Y}”以及最终修剪的合适数值,需要一些三角学知识。“旋转运算符”实际上曾经就是以这种方式实现的,执行此操作的 API 函数仍然可用,但已无法从命令行使用。 | 请注意,X 方向的错切不会影响图像的高度,而 Y 方向的错切不会影响图像的宽度。其结果是,图像内某个对象所覆盖的面积不会改变(改变的只是容纳图像的周围容器)。
---|---
| _错切运算符是作为对源图像的直接“扭曲”(仅对各行各列中的像素进行变形)来实现的。因此它不使用插值设置,也不使用虚拟像素设置。
因此,添加到图像的区域只会用当前的“-background”颜色填充,并且没有提供保留图像原始颜色的方法。_
---|---
若想要一种允许使用图像滤镜、插值和虚拟像素的替代方法,参见仿射变形。关于使用仿射矩阵来实现错切的信息,参见仿射错切。不过这两种方法都不允许你用角度参数来指定错切。
用错切制作等距立方体
虽然错切不是最好用、最简单的运算符,但这并不意味着你不能用它们做出花哨的东西。下面是一个使用“-shear”来制作等距立方体的例子。 |
# 为立方体创建一些正方形图像
magick logo: -resize 256x256^ -gravity center -extent 256x256 top.jpg
magick ../img_photos/pagoda_sm.jpg -resize 256x256 left.jpg
magick ../img_photos/mandrill_orig.png -resize 256x256 right.jpg
# 上面图像的错切。
magick top.jpg -resize 260x301! -alpha set -background none \
-shear 0x30 -rotate -60 -gravity center -crop 520x301+0+0 \
top_shear.png
# 左面图像的错切
magick left.jpg -resize 260x301! -alpha set -background none \
-shear 0x30 left_shear.png
# 右面图像的错切
magick right.jpg -resize 260x301! -alpha set -background none \
-shear 0x-30 right_shear.png
# 把它们组合起来。
magick left_shear.png right_shear.png +append \
\( top_shear.png -repage +0-149 \) \
-background none -layers merge +repage \
-resize 30% isometric_shears.png
# 清理
rm -f top.jpg left.jpg right.jpg
rm -f top_shear.png left_shear.png right_shear.png
![[IM Output]](../static/img/warping/isometric_shears.png)
以上内容改编自 Wolfgang Hugemann ImageMagick@Hugemann.de 在其对 IM 示例的贡献 Using IM under Windows 中一个类似的 Windows 批处理示例。请注意,上面的图像并没有正确地拼接在一起。它们本应使用 Plus alpha 合成,却改用了 over。更多信息参见对齐两张带蒙版的图像。因此,你在正确对齐这三张图像时可能会遇到问题,产生缝隙或图像重叠。由于定位被限制为整数定位,这个问题会格外糟糕。使用更大的尺寸配合更易管理的坐标,再对计算稍加调整,在这种情况下会有所帮助。图像合并之后,把结果缩小到其最终尺寸会锐化并清理掉接缝处任何轻微的错位。另一个类似但使用仿射变形并采用正确 alpha 合成的例子,是使用仿射分层的 3D 立方体。这是一种大大简化生成上述立方体所需图像处理的方法。
波浪图像 —— 正弦波位移
“-wave”运算符与“-shear”相似,都会给图像添加“线性位移”。不过这个运算符只会按照正弦波函数沿垂直方向位移像素列。“-wave”运算符有两个参数。第一个是像素向上或向下位移的最大高度,即_振幅_,第二个是正弦函数的_波长_,以像素为单位。 |
magick koala.gif -background Blue -wave 10x64 wave.jpg
![[IM Output]](../static/img/warping/wave.jpg)
请注意,由于像素最多可以位移到给定的_振幅_,因此那么多的额外空间总会被添加到图像的上下两侧,即使这些空间实际上并不需要。例如,通过调整参数使_波长_为图像宽度的两倍,你可以把图像变成一道弧。 |
magick koala.gif -background Blue -wave 20x150 arched.jpg
![[IM Output]](../static/img/warping/arched.jpg)
在这种情况下,未使用的空间可以用“-chop”“-shave”,甚至可能用“-trim”操作来移除。让我们来整理一下前面的例子:用负振幅把弧翻转过来,再用“-chop”移除“-wave”运算符添加的未使用空间。 |
magick koala.gif -background Blue -wave -20x150 \
-gravity South -chop 0x20 arched_2.jpg
![[IM Output]](../static/img/warping/arched_2.jpg)
当然,“-background”颜色设置可以用来定义添加到图像的额外空间。 |
magick koala.gif -alpha set -background none -wave 10x75 wave_trans.png
![[IM Output]](../static/img/warping/wave_trans.png)
正如你从上面的例子中看到的,“-wave”只作用于垂直方向,即“Y”方向。如果你想在 X 方向添加波形,就需要在施加波形之前和之后旋转图像。 |
magick koala.gif -rotate -90 -background Blue -wave -10x75 \
-rotate +90 wave_y.jpg
![[IM Output]](../static/img/warping/wave_y.jpg)
这种技术可以用来以任意角度给图像添加波形图案或振动。相关例子见颤音字体与烟雾字体。“-wave”的另一个限制是,波形总是从零开始。也就是说,最左边的列不会被位移,而接下来的若干行会向下(正 X 方向)位移,除非你给出一个负的_振幅_作为初始的垂直偏移。 基本上,“-wave”运算符(目前)不允许你为正弦函数的起点指定偏移。不过这可以通过用“-splice”添加、然后移除一个图像偏移来纠正。 |
magick koala.gif -splice 19x0+0+0 -background Blue -wave 10x75 \
-chop 19x0+0+0 wave_offset.jpg
![[IM Output]](../static/img/warping/wave_offset.jpg)
虽然“-wave”不会利用当前的虚拟像素设置来定义所添加区域的颜色,但它会参考当前的插值设置,把颜色从源映射到所生成的图像。这意味着波形往往会让像素在图像上呈垂直带状轻微模糊。
圆形变形
到目前为止,图像变形都相当温和,对图像数据的拉伸、扩张或压缩都很少。也就是说,数据基本上保持不变。接下来的几个图像运算符可以使图像变形到无法辨认原图的程度。颜色被扭曲成一团模糊的混乱。它们还恰好把变形效果限制在一个圆形区域内,而在图像矩形的边缘处对原图几乎没有或完全没有变形。这意味着,你可以使用区域运算符在较小的区域上使用这些运算符,其结果仍会融入原图,而不会看起来像是被:切出、扭曲、再贴回原处。也就是说,这些运算符被称为“局部”变形,因为它们可用于扭曲图像中较小的区域。
内爆图像
“-implode”运算符会扭曲图像,把所有像素朝中心拉拢。这有点像在图像中心插入一台吸尘器,或一个“黑洞”,把像素朝它吸过去。不过建议谨慎行事,一开始只使用很小的值,然后慢慢增大这些值,直到得到想要的结果。大多数新手用户往往会使用过大的值,并对结果感到失望。例如,这是一次典型的图像内爆。 |
magick koala.gif -implode .6 implode.gif
magick koala.gif -implode 5 implode_big.gif
![[IM Output]](../static/img/warping/implode_big.gif)
不过要注意,使用任何大于“1.0”的“-implode”值也会受到虚拟像素设置的影响,因为算法开始引用实际图像本身边界之外的颜色。由于默认的“-virtual-pixel”设置是“edge”,图像的边缘颜色或周围的边框会对结果产生重大影响。例如,这两张图像除了其中一张添加了白色边框外完全相同。这基本上展示了正在使用从图像本体边界之外查得的颜色的区域,也就是通常由“-virtual-pixel”设置所定义的区域。 |
magick rose: -gravity center -crop 46x46+0+0 +repage \
-implode 3 implode_rose.gif
magick rose: -gravity center -crop 44x44+0+0 +repage \
-bordercolor white -border 1 -implode 3 implode_rose_2.gif
![[IM Output]](../static/img/warping/implode_rose_2.gif)
使用不同的虚拟像素设置,比如“[Background](misc.html#background)”,会产生与添加“-border”相同的效果,但不会放大图像。其他虚拟像素设置可以在中央内爆区域产生更有趣的效果。例如,使用“[Tile](misc.html#tile)”设置可以添加图像的高度变形副本。例如,这里我用这个设置对一张简单的方框图像进行内爆。 |
magick -size 94x94 xc:red -bordercolor white -border 3 \
-virtual-pixel tile -implode 4 implode_tiled_box.gif
![[IM Output]](../static/img/warping/implode_tiled_box.gif)
更多“-virtual-pixel”效果在虚拟像素的内爆效果中有所探讨。 随着内爆进一个小区域的像素数量增加,以及内爆参数的大小变得非常大,结果开始呈现“像素化”的外观。为得到更好、更一致的结果,你可以使用一种叫做超采样的技术来增加内爆所处理的像素数量。基本上,通过使用更大的图像(必要时放大源图像)、进行变形、再把结果缩小到其最终尺寸,你会得到好得多的结果。 |
magick -size 94x94 xc:red -bordercolor white -border 3 \
-virtual-pixel tile -resize 400% -implode 4 -resize 25% \
implode_tiled_ss.gif
![[IM Output]](../static/img/warping/implode_tiled_ss.gif)
如你所见,你得到了平滑得多、也真实得多的结果,它把变形的内部细节展现得好得多。不过,即使是超采样,在这样涉及无穷大的极端图像中也会失效。如果你仔细看,会发现“点状”的外观又回来了,但只在更靠近中心的地方。 通过在被内爆的图像周围使用更大的“-border”,随后再把它移除,你还可以把图像的边缘朝中心向内扭曲。 |
magick koala.gif -bordercolor blue -border 20x20 \
-implode .5 -shave 18x18 implode_border.jpg
![[IM Output]](../static/img/warping/implode_border.jpg)
从 IM 6.2.1 版本起,你还可以使用透明边框,或带透明度的图像。 |
magick koala.gif -bordercolor none -border 20x20 \
-implode .5 -shave 18x18 implode_border_trans.png
外爆图像
通过对“-implode”运算符使用负值,你可以让图像外爆。不过这更像是放大图像的中心,把所有中等半径的像素朝边缘推出去,而不是真正的爆炸。 |
magick koala.gif -implode -2 explode.jpg
![[IM Output]](../static/img/warping/explode.jpg)
使用更大的值,本质上会把图像最中心的像素放大成一个圆,其大小为图像最小尺寸的三分之二。 |
magick koala.gif -implode -30 explode_big.jpg
![[IM Output]](../static/img/warping/explode_big.jpg)
而这里是一个“超采样”版本。 |
magick koala.gif -resize 400% -implode -30 \
-resize 25% explode_big_ss.jpg
![[IM Output]](../static/img/warping/explode_big_ss.jpg)
内部“爆炸”的中心颜色由图像(或区域)中心的颜色设定。这意味着,通过在外爆之前改变那个点周围的颜色,你可以控制爆炸的“闪光”效果。这种颜色控制的动画示例见下面的动画。内爆图像的另一个例子见 Flickr 上用户 hh 的贡献。
漩涡扭曲图像
“-swirl”运算符的作用就像一台蛋糕搅拌机。它会按你作为参数给出的度数,把图像绕着一个圆扭曲。 |
magick koala.gif -swirl 180 swirl.jpg
![[IM Output]](../static/img/warping/swirl.jpg)
通过添加边框,并与“-implode”组合,你可以营造出漩涡把图像吸入虚无的外观。 |
magick koala.gif -bordercolor white -border 20x20 \
-swirl 180 -implode .3 -shave 20x20 whirlpool.jpg
![[IM Output]](../static/img/warping/whirlpool.jpg)
这种变形的关键特性在于,图像中心会按你指定的角度旋转,而圆形边缘(像上面的内爆运算符一样)保持不受影响。目前还没有参数可以指定“内半径”,以将漩涡限制为一个环,而不是整个圆盘。我把这些漩涡效果做成了动画,你可以在下面的动画中看到。
动画(有趣的示例)
作为收尾,让我们为其中一些变形生成一些 GIF 动画。为此我编写了一些简单的 shell 脚本来生成动画图像,你也可以下载它们,用你自己的测试图像来把玩。这引出一个重要的点。如果使用这些变形生成一系列图像,最好总是从原始的起始图像开始变形,而不是对图像反复地逐次变形。对于旋转图像尤其如此,其结果会有一些模糊,虽然任何单次操作中都很轻微,但如果你反复地做,就会是这样的结果。所有脚本都使用一种“生成的“magick”命令”技术来创建动画。也就是说,shell 脚本创建一条很长的单一命令,然后执行它。这避免了生成临时文件的需要,不过调试起来可能会比较困难。另一种替代方法是使用一种叫做 MIFF 图像流的方法,它在循环中生成一张张单独的图像,并把它“管道传输”进最终的“合并”命令。这在示例分层图像的程序化定位与地图上的图钉中有更清晰的演示。 ![]() |
shell 脚本“animate_mixer”的每一帧都是通过对原图使用“-swirl”生成的。漩涡朝一个方向做动画,然后再返回,形成连续的循环。这实际上是 IM 中一个非常典型的扭曲动画示例。它的一个变体是让动画解除扭曲,变成一张不同但相似的图像。 |
|---|---|
![]() |
shell 脚本“[animate_whirlpool](../static/img/warping/animate_whirlpool)”不仅对每一图像帧使用“[-swirl](https://imagemagick.org/command-line-options/#swirl)”,还使用了参数尺寸不断增大的“-implode”。我为所添加的空间使用了“lightblue”边框色,以显示整张图像将被“冲进下水道”,不过为了更好、更真实的效果,我本应改用同样的白色背景色。 |
| --- | --- |
![]() |
图像中央的一次爆炸(参见脚本“animate_explode”)。图像再次被放大,使整张图像外爆,并在中心画一个彩色点来定义最终颜色。 |
| --- | --- |
![]() |
使用 shell 脚本“animate_flex”,通过把“-wave”函数的振幅在正负之间变化,图像的中心上下弯曲。 |
| --- | --- |
![]() |
使用 shell 脚本“animate_flag”,我创建了一个“偏移波”动画,让图像像旗帜一样飘动。还可以通过对图像的每一帧也做垂直偏移,使左侧边缘保持恒定,或许再加上一根旗杆,来改进这个动画。不过那需要你用数学方法确定那个偏移量,这可能会比较棘手。 |
| --- | --- |
![]() |
脚本“animate_rotate”生成了这个旋转动画,但如上所述会用原图裁剪每一帧,以保持原始图像尺寸。 |
| --- | --- |
![]() |
作为对比,这里是一个使用默认设置和“-distort SRT {angle}”命令生成的考拉旋转。用来生成它的脚本是“animate_distort_rot”。注意用这种旋转方法后图像锐利了多少,以及前一版本中明显存在的旋转“抖动”消失了。 |
| --- | --- |
附赠动画与影片
作为附赠,来自法国的 Florent Monnier 用“[-swirl](https://imagemagick.org/command-line-options/#swirl)”变形运算符制作了一段精巧的视频,它是用一个 IM OCaml API 脚本做成的。选择右侧的 GIF 动画即可下载视频的完整版本。你能做出一段很好地演示变形映射技术的视频吗?你知道网上别处有这样的视频吗?给我发邮件。
![[IM Output]](../static/img/warping/rotate_0.gif)
![[IM Output]](../static/img/warping/rotate_90.gif)
![[IM Output]](../static/img/warping/rotate_180.gif)
![[IM Output]](../static/img/warping/rotate-90.gif)
![[IM Output]](../static/img/warping/rotate_360.gif)
![[IM Output]](../static/img/warping/roll_horiz.gif)
![[IM Output]](../static/img/warping/roll_vert.gif)
![[IM Output]](../static/img/warping/original.gif)
![[IM Output]](../static/img/warping/rotate_srt.jpg)
![[IM Output]](../static/img/warping/shear_rot.gif)
![[IM Output]](../static/img/warping/shear_x.gif)
![[IM Output]](../static/img/warping/shear_y.gif)
![[IM Output]](../static/img/warping/shear_xy.gif)
![[IM Output]](../static/img/warping/shear_xy2.gif)
![[IM Output]](../static/img/warping/shear_yx.gif)
![[IM Output]](../static/img/warping/implode.gif)
![[IM Output]](../static/img/warping/implode_border_trans.png)
![[IM Output]](../static/img/warping/animated_mixer.gif)
![[IM Output]](../static/img/warping/animated_whirlpool.gif)
![[IM Output]](../static/img/warping/animated_explode.gif)
![[IM Output]](../static/img/warping/animated_flex.gif)
![[IM Output]](../static/img/warping/animated_flag.gif)
![[IM Output]](../static/img/warping/animated_rotate.gif)
![[IM Output]](../static/img/warping/animated_distort_rot.gif)