ImageMagick 示例 --
扭曲图像

索引
ImageMagick 示例前言和索引
简单图像扭曲 (重新排列像素顺序)
旋转和剪切
圆形扭曲
动画 (有趣的例子)
在本节中,我们将研究 ImageMagick 提供的通用且简单的图像扭曲和失真运算符。这是为了让您对更高级和复杂的失真有所了解,我们将在后面的章节中介绍。

简单图像扭曲

简单图像扭曲运算符只是重新排列图像中的像素。像素数量甚至图像大小都保持不变。关键特征是图像不会丢失任何信息,它只是重新排列,并且可以很容易地恢复到正常状态,而不会有任何质量损失(不包括保存时类似 JPEG 的有损压缩)。基本上,它只是重新排列像素,而不会破坏、覆盖、复制或颜色合并或以其他方式修改原始图像的内容。只是在图像中移动像素位置。 [IM 输出]

翻转和镜像

对于这些例子,让我们使用这个看起来很可爱的考拉图像...
最简单的图像失真是重新排列图像中的像素,以便"-flip"它上下颠倒。

  magick koala.gif  -flip  flip.gif
[IM Output]
或者通过使用"-flop",您可以生成镜像图像。

  magick koala.gif  -flop  flop.gif
[IM Output]
在 IM v6.6.6-5 之前,"-flip" 和 "-flop" 运算符都不会修改图像的虚拟画布偏移,相对于可能存在的更大的虚拟画布。

转置和横置,对角线

"-transpose" 和 "-transverse" 图像操作会生成图像的对角线镜像。
"-transpose" 沿图像左上角到右下角的对角线镜像图像。

  magick koala.gif  -transpose  transpose.gif
[IM Output]
而 "-transverse" 沿图像左下角到右上角的对角线镜像图像。

  magick koala.gif  -transverse  transverse.gif
[IM Output]
在 IM v6.6.6-5 之前,"-transpose" 和 "-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
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
请注意,"-rotate" 仅在您使用 90 度倍数的旋转角度时才是简单的扭曲。任何其他角度都会在图像中引入其他更复杂的像素级扭曲。参见下面的 旋转
您可能会注意到,正旋转角度是顺时针方向,这在逻辑上似乎不正确。然而,在内部,这是数学上正确的,并且是由使用否定 Y 轴造成的。也就是说,Y 轴从顶部开始,正向下方。由于坐标系是反向的,因此旋转角度在数学上也是反向的。
数字照片也可以使用 "-auto-orient" 运算符旋转以匹配记录的 相机方向。这是在 IM v6.2.7-8 中添加的。

滚动图像,就像一台坏电视

您还可以"-roll" 水平滚动图像(就像一台不同步的电视)。滚动量(图像的位移)以像素为单位给出。

  magick koala.gif  -roll +0+20  roll_horiz.gif
[IM Output]
当然,您也可以横向滚动图像...

  magick koala.gif  -roll +30+0  roll_vert.gif
[IM Output]
或者通过使用负像素数,您可以将其向相反方向滚动。

  magick koala.gif  -roll +0-20  roll-horiz.gif
[IM Output]
滚动对于 平铺图像 特别重要,因为它会重新定位平铺原点,而不会破坏图像的“平铺性”。事实上,这正是 "-tile-offset" 设置定义的内容,即在 "-tile" 选项读取平铺图像时要应用的滚动量。

简单图像扭曲总结

所有这些运算符中最重要的方面是,您可以将它们以多种不同的方式组合在一起,使得结果与根本没有执行任何操作完全相同。

  magick koala.gif -roll +25+0 -rotate 90  -flop \
          -roll +0-25  -flip  -rotate 90    original.gif
[IM Output]

旋转和剪切

虽然 简单扭曲运算符(以上)保留了图像的大小和颜色,但下一组则没有。这些运算符的结果不适合原始大小,甚至不适合图像的原始光栅网格。

旋转图像 --简单图像旋转

