最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2024年03月12日 08:56:21   作者:zhaojiafu666  
這篇文章主要介紹了python將多張圖片合并成一張圖片的全過程,文中通過代碼示例和圖文給大家講解的非常詳細,對大家學習使用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ù)量判斷
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)遍歷,把每張圖片按順序粘貼到對應位置上
    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)遍歷,把每張圖片按順序粘貼到對應位置上
    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ù)


在這里插入圖片描述

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

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

這個代碼幾乎全部改了,我重新按自己想要的效果邏輯改動的,最后合并的像素寬和高是從圖片列表中去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)遍歷,把每張圖片按順序粘貼到對應位置上
    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)之前有個地方寫錯了,我當時也沒有發(fā)現(xiàn),竟然這么多人看我代碼了,也沒有懂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 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)遍歷,把每張圖片按順序粘貼到對應位置上
    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、合成圖片不清晰問題:

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

在這里插入圖片描述

總結下:

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

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

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

相關文章

  • Pandas數(shù)據(jù)清洗的實現(xiàn)

    Pandas數(shù)據(jù)清洗的實現(xiàn)

    在處理數(shù)據(jù)的時候,需要對數(shù)據(jù)進行一個清洗過程,本文就來介紹一下Pandas數(shù)據(jù)清洗的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Python高級編程之繼承問題詳解(super與mro)

    Python高級編程之繼承問題詳解(super與mro)

    這篇文章主要介紹了Python高級編程之繼承問題,結合實例形式詳細分析了Python多繼承、MRO順序及super調(diào)用父類等相關操作技巧,需要的朋友可以參考下
    2019-11-11
  • python用turtle庫繪畫圣誕樹

    python用turtle庫繪畫圣誕樹

    大家好,本篇文章主要講的是python用turtle庫繪畫圣誕樹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • flask框架渲染Jinja模板與傳入模板變量操作詳解

    flask框架渲染Jinja模板與傳入模板變量操作詳解

    這篇文章主要介紹了flask框架渲染Jinja模板與傳入模板變量操作,結合實例形式詳細分析了flask框架模板相關原理、模板渲染、傳入?yún)?shù)等相關操作技巧與注意事項,需要的朋友可以參考下
    2020-01-01
  • Python使用貪婪算法解決問題

    Python使用貪婪算法解決問題

    這篇文章主要介紹了Python使用貪婪算法解決問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Python TKinter如何自動關閉主窗口

    Python TKinter如何自動關閉主窗口

    這篇文章主要介紹了Python TKinter如何自動關閉主窗口,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Python使用Spire.XLS for Python輕松實現(xiàn)將Excel轉(zhuǎn)換為PDF

    Python使用Spire.XLS for Python輕松實現(xiàn)將Excel轉(zhuǎn)換為PDF

    在許多商務工作流程中,Excel 文件常用于存儲和分析數(shù)據(jù),然而,在共享報告或發(fā)票時,將其轉(zhuǎn)換為 PDF 能確保內(nèi)容在不同設備上保持固定和可讀,下面我們就來看看如何使用Python實現(xiàn)Excel到PDF的轉(zhuǎn)換吧
    2025-11-11
  • Python?安裝教程以及快速入門

    Python?安裝教程以及快速入門

    Python是一種簡單易學的編程語言,適合初學者入門。本文將介紹Python的安裝教程以及快速入門,幫助讀者快速上手Python編程。
    2023-09-09
  • Python獲取指定文件夾下的文件名的方法

    Python獲取指定文件夾下的文件名的方法

    本篇文章主要介紹了Python獲取指定文件夾下的文件名的方法,本文采用os.walk()和os.listdir()兩種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • 在Python下進行UDP網(wǎng)絡編程的教程

    在Python下進行UDP網(wǎng)絡編程的教程

    這篇文章主要介紹了在Python下進行UDP網(wǎng)絡編程的教程,UDP編程是Python網(wǎng)絡編程部分的基礎知識,示例代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04

最新評論

平昌县| 高雄县| 鸡泽县| 洛浦县| 盐山县| 三门峡市| 昌邑市| 三江| 太白县| 武冈市| 门源| 庄河市| 当雄县| 集安市| 敦化市| 金堂县| 阿合奇县| 栖霞市| 衡南县| 漯河市| 光山县| 桑植县| 安乡县| 响水县| 邻水| 集安市| 黎城县| 棋牌| 焉耆| 龙泉市| 连城县| 万源市| 信丰县| 元朗区| 农安县| 盘山县| 黔南| 额尔古纳市| 龙游县| 福贡县| 东台市|