欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python將多張圖片合并成一張圖片的過程

 更新時間:2024年03月12日 08:56:21   作者:zhaojiafu666  
這篇文章主要介紹了python將多張圖片合并成一張圖片的全過程,文中通過代碼示例和圖文給大家講解的非常詳細,對大家學(xué)習(xí)使用python將多張圖片合并成一張圖片有一定的幫助,需要的朋友可以參考下

說明:

今天想著把圖片如何合并成一張圖片,然后我就搜到了一篇博客,博主寫的很好,我仔細看了,還能用,就是效果不太好(就是原圖的形狀比例變了,看著很不爽),然后我重新優(yōu)化了下。

合并圖片的三個過程

1、參考原博主的:

import os

import PIL.Image as Image

IMAGES_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'  # 圖片轉(zhuǎn)換后的地址

# 獲取圖片集地址下的所有圖片名稱
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
               os.path.splitext(name)[1] == item]

print("image_names", image_names)
# 簡單的對于參數(shù)的設(shè)定和實際圖片集的大小進行數(shù)量判斷
if len(image_names) != IMAGE_ROW * IMAGE_COLUMN:
    raise ValueError("合成圖片的參數(shù)和要求的數(shù)量不能匹配!")


# 定義圖像拼接函數(shù)
def image_compose():
    to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE))  # 創(chuàng)建一個新圖
    # 循環(huán)遍歷,把每張圖片按順序粘貼到對應(yīng)位置上
    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()  # 調(diào)用函數(shù)

我的原圖片:

在這里插入圖片描述

在這里插入圖片描述

其實這個代碼有倆個我覺得要優(yōu)化的地方:

第一個就是:要求的圖片的數(shù)量,我想改成合并的圖片的列自己定義,行隨著數(shù)量的增加自動往下增加。

第二個就是:我想把原圖片的形狀保持不變。

2、優(yōu)化第一個數(shù)量問題:

這個代碼改動較少,不過已經(jīng)達到了數(shù)量問題。

import os

import PIL.Image as Image

IMAGES_PATH = r'E:\000photo\漫畫柜\\'  # 圖片集地址
IMAGES_FORMAT = ['.jpg', '.JPG']  # 圖片格式
IMAGE_SIZE = 256  # 每張小圖片的大小

IMAGE_COLUMN = 5  # 圖片間隔,也就是合并成一張圖后,一共有幾列
IMAGE_SAVE_PATH = r'E:\000photo\漫畫柜final.jpg'  # 圖片轉(zhuǎn)換后的地址
# 獲取圖片集地址下的所有圖片名稱
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
               os.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 + 1

print("image_names", image_names)


# 定義圖像拼接函數(shù)
def image_compose():
    to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE))  # 創(chuàng)建一個新圖
    # 循環(huán)遍歷,把每張圖片按順序粘貼到對應(yīng)位置上
    total_num = 0
    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))
            total_num += 1
            if total_num == len(image_names):
                break
    return to_image.save(IMAGE_SAVE_PATH)  # 保存新圖


image_compose()  # 調(diào)用函數(shù)


在這里插入圖片描述

可以看到,當(dāng)我圖片不是正好是行列的倍數(shù)時,不影響圖片的拼接合并。

3、優(yōu)化倆個問題(數(shù)量不限+性狀按比例變?。?/h3>

這個代碼幾乎全部改了,我重新按自己想要的效果邏輯改動的,最后合并的像素寬和高是從圖片列表中去80%的位置圖片的寬和高(排序之后),這樣可以百分之80的圖片是完全顯示的,可能其他的不是全部顯示,但是原圖的形狀是沒有變化。

import os

import PIL.Image as Image


def resize_by_width(infile, image_size):
    """按照寬度進行所需比例縮放"""
    im = Image.open(infile)
    (x, y) = im.size
    lv = round(x / image_size, 2) + 0.01
    x_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 out


def get_new_img_xy(infile, image_size):
    """返回一個圖片的寬、高像素"""
    im = Image.open(infile)
    (x, y) = im.size
    lv = round(x / image_size, 2) + 0.01
    x_s = x // lv
    y_s = y // lv
    # print("x_s", x_s, y_s)
    # out = im.resize((x_s, y_s), Image.ANTIALIAS)
    return x_s, y_s


# 定義圖像拼接函數(shù)
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))  # 創(chuàng)建一個新圖
    # 循環(huán)遍歷,把每張圖片按順序粘貼到對應(yīng)位置上
    total_num = 0
    for 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 += 1
            if total_num == len(image_names):
                break
    return 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_list


def 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)  # 圖片轉(zhuǎn)換后的地址
    # image_rownum = 4  # 圖片間隔,也就是合并成一張圖后,一共有幾行
    image_rownum_yu = len(image_fullpath_list) % image_colnum
    if image_rownum_yu == 0:
        image_rownum = len(image_fullpath_list) // image_colnum
    else:
        image_rownum = len(image_fullpath_list) // image_colnum + 1

    x_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)  # 調(diào)用函數(shù)
    # 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、優(yōu)化黑行高度問題

最近有三個小伙伴私信我,說黑白行問題,今天決定再擼下一年多前的代碼。

然后開始過一遍之前的代碼,發(fā)現(xiàn)之前有個地方寫錯了,我當(dāng)時也沒有發(fā)現(xiàn),竟然這么多人看我代碼了,也沒有懂Python的小伙伴給我提醒下么???

主要就是之前的:

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

這個地方x_list應(yīng)該是y_list,改下就可以了。

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