如您在上面看到的,"-rotate" 运算符可以执行简单的图像保留扭曲,当您以 90 度为单位旋转图像时。
但是,使用其他角度,旋转后的图像将无法很好地拟合到矩形图像中。因此,为了确保没有图像数据丢失,最终图像的大小会相应放大,以容纳旋转后的图像。

  magick koala.gif -rotate 30 rotate.jpg
[IM Output]
请注意,旋转方向是顺时针方向。这在数学上似乎不合逻辑,直到您意识到图像坐标系相对于图像的左上角,而不是数学规范的左下角。结果是旋转角度与您在逻辑上预期的相反。在处理任何形式的图像旋转时,与数学旋转相比,这一点非常重要。
ImageMagick 添加的额外空间将使用当前的 "-background" 颜色设置进行着色。允许您指定用于填充角的颜色。

  magick koala.gif -background lightskyblue -rotate 30 rotate_color.png
[IM Output]
当然,如果您想用透明色填充,您需要确保图像可以处理透明度(通过启用添加 Alpha 通道),并保存到可以处理透明度的图像格式。

  magick koala.gif -alpha set -background none -rotate 30 rotate_trans.png
[IM Output]
如果额外空间变黑,那么您的输出图像输出格式不允许使用 alpha 通道(很可能是 JPEG 格式),因此透明度默认为黑色。
在 6.1.2 版本之前,"-rotate" 未能正确处理透明度,在旋转后的图像角部产生黑色和透明条纹。解决此问题的变通方法相当复杂,涉及分别旋转 alpha 通道和颜色。
但是,如果您不想要那个额外的空间,想要保留图像的原始大小呢?好吧,您可以使用居中的 "-crop" 将图像恢复到原始大小。如果您不知道原始大小是多少,您可以使用 alpha 合成技巧(参见“Src”合成方法)将图像恢复到原始大小。

    magick koala.gif -alpha set \( +clone -background none -rotate 30 \) \
            -gravity center  -compose Src -composite   rotate_resized.png
[IM Output]
"-rotate" 运算符还理解两个额外的标志。如果在旋转参数(在数字之前或之后)中添加了“>”符号,那么只有当图像的宽度大于高度时,才会旋转图像。也就是说,"90>" 只会将“横向”(宽)样式图像旋转成“纵向”(高)样式图像,以使所有图像都为“纵向”样式。另一个标志“<”则相反,只旋转高度大于宽度的图像。例如,"90<" 将确保所有图像都为“横向”。此标志的另一个用途是按不同的量旋转“纵向”和“横向”图像。也就是说,您可以给出两个不同的 "-rotate" 操作,使您将“纵向”图像旋转一个方向,并将“横向”图像旋转另一个方向。数字照片也可以使用 "-auto-orient" 运算符旋转以匹配 相机方向(基于图像的 EXIF 元数据)。但是请记住,重新保存到 JPEG 格式可能不是一个好主意。

旋转运算符内部

从 IMv7.7.3-4 开始,旋转运算符 现在使用 扭曲运算符缩放-旋转-平移(SRT)扭曲
以下是使用底层 SRT 扭曲 的更直接的旋转。

  magick koala.gif -virtual-pixel background -background lightskyblue \
          -distort SRT 30 +repage rotate_srt.jpg
[IM Output]
或者使用扭曲运算符的“+”版本来调整画布大小。

  magick koala.gif -virtual-pixel background -background lightskyblue \
          +distort SRT 30 +repage rotate_srt2.jpg
