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