python实现将文件夹下每10张图片横向拼接成一张图片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yql_617540298/article/details/82050190

说在前面

需求:一个文件夹内有若干图片,可以被10整除,希望每10张图片横向拼接成一张大图。

源码

import os
from PIL import Image

UNIT_SIZE = 96 # 单个图像的大小长度为96
TARGET_WIDTH = 10 * UNIT_SIZE # 拼接完后的横向长度为10*96

path = "C:/Users/Administrator/Desktop/bbbb"
save_path = 'C:/Users/Administrator/Desktop/bbbbb/'
images = [] # 存储图像的名称的列表

for root, dirs, files in os.walk(path):     
    for f in files :
        images.append(f)
    print('images=',images)
for i in range(len(images)/10): # 10个图像为一组
    imagefile = []
    j = 0
    for j in range(10):
        imagefile.append(Image.open(path+'/'+images[i*10+j])) 
    target = Image.new('L', (TARGET_WIDTH, UNIT_SIZE))    
    left = 0
    right = UNIT_SIZE
    for image in imagefile:     
        target.paste(image, (left, 0, right, UNIT_SIZE))# 将image复制到target的指定位置中
        left += UNIT_SIZE # left是左上角的横坐标,依次递增
        right += UNIT_SIZE # right是右下的横坐标,依次递增
        quality_value = 1000 # quality来指定生成图片的质量
        target.save(save_path+os.path.splitext(images[i*10+j])[0]+'.jpg', quality = quality_value)
    imagefile = []

补充

这时可以实现将图片横向拼接,但可能出现的问题是:发现不是按顺序横向连接的。

当我们打印了列表images[]信息发现,名称存储顺序是:1.jpg、10.jpg……,所以我们需要使用python代码将文件夹下的所有图片重命名为00001.jpg这样可以解决这个问题。

源码

from PIL import Image

for i in range(1,3755):
    img = Image.open("C:/Users/Administrator/Desktop/bbbbb/"+str(i)+".jpg")
    img = img.convert("L")
    img = img.resize((96,96))

    img.save("C:/Users/Administrator/Desktop/testresults/"+str(i).zfill(5)+".png", "PNG")

说在后面

如果在执行程序时,发现出现了问题:

原因:在python2,/只留下了整数部分,去掉了小数,是int型。而在python3里,/的结果是真正意义上的除法,结果是float型。所以便出现了Error Message: ‘float’ object cannot be interpreted as an integer。

具体可以查看链接:https://blog.csdn.net/amoscn/article/details/78321137

在可以建立python2.7的虚拟环境,可以解决。

猜你喜欢

转载自blog.csdn.net/yql_617540298/article/details/82050190