使用 ImageMagick 7 创建一批图块并将其修改为重复图像

Use ImageMagick 7 to create and modify a batch of tiles into repeating images

版本:ImageMagick 7.0.10-55 Q16 x64

我有一个 Windows 文件夹,里面装满了各种织物扫描的数百个 TIFF 图块(可以无缝重复)。我需要根据每个瓷砖的 dpi 生成每个织物的 10" x 10" 图像。然后我想将每个图像缩小到 1000x1000 JPEG,质量为 85%。最终结果将是一个充满 1000x1000 图像的文件夹,这些图像看起来像扫描织物的 10"x10" 样本。

我想一个成功的脚本会为文件夹中的每个图块做这样的事情:

  1. 获得一张牌
  2. 获取图块 dpi
  3. dpi * 英寸 = canvas 尺寸
  4. 为新的平铺图像创建 canvas
  5. 重复拼贴以填充 canvas
  6. 格式化、缩放、优化新图像
  7. 将新图像保存在不同的文件夹中

我已经能够一次创建一个图块并批量修改图像。但是我不知道如何批量修改和平铺或平铺。我也不知道如何检索 dpi 并使用它来修改 canvas 大小。

此命令创建单个 5000x5000 平铺图像(但似乎更改了 dpi)。

magick mogrify -path tiled -size 5000x5000 tile:tile01.tif

此命令格式化、缩放和优化一批图像:

magick mogrify -path resized -format jpg -resize 1000x1000 -quality 85 *.tif

这是两个示例图块。它们是 28 dpi 和 237 dpi。

这里是 10"x10" 样片,如果您从卷中剪下并拍照,会是什么样子。

这是我的最终解决方案。它使用每个图块的 dpi 来计算和填充 10"x10" 样本所需的分辨率。然后它将图像缩小到几个不同的分辨率,设置与其 10"x10" 样本大小一致的 dpi。

FOR %I in (I:\Covers\tiles\*.tif) DO magick %I -write mpr:tile -set 
option:dnsty "%x" -size "%[fx:dnsty*10]x%[fx:dnsty*10]" +delete tile:mpr:tile ^
( -clone 0 -resize "1000x1000\>" -format jpg -quality 85 -set option:wdth "%w" -density "%[fx:wdth/10]" -units pixelsperinch -write I:\Covers\tiles\tiled\Large\%~nI.jpg ) ^
( -clone 0 -resize "800x800\>" -format jpg -quality 85 -set option:wdth "%w" -density "%[fx:wdth/10]" -units pixelsperinch -write I:\Covers\tiles\tiled\Medium\%~nI.jpg ) ^
( -clone 0 -resize "400x400\>" -format jpg -quality 85 -set option:wdth "%w" -density "%[fx:wdth/10]" -units pixelsperinch -write I:\Covers\tiles\tiled\Small\%~nI.jpg ) ^
( -clone 0 -resize "220x220\>" -format jpg -quality 85 -set option:wdth "%w" -density "%[fx:wdth/10]" -units pixelsperinch -write I:\Covers\tiles\tiled\Largeviews\%~nI.jpg ) ^
( -clone 0 -resize "120x120\>" -format jpg -quality 85 -set option:wdth "%w" -density "%[fx:wdth/10]" -units pixelsperinch -write I:\Covers\tiles\tiled\Thumbnails\%~nI.jpg ) null:

通过 Mark 的输入进行了简化:

FOR %I in (I:\Covers\tiles\*.tif) DO magick %I -write mpr:tile -set option:dnsty "%x" -size "%[fx:dnsty*10]x%[fx:dnsty*10]" +delete tile:mpr:tile ^
( -clone 0 -resize "1000x1000\>" -quality 85 -set option:wdth "%w" -density "%[fx:wdth/10]" -units pixelsperinch -write I:\Covers\tiles\tiled\Large\%~nI.jpg ) ^
( -clone 0 -resize "800x800\>" -set option:wdth "%w" -density "%[fx:wdth/10]" -units pixelsperinch -write I:\Covers\tiles\tiled\Medium\%~nI.jpg ) ^
( -clone 0 -resize "400x400\>" -set option:wdth "%w" -density "%[fx:wdth/10]" -units pixelsperinch -write I:\Covers\tiles\tiled\Small\%~nI.jpg ) ^
( -clone 0 -resize "220x220\>" -set option:wdth "%w" -density "%[fx:wdth/10]" -units pixelsperinch -write I:\Covers\tiles\tiled\Largeviews\%~nI.jpg ) ^
( -clone 0 -resize "120x120\>" -set option:wdth "%w" -density "%[fx:wdth/10]" -units pixelsperinch -write I:\Covers\tiles\tiled\Thumbnails\%~nI.jpg ) null:

我的建议是,我仍然不确定您到底想要什么,我的建议是简单地在您目录中的所有文件上编写一个脚本循环并使用 ImageMagick magick(不是 magick mogrify)执行以下操作:

magick tweed.png -write mpr:img +delete -size 1000x1000 tile:mpr:img -density 100 -units pixelsperinch -quality 85 tweed_tiled.jpg

生成的平铺图像的分辨率为 100 dpi。所以对于 1000 像素,它将打印 10 英寸。

Image:
  Filename: tweed_tiled.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: DirectClass
  Geometry: 1000x1000+0+0
  Resolution: 100x100
  Print size: 10x10
  Units: PixelsPerInch

候补

您可以使用 magick mogrify 来处理整个图像文件夹,使用以下命令来生成如上所示的结果:

cd desktop/in
magick mogrify -path ../out -format jpg -set option:distort:viewport 1000x1000+0+0 -virtual-pixel tile -filter point -distort SRT 0 -density 100 -units pixelsperinch -quality 85 *.png

也许这就是你想要的,鉴于你上一个问题,使用相当当前版本的 ImageMagick 7(仅),你可以执行以下操作:

输入:

magick I6xQd.png -write mpr:tile -set option:dens "%x" -size "%[fx:dens*10]x%[fx:dens*10]" +delete tile:mpr:tile result.png