[IM Output]
通用扭曲运算符 提供了许多其他控件,用于控制旋转中心、缩放、过滤器控制、输出图像大小以及 图像分层 的精确定位,而更简单的 旋转运算符 没有提供。在 IMv7.7.3-4 之前,旋转运算符 是使用 简单 90 度旋转扭曲 以及三个 图像剪切 来实现的,这是一种称为“通过剪切旋转”(RBS)的技术。这种技术最初是在 Alan Paeth 的研究论文中发表的。不幸的是,由于这需要 3 个单独的剪切操作,您会得到高度可变和严重的模糊效果,尤其是在剪切细线时,这就是为什么旋转现在使用扭曲来实现的原因。您可以在下面的旋转 动画 中看到这种不利影响。作为“剪切”进行旋转的库函数仍然可以在 API 中使用,但不再可以在命令行中使用,除非您自己进行剪切。请参阅下面的 剪切运算符 以了解该技术的完整细节。为了更深入地了解各种图像旋转算法、它们的运作方式以及所涉及的问题,请参阅 Leptonica 旋转。以及 通用扭曲技术 中使用的示例。

剪切图像 --线性位移

"-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
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
如果您查看结果,您会发现完整的 X-Y "-shear"(第四张图片)实际上等同于先进行 X 剪切,然后进行 Y 剪切(并对图像进行适当的裁剪),如第五张或倒数第二张图片所示。请注意,剪切的顺序会产生不同的结果。如果只提供一个数字(在参数中没有任何 'x',如第一张图片),那么 "-shear" 将在 X 和 Y 方向上同时应用它,作为一种简陋的旋转方式。
"-background" 颜色设置当然用作添加的额外空间的颜色。

  magick koala.gif  -background none  -shear 30  shear_trans.png
[IM Output]
在 IM 版本 6.1.2 之前,"-shear" 不处理透明度。解决此问题的方法相当复杂,涉及分别对 alpha 通道和颜色进行剪切。
请注意,以这种方式使用 "-shear" 不是旋转图像的正确方法。要真正使用剪切来正确旋转图像,您需要执行多个剪切操作,形式为 "-shear {X}x{Y} -shear {X}x0 -crop ...",但是计算 '{X}'、'{Y}' 和最终裁剪的正确值需要一些三角学。"旋转运算符" 实际上以前就是以这种方式实现的,并且执行此操作的 API 函数仍然可用,但不再从命令行提供。
请注意,在 X 方向上剪切不会影响图像的高度,而在 Y 方向上剪切不会影响图像的宽度。结果是,图像中某个对象所覆盖的区域不会改变(只有包含图像的周围容器会改变)。
"剪切运算符" 是作为对源图像的直接“扭曲”(仅扭曲单个行和列中的像素)实现的。因此,它不使用 插值设置虚拟像素设置

因此,添加到图像的区域只填充当前的 "-background" 颜色,并且没有提供保留图像原始颜色的方法。
有关允许使用图像滤镜、插值和虚拟像素的替代方法,请参见 仿射扭曲。有关使用仿射矩阵实现剪切的信息,请参见 仿射剪切。但是,这两种方法都不允许您使用角度参数指定剪切。

使用剪切的等距立方体

虽然剪切不是使用起来最友好或最简单的运算符,但这并不意味着您不能用它们做一些花哨的事情。以下是如何使用 "-shear" 创建等距立方体的示例。

  # Create some square images for the cube
  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

  # top image shear.
  magick top.jpg -resize  260x301! -alpha set -background none \
          -shear 0x30 -rotate -60 -gravity center -crop 520x301+0+0 \
          top_shear.png

  # left image shear
  magick left.jpg  -resize  260x301! -alpha set -background none \
          -shear 0x30  left_shear.png

  # right image shear
  magick right.jpg  -resize  260x301! -alpha set -background none \
          -shear 0x-30  right_shear.png

  # combine them.
  magick left_shear.png right_shear.png +append \
          \( top_shear.png -repage +0-149 \) \
          -background none -layers merge +repage \
          -resize 30%  isometric_shears.png

  # cleanup
  rm -f top.jpg left.jpg right.jpg
  rm -f top_shear.png left_shear.png right_shear.png

