我有一堆扫描成 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
1-如何使用 imagemagick(或任何其他解决方案)根据这些分隔线分割图像?(我可以得到这些线的 x 和 y,因为所有图像都是 2550x3507)
- 拆分后或拆分过程中,是否可以根据上面描述的顺序自动编号?
答案1
如何使用 [ImageMagick?] 根据这些分隔线分割图像
可以说,最简单的解决方案可能是使用-庄稼像这样:
convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg
此命令:
将每幅图像分成 6 个(大致)大小相等的图块(-裁剪 3x2@),并按顺序编号。
编号序列从
1
(-场景 1), 而不是0
。在单个数字 [ ] 中为最终数字添加
0
-padding ( ) 。%02d
01-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 natsort
0
from natsort import natsorted
item_list = list(natsorted(item_list))
natsort
更明确地说,“取消注释”意味着删除#
行首的空格。脚本中包含了其他使用说明。