python将多张图片合并成一张图片

article/2025/11/9 19:50:18

文章目录

  • 说明:
  • 合并图片的三个过程
    • 1、参考原博主的:
    • 2、优化第一个数量问题:
    • 3、优化俩个问题(数量不限+性状按比例变小)
    • 4、优化黑行高度问题
    • 5、合成图片不清晰问题:
    • 总结下:

说明:

今天想着把图片如何合并成一张图片,然后我就搜到了一篇博客,博主写的很好,我仔细看了,还能用,就是效果不太好(就是原图的形状比例变了,看着很不爽),然后我重新优化了下。

合并图片的三个过程

1、参考原博主的:

参考博文地址

import osimport PIL.Image as ImageIMAGES_PATH = r'E:\000photo\漫画柜\\'  # 图片集地址
IMAGES_FORMAT = ['.jpg', '.JPG']  # 图片格式
IMAGE_SIZE = 256  # 每张小图片的大小
IMAGE_ROW = 4  # 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_COLUMN = 6  # 图片间隔,也就是合并成一张图后,一共有几列
IMAGE_SAVE_PATH = r'E:\000photo\漫画柜\final.jpg'  # 图片转换后的地址# 获取图片集地址下的所有图片名称
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT ifos.path.splitext(name)[1] == item]print("image_names", image_names)
# 简单的对于参数的设定和实际图片集的大小进行数量判断
if len(image_names) != IMAGE_ROW * IMAGE_COLUMN:raise ValueError("合成图片的参数和要求的数量不能匹配!")# 定义图像拼接函数
def image_compose():to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE))  # 创建一个新图# 循环遍历,把每张图片按顺序粘贴到对应位置上for y in range(1, IMAGE_ROW + 1):for x in range(1, IMAGE_COLUMN + 1):from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize((IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS)to_image.paste(from_image, ((x - 1) * IMAGE_SIZE, (y - 1) * IMAGE_SIZE))return to_image.save(IMAGE_SAVE_PATH)  # 保存新图image_compose()  # 调用函数

我的原图片:
在这里插入图片描述

在这里插入图片描述

其实这个代码有俩个我觉得要优化的地方:

第一个就是:要求的图片的数量,我想改成合并的图片的列自己定义,行随着数量的增加自动往下增加。
第二个就是:我想把原图片的形状保持不变。

2、优化第一个数量问题:

这个代码改动较少,不过已经达到了数量问题。


import osimport PIL.Image as ImageIMAGES_PATH = r'E:\000photo\漫画柜\\'  # 图片集地址
IMAGES_FORMAT = ['.jpg', '.JPG']  # 图片格式
IMAGE_SIZE = 256  # 每张小图片的大小IMAGE_COLUMN = 5  # 图片间隔,也就是合并成一张图后,一共有几列
IMAGE_SAVE_PATH = r'E:\000photo\漫画柜final.jpg'  # 图片转换后的地址
# 获取图片集地址下的所有图片名称
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT ifos.path.splitext(name)[1] == item]
# IMAGE_ROW = 4  # 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_ROW_yu = len(image_names) % IMAGE_COLUMN
if IMAGE_ROW_yu == 0:IMAGE_ROW = len(image_names) // IMAGE_COLUMN
else:IMAGE_ROW = len(image_names) // IMAGE_COLUMN + 1print("image_names", image_names)# 定义图像拼接函数
def image_compose():to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE))  # 创建一个新图# 循环遍历,把每张图片按顺序粘贴到对应位置上total_num = 0for y in range(1, IMAGE_ROW + 1):for x in range(1, IMAGE_COLUMN + 1):from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize((IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS)to_image.paste(from_image, ((x - 1) * IMAGE_SIZE, (y - 1) * IMAGE_SIZE))total_num += 1if total_num == len(image_names):breakreturn to_image.save(IMAGE_SAVE_PATH)  # 保存新图image_compose()  # 调用函数