[IM Output]
以上内容是根据 Wolfgang Hugemann <ImageMagick@Hugemann.de> 在他关于 IM 示例的 在 Windows 下使用 IM 中的类似 Windows 批处理示例 开发的。请注意,上面的图像没有正确地拼接在一起。它们应该使用 Plus Alpha 合成,但使用的是覆盖。有关更多信息,请参见 对齐两个蒙版图像。因此,您可能会在正确对齐三个图像时遇到问题,导致出现间隙或图像重叠。由于定位仅限于整数定位,因此此问题可能尤其严重。在这种情况下,使用更大的尺寸,更易于管理的坐标,以及对数学进行一些调整会有所帮助。在将图像合并在一起之后,将结果缩放到其最终尺寸将锐化并清理沿接缝的任何轻微错位。另一个类似的示例,但使用 仿射扭曲,并使用正确的 alpha 合成,是 3D 立方体,使用仿射分层。一种极大地简化了生成如上所述的立方体所需的图像处理的方法。

波动图像 - 正弦波位移

"-wave" 运算符类似于 "-shear",因为它向图像添加“线性位移”。但是,此运算符将仅根据正弦波函数垂直位移像素列。"-wave" 运算符有两个参数。第一个是像素将向上或向下位移的最大高度或 *振幅*,第二个是正弦函数的 *波长*(以像素为单位)。

  magick koala.gif -background Blue  -wave 10x64  wave.jpg
[IM Output]
请注意,由于像素可以位移到给定的 *振幅*,因此始终会在图像的顶部和底部添加这么多额外的空间,即使实际上不需要这些空间。例如,通过调整参数使 *波长* 成为图像宽度的两倍,您可以将图像制成弧形。

  magick koala.gif -background Blue  -wave 20x150  arched.jpg
[IM Output]
在这种情况下,可以使用 "-chop"、"-shave",甚至 "-trim" 操作来移除未使用的空间。让我们通过使用负振幅来翻转弧形,并使用 "-chop" 来移除 "-wave" 运算符添加的未使用的空间,来清理前面的示例。

  magick koala.gif -background Blue  -wave -20x150  \
          -gravity South -chop 0x20 arched_2.jpg
[IM Output]
当然,"-background" 颜色设置可用于定义添加到图像的额外空间。

  magick koala.gif -alpha set -background none  -wave 10x75  wave_trans.png
[IM Output]
从上面的示例中可以看出,"-wave" 仅在垂直或“Y”方向上应用。如果要添加 X 方向的波形,则需要在应用波形之前和之后旋转图像。

  magick koala.gif  -rotate -90 -background Blue  -wave -10x75 \
                     -rotate +90  wave_y.jpg
[IM Output]
该技术可用于以任何角度向图像添加波形图案或振动。Vibrato 字体Smoking 字体 中给出了此技术的示例。"-wave" 的另一个限制是,波形仅从零开始。也就是说,最左边的列没有位移,而接下来的几行向下位移(正 X 方向),除非您为初始垂直偏移指定负 *振幅*。
基本上,"-wave" 运算符(目前)不允许您为正弦函数的起点指定偏移量。但是,可以通过使用 "-splice" 添加然后移除图像偏移来解决此问题。

  magick koala.gif  -splice 19x0+0+0 -background Blue  -wave 10x75 \
                     -chop   19x0+0+0     wave_offset.jpg
[IM Output]
虽然 "-wave" 不会使用当前的 虚拟像素设置 来定义添加区域的颜色,但它会查看当前的 插值设置 来将颜色从源映射到生成的图像。这意味着 wave 倾向于在图像上垂直条带上略微模糊像素。

圆形扭曲

到目前为止,图像扭曲相当温和,图像数据的拉伸、扩展或压缩非常小。也就是说,数据基本上保持不变。接下来的几个图像运算符会导致图像扭曲到无法确定原始图像的程度。颜色被扭曲成模糊的一团。它也恰好将扭曲效果限制在圆形区域,图像矩形的边缘几乎没有扭曲。这意味着,您可以在较小的区域上使用这些运算符,使用 区域运算符,结果仍然会与原始图像融合,而不至于看起来像是被剪切、扭曲然后粘贴回原处。也就是说,这些运算符被称为“局部”扭曲,因为它们可以用于扭曲图像的较小区域。