感覺小伙伴們也不咋動手,我還是吧完整的粘貼出來吧。

import os

import PIL.Image as Image


def resize_by_width(infile, image_size):
    """按照寬度進行所需比例縮放"""
    im = Image.open(infile)
    (x, y) = im.size
    lv = round(x / image_size, 2) + 0.01
    x_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 out


def get_new_img_xy(infile, image_size):
    """返回一個圖片的寬、高像素"""
    im = Image.open(infile)
    (x, y) = im.size
    lv = round(x / image_size, 2) + 0.01
    x_s = x // lv
    y_s = y // lv
    # print("x_s", x_s, y_s)
    # out = im.resize((x_s, y_s), Image.ANTIALIAS)
    return x_s, y_s


# 定義圖像拼接函數(shù)
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))  # 創(chuàng)建一個新圖
    # 循環(huán)遍歷,把每張圖片按順序粘貼到對應(yīng)位置上
    total_num = 0
    for 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 += 1
            if total_num == len(image_names):
                break
    return 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_list


def 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)  # 圖片轉(zhuǎn)換后的地址
    # image_rownum = 4  # 圖片間隔,也就是合并成一張圖后,一共有幾行
    image_rownum_yu = len(image_fullpath_list) % image_colnum
    if image_rownum_yu == 0:
        image_rownum = len(image_fullpath_list) // image_colnum
    else:
        image_rownum = len(image_fullpath_list) // image_colnum + 1

    x_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)  # 調(diào)用函數(shù)
    # 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\趙麗穎壁紙_-_國內(nèi)版_Bing_images'  # 圖片集地址
    image_size = 128  # 每張小圖片的大小
    image_colnum = 10  # 合并成一張圖后,一行有幾個小圖
    merge_images(image_dir_path, image_size, image_colnum)
    

給大家上個效果圖:

在這里插入圖片描述

5、合成圖片不清晰問題:

這個主要是像素同比例縮小導(dǎo)致的,我這里image_size = 128 ,該我720,就特別清晰了。

在這里插入圖片描述

總結(jié)下:

給學(xué)習(xí)編程的小伙伴一個建議:學(xué)習(xí)人家代碼時候,大家可以先讀懂人家的代碼,自己嘗試修改,看效果。

最后可以看出,原圖片的形狀沒有變化,至此,黑白問題已經(jīng)修改。

以上就是python將多張圖片合并成一張圖片的過程的詳細內(nèi)容,更多關(guān)于python多張圖片合成的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python讀取Json字典寫入Excel表格的方法

    Python讀取Json字典寫入Excel表格的方法

    這篇文章主要為大家詳細介紹了Python讀取Json字典寫入Excel表格的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Python混合使用同步和異步函數(shù)的方法

    Python混合使用同步和異步函數(shù)的方法

    Python是一種非常靈活的編程語言,可以混合使用同步和異步函數(shù)來實現(xiàn)更高效的編程。本文將介紹如何在Python中混合使用同步和異步函數(shù),以及如何在不同場景下選擇合適的函數(shù),感興趣的可以了解一下
    2023-03-03
  • Python實現(xiàn)設(shè)置windows桌面壁紙代碼分享

    Python實現(xiàn)設(shè)置windows桌面壁紙代碼分享

    這篇文章主要介紹了Python實現(xiàn)設(shè)置windows桌面壁紙,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • python中實現(xiàn)控制小數(shù)點位數(shù)的方法

    python中實現(xiàn)控制小數(shù)點位數(shù)的方法

    今天小編就為大家分享一篇python中實現(xiàn)控制小數(shù)點位數(shù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python 正則表達式中re.group()使用小結(jié)

    Python 正則表達式中re.group()使用小結(jié)

    正則表達式是在處理字符串時非常有用的工具,而re.group()是在匹配到的文本中提取特定分組內(nèi)容的方法之一,這篇文章主要介紹了Python 正則表達式之re.group()用法,需要的朋友可以參考下
    2024-01-01
  • 詳解Python并發(fā)編程之創(chuàng)建多線程的幾種方法

    詳解Python并發(fā)編程之創(chuàng)建多線程的幾種方法

    這篇文章主要介紹了詳解Python并發(fā)編程之創(chuàng)建多線程的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • YOLOV5代碼詳解之損失函數(shù)的計算

    YOLOV5代碼詳解之損失函數(shù)的計算

    YOLOV4出現(xiàn)之后不久,YOLOv5橫空出世,YOLOv5在YOLOv4算法的基礎(chǔ)上做了進一步的改進,檢測性能得到進一步的提升,這篇文章主要給大家介紹了關(guān)于YOLOV5代碼詳解之損失函數(shù)計算的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 如何用Python來搭建一個簡單的推薦系統(tǒng)

    如何用Python來搭建一個簡單的推薦系統(tǒng)

    這篇文章主要介紹了如何用Python來搭建一個簡單的推薦系統(tǒng),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python使用pynlpir進行中文分詞并保留段落信息

    Python使用pynlpir進行中文分詞并保留段落信息

    nlpir是由張華平博士開發(fā)的中文自然處理工具,可以對中文文本進行分詞、聚類分析等,本文主要介紹了使用pynlpir進行中文分詞并保留段落信息的具體方法,希望對大家有所幫助
    2024-03-03
  • Python如何使用vars返回對象的屬性列表

    Python如何使用vars返回對象的屬性列表

    這篇文章主要介紹了Python如何使用vars返回對象的屬性列表,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10

最新評論