按给定比例分割 jpg 图像(imagemagick)

按给定比例分割 jpg 图像(imagemagick)

我有一堆扫描成 jpg 格式的图片。如下图所示,这些卡片是双面的,扫描时我将 6 张卡片放入扫描仪中。

下图中第一张卡片的正面编号为 1,背面编号为 7。第二张卡片的正面编号为 2,背面编号为 8,依此类推。

我想要实现的目标是:拆分这些文件(image1.jpg 和 image2.jpg),以便有一个包含各个卡片的文件夹,顺序如下:

1.jpg(1)
2.jpg(7) (since 7 is the back side of the 1.jpg) 

3.jpg(2)
4.jpg(8)
etc

(image1.jpg)六张卡片的正面: 卡片正面

(image2.jpg)六张卡片的背面: 卡片背面

1-如何使用 imagemagick(或任何其他解决方案)根据这些分隔线分割图像?(我可以得到这些线的 x 和 y,因为所有图像都是 2550x3507)

分隔线为红色: 分隔线为红色

  1. 拆分后或拆分过程中,是否可以根据上面描述的顺序自动编号?

答案1

如何使用 [ImageMagick?] 根据这些分隔线分割图像

可以说,最简单的解决方案可能是使用-庄稼像这样:

convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg

此命令:

  • 将每幅图像分成 6 个(大致)大小相等的图块(-裁剪 3x2@),并按顺序编号。

  • 编号序列从1(-场景 1), 而不是0

  • 在单个数字 [ ] 中为最终数字添加0-padding ( ) 。%02d01-09

命令说明

  • 虽然可以指定精确的尺寸(例如1000x1000)或使用百分比(例如33%x50%)进行平铺裁剪,但这也可能产生“修剪”图像(可能是不受欢迎的)。

  • 使用例如-3x2@通常会创建尺寸更接近(彼此相对)的图像而不是“过度调整”百分比(例如33.4%x50%)以避免产生“修剪”图像。

  • 在批处理文件中,您需要将百分号加倍才能使其按预期工作:

    convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%%02d.jpg
    
  • 如果你正在写入可以具有图像/画布偏移量的格式(例如.png),你可能希望包括+重新分页在您的之后-crop

    convert -crop 3x2@ +repage -scene 1 image1.jpg image2.jpg cropped_%02d.png
    
  • +repage如果您的输入格式可以包含图像/画布偏移,您可能也需要这些。


重命名

是否可以根据上述顺序自动编号?

仅使用 ImageMagick,我无法做到这一点(我怀疑这不太可能,但老实说我对此并不确定)。当然,如果不使用 ImageMagick,这是完全可能的。

由于您已将这个问题标记为batch,因此值得一提的是,我可能无法批量提供任何好的解决方案。考虑到这一点,您(或其他人)很可能能够想出比我下面详述的更好的解决方案。

强制性批量(非)答案

可以使用批处理强制重命名。首先,临时重命名每个文件(第一个和最后一个除外),例如:

rename cropped_02.jpg  cropped_02_temp.jpg 
[...]
rename cropped_11.jpg  cropped_11_temp.jpg 

然后将它们重命名回新的位置,例如:

rename cropped_02_temp.jpg  cropped_03.jpg
rename cropped_03_temp.jpg  cropped_05.jpg 
rename cropped_04_temp.jpg  cropped_07.jpg 
rename cropped_05_temp.jpg  cropped_09.jpg 
rename cropped_06_temp.jpg  cropped_11.jpg 
rename cropped_07_temp.jpg  cropped_02.jpg 
rename cropped_08_temp.jpg  cropped_04.jpg 
rename cropped_09_temp.jpg  cropped_06.jpg 
rename cropped_10_temp.jpg  cropped_08.jpg 
rename cropped_11_temp.jpg  cropped_10.jpg 

Batch 能够从命令行获取参数并进行数学运算,还具有for循环和if语句等,因此该解决方案可以(显然)得到改进。


重命名笔记

如果您查看上述重命名过程的后半部分,您会注意到文件名中存在某种模式。实际上,对于给定的位置 N,我们可以使用以下两个公式之一来查找项目在您的方案中的新位置:

  • 到达“中间”点的项目(例如 2-6): (Position_N * 2) - 1
  • 超出“中间”点的商品(例如 7-11): (Position_N * 2) - Total_Items

注意:虽然可以将这些公式应用于整个序列(例如 1 和 12),但第一项和最后一项永远不会改变位置。可以说,这使得重命名它们变得没有必要。


此外,这些应该适用于任何甚至(非奇数)项目/位置的数量(4 或更大),假设您的文件名是有序的(例如 1 到 12)。因此,对于您的原始示例:

Temp Item 2 becomes (2 * 2) - 1  = Item 3
Temp Item 7 becomes (7 * 2) - 12 = Item 2
Temp Item 8 becomes (8 * 2) - 12 = Item 4
[...]

因此,给出的公式可能成为批处理(或其他脚本)解决方案的基础。但是,如果您决定这样使用它们,还要注意其他几点……

排序

排序(如上所述)在脚本等方面可能会产生实际影响,因为 Windows 返回的“无序”项目会“破坏”给定的公式。特别是:

  • Windows 按以下方式对姓名进行排序辞典编纂的0默认按顺序排列。这意味着在单个数字前面没有 的项目(例如图片1.jpg对阵图片01.jpg) 在 Windows 直接返回时不会按 (自然) 顺序出现。也就是说,它们将返回为例如:

    cropped_1.jpg, cropped_10.jpg, cropped_11.jpg, cropped_12.jpg, cropped_2.jpg, etc.
    
  • 文件名中的某些单词和短语(例如- Copy)也会影响文件名的返回顺序。

如果您使用上述公式,请确保0在文件名中使用 -pad 单个数字并删除类似的内容- Copy(或采取其他措施缓解这些问题)。

以 0 开始的循环/计数器

如果您使用的语言以0(例如,循环)开始计数,那么这可能会稍微改变公式:

  • 到达“中间”点的项目(例如 1-5): (Position_N * 2)
  • 超出“中间”点的项目(例如 6-10): (Position_N * 2) - (Total_Items - 1)

请记住,从 0 开始数,将运行 12 个项目0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11


Python 脚本

如果你有兴趣,我写了一篇小文章(可能很糟糕)Python 脚本适用于 Python 3.x(已使用 3.6.4 测试),可以从命令行使用它来重命名按顺序排列的任意文件(例如裁剪后_01.jpg...裁剪_XX.jpg)按照问题中指定的顺序进行操作。您需要有一份 Python 副本如果您决定尝试一下,请安装。

限制

  • 不从文本文件中读取信息(因此此时不指定文件列表)。同样,命令行需要图像/文件名前缀和扩展名。

  • 正如所料,脚本希望文件名能够自动以正确的顺序返回(请参阅0上面的 Windows 和 -padding)。

  • 如果您的项目未使用-padded,则可以使用名为 的第三方模块natsort(例如使用 进行安装) 。但是,安装后,您需要取消注释脚本中的第 13 行 ( ) 和第 105 行 ( )才能使用此选项。python -m pip install natsort0from natsort import natsorteditem_list = list(natsorted(item_list))natsort

更明确地说,“取消注释”意味着删除#行首的空格。脚本中包含了其他使用说明。

相关内容