内爆图像

"-implode" 运算符扭曲图像,使所有像素都向中心拉伸。这有点像在图像的中心放一个真空吸尘器或“黑洞”,并将像素吸进去。但是,建议您只使用非常小的值开始,然后慢慢增加这些值,直到您获得所需的结果。大多数新手用户往往使用过大的值,并对结果感到失望。例如,这是一个典型的图像内爆...

  magick koala.gif -implode .6 implode.gif
[IM Output]
使用越来越大的值基本上会将圆圈内的所有像素吸入虚无。

  magick koala.gif -implode 5 implode_big.gif
[IM Output]
但是请注意,使用任何大于 '1.0' 的 "-implode" 值也会受到 虚拟像素设置 的影响,因为该算法开始对超出实际图像边界本身的边界进行颜色引用。由于默认情况下,"-virtual-pixel" 设置为“边缘”,因此图像的边缘颜色或周围的框架会对结果产生重大影响。例如,这两张图像相同,只是其中一张添加了白色边框。这基本上显示了使用从图像边界之外查找的颜色区域。该区域通常由 "-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] [IM Output]
使用不同的 虚拟像素 设置,例如 'Background',将产生与添加 "-border" 相同的效果,但不会扩大图像。其他 虚拟像素 设置可以在中心内爆区域中产生更有趣的效果。例如,使用 'Tile' 设置可以添加图像的高度扭曲副本。例如,这里我使用此设置内爆简单的盒子图像...

  magick -size 94x94 xc:red -bordercolor white -border 3 \
          -virtual-pixel tile     -implode 4   implode_tiled_box.gif
[IM Output]
虚拟像素的内爆效果 上探讨了更多 "-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]
如您所见,您将获得更平滑、更逼真的结果,它能更好地显示扭曲的内部细节。但是,即使超级采样也会在像这样的极端图像中分解,因为它涉及无穷大。如果您仔细观察,您会发现“点状”外观又回来了,但仅限于靠近中心的位置。
通过在要内爆的图像周围使用更大的 "-border",然后再次将其删除,您还可以将图像的边缘向内扭曲到中心。

  magick koala.gif -bordercolor blue -border 20x20 \
          -implode .5   -shave 18x18  implode_border.jpg
[IM Output]
从 IM 版本 6.2.1 开始,您也可以使用透明边框或具有透明度的图像...

  magick koala.gif -bordercolor none -border 20x20 \
          -implode .5   -shave 18x18  implode_border_trans.png
[IM Output]

爆炸图像

通过对 "-implode" 运算符使用负值,您可以将图像爆炸。但是,这更像是放大图像的中心,将所有中间半径像素推向边缘,而不是真正的爆炸。

  magick koala.gif -implode -2 explode.jpg
[IM Output]
使用更大的值实质上会将图像中最中心的像素放大成一个圆形,该圆形的大小是图像最小维度的三分之二。

  magick koala.gif -implode -30 explode_big.jpg
[IM Output]
这里有一个 '超采样' 版本。

  magick koala.gif -resize 400% -implode -30 \
          -resize 25% explode_big_ss.jpg
[IM Output]
内部“爆炸”的中心颜色由图像(或区域)中心的颜色设置。这意味着通过在爆炸之前改变该点周围的颜色,您可以控制爆炸的“闪光”效果。请参阅下面的 动画,以获取此颜色控制的动画示例。有关内爆图像的另一个示例,请参阅 Flickr 上用户 hh 的贡献。

旋转图像漩涡

"-swirl" 运算符就像蛋糕搅拌器。它会以您作为参数给出的度数将图像围绕圆圈扭曲。

  magick koala.gif -swirl 180 swirl.jpg
