如何在命令行中合并图像?

161
我想尝试 CSS Sprite 技术,将几个缩略图作为单个图像加载。因此,我需要在服务器离线将几个缩略图“合并”成一个文件。 假设我有10个相同大小的缩略图。您会建议我如何从Linux命令行“合并”它们?

考虑使用montage -geometry +1+1 01.jpg 02.jpg theproblem.jpg进行拼接。 - VojtaK
4个回答

320

你也可以尝试使用ImageMagick来创建CSS精灵,这是一个非常好的选择。关于它的一些教程可以在这里找到。

示例(垂直精灵):

convert image1.png image2.png image3.png -append result/result-sprite.png

示例(横向精灵图):

convert image1.png image2.png image3.png +append result/result-sprite.png

52
注意:这将生成一个纵向精灵图,如果需要横向精灵图,请使用“+append”而不是“-append”。 - Chango
24
如果你懒得一个一个输入命令,可以使用 convert -append *.png out.png 命令进行操作。该命令会将所有的 PNG 图片纵向拼接成一张图片,并将结果保存为 out.png 文件。 - Chillar Anand
3
这个可以运行,但对于大文件需要很长时间。有没有更快的合成方法? - Vlad Tsepelev
2
@VladTsepelev 连接大量PNG意味着需要对它们进行解码(转换为像素图)以进行操作,最后再次编码。如果您经常想要扩展现有的精灵,则保留已解码的像素图版本可能会加快速度。请参见我的答案,使用PNM工具来执行此操作。但是,像素图版本比PNG大得多,因此请预计使用更多存储空间。 - Alfe
2
它说: ´convert-im6.q16: 宽度或高度超过了限制 `ktwo201121817-c102_lpd-targ.fits_autoaper.png' @ error/cache.c/OpenPixelCache/3839.´ - zabop
显示剩余4条评论

43

您还可以使用GraphicsMagick,它是ImageMagick的轻量级和更快速的分支:

gm convert image1.png image2.png -append combined.png

合并12张图片的简单时间比较:

time convert image{1..12}.jpg -append test.jpg

real    0m3.178s
user    0m3.850s
sys     0m0.376s

time gm convert image{1..12}.jpg -append test.jpg

real    0m1.912s
user    0m2.198s
sys     0m0.766s

GraphicsMagick几乎比ImageMagick快两倍。


13

使用 netpbm 包中的 pnmcat 命令。

你可能需要将输入文件进行转换才能使用它:

pnmcat -lr <(pngtopnm 1.png) <(pngtopnm 2.png) | pnmtopng > all.png

编辑: 正如用户Hashbrown在评论中指出的那样,这可能会对PNG文件的大小和/或透明度造成问题。为了避免这种情况,他提出了以下解决方案(在此只是复制一下,因为该问题已关闭,不能添加新答案):

pnmcat -jleft -tb \
    <(pngtopnm image139.png) \
    <(pngtopnm image73.png) \
| pnmtopng \
    -alpha <(pnmcat -black -jleft -tb \
        <(pngtopnm -alpha image139.png) \
        <(pngtopnm -alpha image73.png) \
    ) \
>test.png

虽然我没有测试那个解决方案。


1
使用-tb来处理垂直精灵,并使用-jtop(或-jleft用于-tb)将不同大小的精灵对齐到轴上(默认为中心!)。如果它们是相同大小的,我不会使用pnmcat,而是使用pnmundice,因为它支持PAM(因此支持透明度)。但是,如果您的输入png具有透明度和/或希望不同大小的图像之间的剩余空间是透明的,则需要像这样使用pnmcat(由于问题已关闭,我无法自己回答)。 - Hashbrown
1
我喜欢这个答案:“pnmcat|pnmtopng”生成的文件比“<gm/im> convert”小得多。 - Hashbrown
1
@Hashbrown,非常好的补充!我冒昧将您的代码复制到我的答案中,因为不能再添加新答案了(顺便说一句,这很奇怪)。是的,所有这些pnm工具都很混乱,有些支持pam,有些不支持等等。 - Alfe

6
如果您喜欢从左到右合并图片,请使用以下命令:
convert image{1..0}.png +append result/result-sprite.png

请注意使用+append而不是-append

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接