在这里插入图片描述

可以看到,当我图片不是正好是行列的倍数时,不影响图片的拼接合并。

3、优化俩个问题(数量不限+性状按比例变小)

这个代码几乎全部改了,我重新按自己想要的效果逻辑改动的,最后合并的像素宽和高是从图片列表中去80%的位置图片的宽和高(排序之后),这样可以百分之80的图片是完全显示的,可能其他的不是全部显示,但是原图的形状是没有变化。

import osimport PIL.Image as Imagedef resize_by_width(infile, image_size):"""按照宽度进行所需比例缩放"""im = Image.open(infile)(x, y) = im.sizelv = round(x / image_size, 2) + 0.01x_s = int(x // lv)y_s = int(y // lv)print("x_s", x_s, y_s)out = im.resize((x_s, y_s), Image.ANTIALIAS)return outdef get_new_img_xy(infile, image_size):"""返回一个图片的宽、高像素"""im = Image.open(infile)(x, y) = im.sizelv = round(x / image_size, 2) + 0.01x_s = x // lvy_s = y // lv# print("x_s", x_s, y_s)# out = im.resize((x_s, y_s), Image.ANTIALIAS)return x_s, y_s# 定义图像拼接函数
def image_compose(image_colnum, image_size, image_rownum, image_names, image_save_path, x_new, y_new):to_image = Image.new('RGB', (image_colnum * x_new, image_rownum * y_new))  # 创建一个新图# 循环遍历,把每张图片按顺序粘贴到对应位置上total_num = 0for y in range(1, image_rownum + 1):for x in range(1, image_colnum + 1):from_image = resize_by_width(image_names[image_colnum * (y - 1) + x - 1], image_size)# from_image = Image.open(image_names[image_colnum * (y - 1) + x - 1]).resize((image_size,image_size ), Image.ANTIALIAS)to_image.paste(from_image, ((x - 1) * x_new, (y - 1) * y_new))total_num += 1if total_num == len(image_names):breakreturn to_image.save(image_save_path)  # 保存新图def get_image_list_fullpath(dir_path):file_name_list = os.listdir(dir_path)image_fullpath_list = []for file_name_one in file_name_list:file_one_path = os.path.join(dir_path, file_name_one)if os.path.isfile(file_one_path):image_fullpath_list.append(file_one_path)else:img_path_list = get_image_list_fullpath(file_one_path)image_fullpath_list.extend(img_path_list)return image_fullpath_listdef merge_images(image_dir_path,image_size,image_colnum):# 获取图片集地址下的所有图片名称image_fullpath_list = get_image_list_fullpath(image_dir_path)print("image_fullpath_list", len(image_fullpath_list), image_fullpath_list)image_save_path = r'{}.jpg'.format(image_dir_path)  # 图片转换后的地址# image_rownum = 4  # 图片间隔,也就是合并成一张图后,一共有几行image_rownum_yu = len(image_fullpath_list) % image_colnumif image_rownum_yu == 0:image_rownum = len(image_fullpath_list) // image_colnumelse:image_rownum = len(image_fullpath_list) // image_colnum + 1x_list = []y_list = []for img_file in image_fullpath_list:img_x, img_y = get_new_img_xy(img_file, image_size)x_list.append(img_x)y_list.append(img_y)print("x_list", sorted(x_list))print("y_list", sorted(y_list))x_new = int(x_list[len(x_list) // 5 * 4])y_new = int(x_list[len(y_list) // 5 * 4])image_compose(image_colnum, image_size, image_rownum, image_fullpath_list, image_save_path, x_new, y_new)  # 调用函数# for img_file in image_fullpath_list:#     resize_by_width(img_file,image_size)if __name__ == '__main__':image_dir_path = r'E:\000photo\美女'  # 图片集地址image_size = 128  # 每张小图片的大小image_colnum = 10  # 合并成一张图后,一行有几个小图merge_images(image_dir_path, image_size, image_colnum)

因为图片整的比较多。
在这里插入图片描述
截图小部分:
在这里插入图片描述

最后可以看出,原图片的形状没有变化,至此,弄了俩个小时,总算弄成我想要的效果了。

如果觉得不错,欢迎点赞+关注

4、优化黑行高度问题

最近有三个小伙伴私信我,说黑白行问题,今天决定再撸下一年多前的代码。

然后开始过一遍之前的代码,发现之前有个地方写错了,我当时也没有发现,竟然这么多人看我代码了,也没有懂Python的小伙伴给我提醒下么???

主要就是之前的:

y_new = int(x_list[len(y_list) // 5 * 4])

这个地方x_list应该是y_list,改下就可以了。

y_new = int(y_list[len(y_list) // 5 * 4])

感觉小伙伴们也不咋动手,我还是吧完整的粘贴出来吧。

import osimport PIL.Image as Imagedef resize_by_width(infile, image_size):"""按照宽度进行所需比例缩放"""im = Image.open(infile)(x, y) = im.sizelv = round(x / image_size, 2) + 0.01x_s = int(x // lv)y_s = int(y // lv)print("x_s", x_s, y_s)out = im.resize((x_s, y_s), Image.ANTIALIAS)return outdef get_new_img_xy(infile, image_size):"""返回一个图片的宽、高像素"""im = Image.open(infile)(x, y) = im.sizelv = round(x / image_size, 2) + 0.01x_s = x // lvy_s = y // lv# print("x_s", x_s, y_s)# out = im.resize((x_s, y_s), Image.ANTIALIAS)return x_s, y_s# 定义图像拼接函数
def image_compose(image_colnum, image_size, image_rownum, image_names, image_save_path, x_new, y_new):to_image = Image.new('RGB', (image_colnum * x_new, image_rownum * y_new))  # 创建一个新图# 循环遍历,把每张图片按顺序粘贴到对应位置上total_num = 0for y in range(1, image_rownum + 1):for x in range(1, image_colnum + 1):from_image = resize_by_width(image_names[image_colnum * (y - 1) + x - 1], image_size)# from_image = Image.open(image_names[image_colnum * (y - 1) + x - 1]).resize((image_size,image_size ), Image.ANTIALIAS)to_image.paste(from_image, ((x - 1) * x_new, (y - 1) * y_new))total_num += 1if total_num == len(image_names):breakreturn to_image.save(image_save_path)  # 保存新图def get_image_list_fullpath(dir_path):file_name_list = os.listdir(dir_path)image_fullpath_list = []for file_name_one in file_name_list:file_one_path = os.path.join(dir_path, file_name_one)if os.path.isfile(file_one_path):image_fullpath_list.append(file_one_path)else:img_path_list = get_image_list_fullpath(file_one_path)image_fullpath_list.extend(img_path_list)return image_fullpath_listdef merge_images(image_dir_path,image_size,image_colnum):# 获取图片集地址下的所有图片名称image_fullpath_list = get_image_list_fullpath(image_dir_path)print("image_fullpath_list", len(image_fullpath_list), image_fullpath_list)image_save_path = r'{}.jpg'.format(image_dir_path)  # 图片转换后的地址# image_rownum = 4  # 图片间隔,也就是合并成一张图后,一共有几行image_rownum_yu = len(image_fullpath_list) % image_colnumif image_rownum_yu == 0:image_rownum = len(image_fullpath_list) // image_colnumelse:image_rownum = len(image_fullpath_list) // image_colnum + 1x_list = []y_list = []for img_file in image_fullpath_list:img_x, img_y = get_new_img_xy(img_file, image_size)x_list.append(img_x)y_list.append(img_y)print("x_list", sorted(x_list))print("y_list", sorted(y_list))x_new = int(x_list[len(x_list) // 5 * 4])y_new = int(y_list[len(y_list) // 5 * 4])print(" x_new, y_new", x_new, y_new)image_compose(image_colnum, image_size, image_rownum, image_fullpath_list, image_save_path, x_new, y_new)  # 调用函数# for img_file in image_fullpath_list:#     resize_by_width(img_file,image_size)if __name__ == '__main__':image_dir_path = r'C:\Users\user\Downloads\archives\赵丽颖壁纸_-_国内版_Bing_images'  # 图片集地址image_size = 128  # 每张小图片的大小image_colnum = 10  # 合并成一张图后,一行有几个小图merge_images(image_dir_path, image_size, image_colnum)

给大家上个效果图:
在这里插入图片描述

5、合成图片不清晰问题:

这个主要是像素同比例缩小导致的,我这里image_size = 128 ,该我720,就特别清晰了。
在这里插入图片描述

总结下:

给学习编程的小伙伴一个建议:学习人家代码时候,大家可以先读懂人家的代码,自己尝试修改,看效果。

最后可以看出,原图片的形状没有变化,至此,黑白问题已经修改。

如果觉得不错,欢迎点赞+关注哈


http://chatgpt.dhexx.cn/article/GH7r7gpm.shtml

相关文章

如何把一张图片分割成几张

把一张图片分割成几张的方法: 工具/原料:硬件:电脑、软件:Photoshop 7.0、系统:Windows10专业版64位操作系统。 1、打开平PS,进入新建文档里面,然后把图片直接拉到界面中。或者直接打开图片。 2…

jpg怎么合成一份_如何将多张图片合成一个文件

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。 将多张图片合成一个文件的方法是: 1、将所有图片拖到一个文件夹里,鼠标右键点击“添加压缩”。 2、点击确定,这样就成了一个文件。 计算机(compu…

怎样能把两张照片拼成一张图片,5种工具分享

怎样能把两张照片拼成一张图片?图片拼合的应用场景是很多的。比如将几张相册中的照片拼成一张合影、将多个地图截图拼合在一起形成一个更大的区域地图、将多个漫画图像合并成一本漫画册等。这项技术可以方便地将多张图片整合为一张,节省时间和精力。 因此…

怎么将几张照片合成一张图片,简单步骤易学

怎么将几张照片合成一张图片?在当代社会,图片已经成为了人们生活和工作中不可或缺的重要元素。无论是在网上浏览、社交媒体、电商平台、还是在企业营销、科研教育、娱乐创作等各种场合中,都有着广泛的应用。而将不同的图片进行合并&#xff0…

多张图片怎么合成一个pdf?

多张图片怎么合成一个pdf?相信大家和我一样,每天的工作或者生活学习都离不开pdf文件,因为pdf文件拥有更好的稳定性和安全性,不管是在电脑还是在其他设备上,都能正常的打开,而且pdf文件不易编辑的特性&#…

如何把两张图片拼在一起?

如何把两张图片拼在一起?一般来说,如果我们的照片只是简单处理的话,我们在手机上使用一些小软件就能完成,比如我们常使用的秀秀。但是如果说我们需要合成的照片是比较大的,那种专业相机拍出来的像素比较高。这种情况下…

多张图片合成一张jpg工具_如何将两张图片合成一张图片?

您可能感兴趣的话题: 美图秀秀 核心提示:图片叠加的方法也有几种,小编认为最好用、效果最好的是美图秀秀抠图叠加法。 看到许多网友焦急的询问一些图片处理方面的问题,一时又没人给点温馨的帮助,一向助人为乐的小编就坐…

多张图片怎么合成一个pdf文件?

小编作为一个上班族,每天会涉及到很多的图片文件,日积月累图片文件的整理和保存是一个任务艰巨的工作。那么如何更好的管理这些图片文件呢?小编有个好方法就是将有关系的某些图片文件全部整理到一个PDF文件内,这样一个类别的PDF包…

三张图片怎么拼成一张?

三张图片怎么拼成一张图片?相信大家平时都有往朋友圈分享图片的经历,朋友圈的九宫格是大部分人分享日常的常用方式,那如果大家想要分享的照片超过九张,就需要将图片拼接一下再发,这样就可以分享多张照片了。比如我将三…

怎么把多张图片合成为一张?

将多张图片合成为一张图片是在很多场合下都非常有必要的,例如设计制作等。其中,合成图片的关键性和重要性主要包括以下几点:首先,保证合并后的图片质量。在进行多张图片合成时,需要保证图片大小和分辨率的统一&#xf…

Python实现多张图片合成一张马赛克图片

前言 最近有网友私信我,问如何把多张图片合成一张马赛克图片的样子 说是女儿从出生到现在,所有的照片,大概有上百张,所以想使用这些照片合成一张,当做生日礼物 那我们今天就用上次爬表情包的图片来做一次马赛克图片…

两张图片怎样合成一张左右拼图?

相信很多小伙伴的手机和电脑上都储存了一定数量的图片,在使用这些图片的时候,因为一些需要有时候我们要将图片拼在一起使用,数量多的时候我们可以拼成长竖图或者长横图,当然也可以借助拼接软件里面的模板进行自由选择拼接。但是如…

怎么将三张图片合成一张图片?

怎么将三张图片合成一张图片?遇到这个问题,我们其实有很多方法来处理。我们首当其冲想到的是其中最常见的,可以使用我们手机的APP来处理,比如某秀秀等。但是此方法比较适合于尺寸比较小的图片进行合并,如果图片比较大的…

如何拼接多张图片,多张图片拼接成一张

如何拼接多张图片,多张图片拼接成一张?小编作为一名互联网行业的从业者,每天都需要使用到很多的图片,那么自然也需要对图片做各种不同的处理,例如格式转换、修改尺寸等。除了这些之外我还经常需要对图片进行拼接&#…

如何将两张图片上下合成一张?

如何将两张图片上下合成一张?不知道大家有没有遇到过这样的情况,工作中需要将两张图片上传到某个网站上,但是网站只能允许上传一张图片,相信很多小伙伴都有过这样的经历吧。这个时候大家会怎么办呢?有什么方法可以解决…

PhotoShop简单案例(3)——利用ps实现多图合成(多张小图片拼成一张大图片)

目录 一、项目介绍二、预处理2.1 图片裁剪2.2 多图裁剪2.3.1 新建动作2.3.2 图片裁剪2.3.3 批量裁剪 三、基本流程3.1 图像裁剪3.2 联系表3.3 图案填充3.4 其他 四、效果演示 一、项目介绍 本文将介绍利用ps实现多图合成(多张小图片拼成一张大图片)&…

如何把几张图片整合到一张图片?

如何把几张图片整合到一张图片?整合图片,也就是把几张图片拼接到一起,关于这样的方法,我想各位小伙伴或多或少都有一些自己的整合方法,鉴于每一种方法的转换效果和效率不同,可能有些小伙伴不再满足自己所使…

如何将多张图片拼成一张图?

如何将多张图片拼成一张图?作为一名幼儿园老师,为满足家长内心需要,我们每天都会给宝贝们拍多张不同的照片然后传给家长。但是一张一张的传,不仅耗费时间而且很慢,所以我通常都是把多张照片拼接在一起,然后…

如何将两张图片合成一张?

如何将两张图片合成一张?由于工作的原因,我们经常需要在电脑上将图片进行合成,例如将两张图片合并拼接成一张,对于某些小伙伴老说这并不是很难的一件事情,使用ps软件就能将两张图片进行合并,小编之前也是用…

如何把几张图片合并成一张图片?

在我们的日常生活和工作中难免会有把几张照片合成一张图片的需要,那么今天你来到这里就没错了,这里有将图片合成一张图片的简单操作方法,不仅可以合并图片,还可以在软件内直接实现图片格式的转换,压缩,改尺…