[IM Output]
通过添加边框并将 "-implode" 组合在一起,您可以营造出漩涡将图像吸入虚无的视觉效果。

  magick koala.gif -bordercolor white -border 20x20 \
          -swirl 180 -implode .3  -shave 20x20   whirlpool.jpg
[IM Output]
这种扭曲的关键性质是,图像将在中心以您指定的角度旋转,而圆形边缘(如上面的 内爆运算符)不受影响。目前还没有参数可以指定“内半径”来将漩涡限制在环形而不是整个圆盘内。我已经将这些旋转效果动画化,您可以在下面的 动画 中看到。

动画(有趣的例子)

最后,让我们生成一些这些扭曲的 GIF 动画。为此,我生成了一些简单的 shell 脚本,用于生成动画图像,您也可以下载并使用自己的测试图像进行播放。这使我想到一个重要点。如果使用这些扭曲生成一系列图像,最好始终从原始图像进行扭曲,而不是在图像上反复进行增量扭曲。这对于旋转图像尤其如此,因为旋转图像在结果中会有一定的模糊,尽管在任何单个操作中都很小,但是如果您反复执行操作,就会出现这种情况。所有脚本都使用“生成的“magick”命令”技术来创建动画。也就是说,一个 shell 脚本创建一个长的单个命令,然后执行该命令。这避免了生成临时文件的需要,但也可能难以调试。另一个替代方案是使用一种称为 MIFF 图像流 的方法,该方法在循环中生成单个图像,并将其“管道”到最终的“合并”命令中。这在示例 分层图像的编程定位地图中的图钉 中更清楚地示范了。
[IM Output] shell 脚本 "animate_mixer" 使用原始图像上的 "-swirl" 生成每一帧。漩涡在一个方向上动画,然后反向动画以形成一个连续的循环。这实际上是 IM 中一个非常典型的扭曲动画示例。这种动画的变化是让动画解开成一个不同的但类似的图像。
[IM Output] shell 脚本“animate_whirlpool”不仅在每个图像帧上使用“-swirl”,还使用 "-implode",并使用不断增加的参数大小。我使用了一个“lightblue”边框颜色来表示用于显示整个图像将被“吸入排水管”的额外空间,但我应该使用相同的白色背景颜色,以获得更好的、更逼真的效果。
[IM Output] 图像中间的爆炸(请参阅脚本 "animate_explode"。图像再次放大,以使整个图像爆炸,并在中心绘制一个彩色点来定义最终颜色。
[IM Output] 使用 shell 脚本 "animate_flex",通过更改 "-wave" 函数的正负幅度,图像的中心向上和向下弯曲。
[IM Output] 使用 shell 脚本 "animate_flag",我创建了一个“偏移波浪”动画,使图像像旗帜一样飘动。可以通过垂直偏移图像的每一帧来改进动画,以便使左侧边缘保持不变,并且可能添加一个旗杆。但是,这需要您通过数学方法确定该偏移量,这可能很棘手。
[IM Output] 脚本 "animate_rotate" 生成了这个旋转动画,但使用上面描述的原始图像裁剪每一帧,以保留原始图像大小。
更新:从 IMv7.7.3-4 开始,旋转运算符 现在使用 扭曲运算符SRT 扭曲。因此,前面的示例现在将产生下一个示例中明显不那么模糊的结果。
[IM Output] 作为比较,这里是一个使用默认设置和“-distort SRT {angle}”命令生成的考拉旋转。用于生成它的脚本是 "animate_distort_rot"。请注意,使用这种旋转方法,图像的清晰度要高得多,并且在先前版本中明显存在的旋转“抖动”现象也消失了。

奖励动画和电影

[IM 输出] 作为奖励,来自法国的 Florent Monnier 使用“-swirl”扭曲运算符创建了一个很棒的视频,使用 IM OCaml API 脚本制作。选择右边的 GIF 动画以下载视频的完整版本。您能制作一个好的视频来演示扭曲映射技术吗?您是否知道网络上其他地方有这样的视频?给我发邮件。