水平调整图像大小并合并

时间:2017-07-22 21:41:38

标签: python imagemagick

如何调整图像大小(高度=所有图像高度的平均值)并将它们从左到右水平合并?我正在使用Ubuntu Linux发行版。

3 个答案:

答案 0 :(得分:1)

我尝试了libvips。它是一个流式图像处理库,因此它可以生成输出图像,而无需将所有输入图像加载到内存中。这意味着它可以在非常适中的计算机上生成非常大的图像。

#!/usr/bin/env python

import sys
import pyvips

total_height = 0.0
for filename in sys.argv[2:]:
    tile = pyvips.Image.new_from_file(filename)
    total_height += tile.height
average_height = total_height / len(sys.argv[2:])

image = None
for filename in sys.argv[2:]:
    # "sequential" access hints that we want to stream the image
    tile = pyvips.Image.new_from_file(filename, access="sequential")   
    tile = tile.resize(average_height / tile.height)
    image = tile if not image else image.join(tile, "horizontal")

image.write_to_file(sys.argv[1])

我尝试了一组27张测试jpg图像:

$ time ../avgmerge.py x.tif tiles/*.jpg
loading tiles/ak01.jpg ...
...
loading tiles/curiossmall.jpg ...
writing x.tif ...
real    0m2.742s
user    0m4.800s
sys     0m0.200s
$ vipsheader x.tif
x.tif: 34954x961 uchar, 3 bands, srgb, tiffload

所以使用这个数据集,它在我的普通笔记本电脑上以2.7秒制作了35,000 x 960像素的图像。

答案 1 :(得分:0)

这是Python中的imergh.py脚本,就是这样做的。 Imagemagick是必需的。 请注意,在运行脚本之前,您需要cd进入包含图像的目录。适合查看大图像的一些图像查看器是Viewnior,Nomacs和Gwenview。该脚本将生成一些tmpfXXXX.png图像和一个名为houtputh.png的文件,并带有最终结果。

#!/usr/bin/python

import os

f = os.popen('/bin/ls -1')
fil = f.read()
arfils = fil.split("\n")
arfils.pop()
num = 0
tot = 0

for snc in arfils:
     f = os.popen( "/usr/bin/identify -ping -format '%w %h' " + '\"' + snc + '\"' )
     rslt = f.read()
     woh = rslt.split(" ")
     # 0 for width and 1 for height
     intvl = int(woh[1])
     tot = tot + intvl
     num = num + 1

avg = tot // num

#resize images
num = 1
allfil = ""
for snc in arfils:
    nout = "tmpf" + str(num).zfill(4) + ".png"
    allfil = allfil + nout + " "
    convcmd = "convert " + '\"' + snc + '\"' + " -resize x" + str(avg) + " -quality 100 "
    convcmd = convcmd + '\"' + nout + '\"'
    #print convcmd
    f = os.popen(convcmd)
    num = num + 1

mrg = "convert +append " + allfil + "houtputh.png"
f = os.popen(mrg)

答案 2 :(得分:0)

只使用ImageMagick和bash shell脚本(没有Python)的组合,你可以这样做:

cd path_to/images_folder
list=$(ls *)
i=0
for img in $list; do
htArr[$i]=$(convert -ping $img -format "%h" info:)
i=$((i+1))
done
num=${#htArr[*]}
total_ht=0
for ((i=0; i<num; i++)); do
ht=${htArr[$i]}
total_ht=$((total_ht+ht))
done
average_ht=$(convert xc: -format "%[fx:round($total_ht/$num)]" info:)
convert $list -resize x$average_ht +append result.jpg

填写您的path_to / images_folder并将其复制并粘贴到终端窗口中。