在Ubuntu 16.04.5 LTS上利用python 2.7版本的pillow库拼接近千张图片实录
緣由
這兩年網上出現了使用python中的PIL或是pillow庫拼接圖片和朋友圈圖像的例子,讓我非常感興趣,比較典型的是這幾個例子:
《朋友圈的朋友們,你們終于可以互相看到了》
《1000張圖片如何拼接》
我實操了一下,發現還是有些小問題,下面是我消化吸收和改進的過程。改進的地方:
1.存放圖片的文件夾是任意指定的,里面文件名沒有要求,不需要按照序號1,2,……這樣的命名,更實用;
2.圖片的合并效果更好,是根據圖片集的圖片的個數來確定背景畫板的大小,而不是讓圖片來適應畫板,這就避免合并圖邊緣的空白或黑邊問題,同時對圖片集大小沒有限制,任意個數的圖片都能拼接。
3.背景畫布的大小可以靈活調整,你只需要確定每行放幾張圖片,每張圖片的大小是多少,就可以得到超長圖或是扁平圖之類的。
需要用到的知識點
PIL(Python Imaging Library)已經是Python平臺事實上的圖像處理標準庫。PIL功能強大,簡單易用。由于PIL僅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基礎上創建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了許多新特性,因此在python中,安裝pillow庫就可以使用PIL庫了。
Image 類是PIL庫中一個非常重要的類,通過這個類來創建實例可以有直接載入圖像文件,讀取處理過的圖像。
以下是Image類幾個最常用的方法。
new('RGBA', (x,y))
創建一張圖片,默認是黑色的。可以修改參數。
image = Image.new('RGB', (width, height), (255, 255, 255))
open(filename), ?save(outfilename)
open(filename) 打開一個圖片文件把圖片讀進來。save(outfilename)保存圖片。
resize(size,size)
調整圖片大小(縮放圖片)。近千張圖片,先要縮小一下。
安裝依賴庫
sudo pip install pillow
代碼
下面是我將平時喜愛的歌手專輯的封面整理后,拼接得到的大圖,每個album的大小一般為300*300.
#!/usr/bin/env python
#encoding: utf-8
#description: 將指定文件夾下面的圖片拼接為一張大圖(沒有黑邊)
#date: 2018-12-18import PIL.Image as Image
import os
import math#==========基本配置信息==========#待合成圖片所在目錄
dir_in = '/home/taoyx/圖片/Mac專用Album/'
#輸出大圖目錄
dir_out = '/home/taoyx/program_develop/python_dev/img_joint/'
#單張圖片大小預設
img_w = 300
img_h = 300
#每行圖片個數,為了輸出美觀,要結合圖片集大小靈活調整,圖片總數最好能整除col
col = 37#================================#先統計圖片目錄中的圖片個數
img_list = os.listdir(dir_in)
total_cnt = len(img_list)
print('Path:%s, images total:[%d]' %(dir_in, total_cnt))#確定畫板的寬和高,math.ceil返回浮點數還需取整才行
row = int(math.ceil(total_cnt / col))
bg_w = img_w * col
bg_h = row * img_h
print('image:(%d,%d), background:(%d,%d), col:%d, row:%d' %(img_w, img_h, bg_w, bg_h, col, row))#創建指定大小的畫板
bg = Image.new('RGBA',(bg_w, bg_h))cnt = 0
w = 0
h = 0
#逐個將圖片粘貼進來
for fn in os.listdir(dir_in):#修復部分文件名前面帶有'._'前綴的bug,導致找不到指定文件 if fn[0] == '.' and fn[1] == '_':fn = fn[2:]print('file name:%s' %fn)fname = os.path.join(dir_in, os.path.basename(fn))#print('full file name:%s' %fname)try:img = Image.open(fname)except IOError:print 'IOError:%s' %fnameelse:#將每張圖片縮放到指定大小img = img.resize((img_w, img_h), Image.ANTIALIAS)#注意精確確定每張圖片在合成背景上所在的像素區域w = cnt % colif cnt != 0 and w == 0:h += 1cnt += 1print('count:%d, position:(%d,%d)' %(cnt, w, h))bg.paste(img, (w * img_w, h * img_h))#保存最后的合并圖到指定輸出目錄
bg.save(dir_out + 'album_all.png')
在命令行執行
python img_joint.py
效果圖
下面是對某電影海報文件夾內海報圖片的拼接效果
?
總結
以上是生活随笔為你收集整理的在Ubuntu 16.04.5 LTS上利用python 2.7版本的pillow库拼接近千张图片实录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在ubuntu 16.04.5 LTS上
- 下一篇: 在Ubuntu 16.04.5 LTS上