1. 程式人生 > 程式設計 >利用python生成照片牆的示例程式碼

利用python生成照片牆的示例程式碼

PIL(Python Image Library)是python的第三方影象處理庫,但是由於其強大的功能與眾多的使用人數,幾乎已經被認為是python官方影象處理庫了。其官方主頁為:PIL。

PIL歷史悠久,原來是隻支援python2.x的版本的,後來出現了移植到python3的庫pillow,pillow號稱是friendly fork for PIL,其功能和PIL差不多,但是支援python3。本文只使用了PIL那些最常用的特性與用法,主要參考自:http://www.effbot.org/imagingbook。

Part 1:利用python生成照片牆

(1)簡要介紹思路:

(1)通過給定字串生成一張圖片;

(2)然後將該圖片的每個畫素的寬擴張edge_len倍,高也擴張edge_len倍,假設edge_len=60,那麼原文字圖片的每個畫素就變成了60*60畫素的一個圖片;
(3)原文字圖片的每個畫素的透明度不同,顯示文字的地方,透明度低(不透明),這2個字周邊的地方,透明度高(透明),我們根據原文字圖片每個畫素的透明度,來設定放到這個畫素(其實寬高已經擴大了60倍)圖片的透明度(trans_alpha方法實現)。

(2)匯入庫檔案

from PIL import Image,ImageDraw,ImageFont
import os

(3)由文字生成影象

def gen_text_img(text,font_size=20,font_path=None):
  # args:文字內容,文字字型大小,字型路徑
  font = ImageFont.truetype(font_path,font_size) if font_path is not None else None
  (width,length) = font.getsize(text) # 獲取文字大小
  text_img = Image.new('RGBA',(width,length))
  draw = ImageDraw.Draw(text_img)
  # 第一個tuple表示未知(left,up),之後是文字,然後顏色,最後設定字型
  draw.text((0,0),text,fill=(0,font=font)
  text_img.save('./temp_pic.jpg')
  return text_img

(4)透明度調節

def trans_alpha(img,pixel):
  '''
  根據rgba的pixel調節img的透明度
  這裡傳進來的pixel是一個四元組(r,g,b,alpha)
  '''
  _,_,alpha = img.split()
  alpha = alpha.point(lambda i: pixel[-1]*10)
  img.putalpha(alpha)  #Part2有介紹
  return img

(5)根據透明度引數對放大文字圖進行畫素覆蓋

def picture_wall_mask(text_img,edge_len,pic_dir="./user"):
  # 根據文字圖gen_text_img像生成對應的照片牆,輸入:文字影象,各個照片邊長,照片所在路徑
  new_img = Image.new('RGBA',(text_img.size[0] * edge_len,text_img.size[1] * edge_len))
  file_list = os.listdir(pic_dir)
  img_index = 0
  for x in range(0,text_img.size[0]):
    for y in range(0,text_img.size[1]):
      pixel = text_img.getpixel((x,y))#Part2有介紹
      file_name = file_list[img_index % len(file_list)]
      try:
        img = Image.open(os.path.join(pic_dir,file_name)).convert('RGBA')#Part2有介紹
        img = img.resize((edge_len,edge_len))
        img = trans_alpha(img,pixel)
        new_img.paste(img,(x * edge_len,y * edge_len)) #指定區域替換,Part2有介紹
        img_index += 1
      except Exception as e:
        print(f"open file {file_name} failed! {e}")
  return new_img

(6)生成照片牆

def main(text='',font_size = 20,edge_len = 60,pic_dir = "./user",out_dir = "./out/",font_path = './demo.ttf'):
  '''
  生成照片牆
  :param text: Text of picture wall,if not defined this will generage a rectangle picture wall
  :param font_size: font size of a clear value
  :param edge_len: sub picture's egde length
  '''
  if len(text) >= 1:
    text_ = ' '.join(text)#將字串用空格分隔開,提高展示效果
    #text_ = text
    print(f"generate text wall for '{text_}' with picture path:{pic_dir}")
    text_img = gen_text_img(text_,font_size,font_path)
    # text_img.show()
    img_ascii = picture_wall_mask(text_img,pic_dir)
    # img_ascii.show()
    img_ascii.save(out_dir + os.path.sep + '_'.join(text) + '.jpg')

(7)函式執行與傳參

if __name__ == '__main__':
  main(text='python')

檔案目錄結構如下,以供參考:out存放生成的照片牆,user存放貼上去的圖片。

利用python生成照片牆的示例程式碼

完整程式碼參考:git連結

(8)樣圖

利用python生成照片牆的示例程式碼
利用python生成照片牆的示例程式碼

Part 2:影象處理過程中中學習到的幾個知識點:

(1)python PNG圖片顯示匯入庫檔案

僅適用於顯示png格式的圖片

import matplotlib.pyplot as plt # plt 用於顯示圖片
import matplotlib.image as mpimg # mpimg 用於讀取圖片

顯示圖片

lena = mpimg.imread('temp_pic.png') # 讀取和程式碼處於同一目錄下的 lena.png
# 此時 lena 就已經是一個 np.array 了,可以對它進行任意處理
lena.shape #(512,512,3)
plt.imshow(lena) # 顯示圖片
plt.axis('off') # 不顯示座標軸
plt.show()

(2)PIL中影象格式轉換img.convert()函式

在數字影象處理中,針對不同的影象格式有其特定的處理演算法。所以,在做影象處理之前,我們需要考慮清楚自己要基於哪種格式的影象進行演算法設計及其實現。本文基於這個需求,使用python中的影象處理庫PIL來實現不同影象格式的轉換。
對於彩色影象,不管其影象格式是PNG,還是BMP,或者JPG,在PIL中,使用Image模組的open()函式開啟後,返回的影象物件的模式都是“RGB”。而對於灰度影象,不管其影象格式是PNG,還是BMP,或者JPG,開啟後,其模式為“L”。對於PNG、BMP和JPG彩色影象格式之間的互相轉換都可以通過Image模組的open()和save()函式來完成。具體說就是,在開啟這些影象時,PIL會將它們解碼為三通道的“RGB”影象。使用者可以基於這個“RGB”影象,對其進行處理。處理完畢,使用函式save(),可以將處理結果儲存成PNG、BMP和JPG中任何格式。這樣也就完成了幾種格式之間的轉換。同理,其他格式的彩色影象也可以通過這種方式完成轉換。當然,對於不同格式的灰度影象,也可通過類似途徑完成,只是PIL解碼後是模式為“L”的影象。

而對於Part 1中convert()函式的使用,推薦一篇博文Python影象處理庫PIL中影象格式轉換以供參考學習。

(3)img.paste()函式

第一個引數是用來覆蓋的圖片,第二個引數是覆蓋的位置,參考博文。

(4)img.getpixel()函式

檢視影象儲存值,參考博文。

(5)python影象處理:給影象新增透明度(alpha通道)

主要介紹img.putalpha()函式的用法,參考博文

到此這篇關於利用python生成照片牆的示例程式碼的文章就介紹到這了,更多相關python生成照片牆內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!