01
前言
Hello~各位小夥伴們大家好。現在大家是越來越離不開手機,離不開微信了。每天打開手機的第一或者第二件事就是趕緊打開朋友圈看看有什麼好玩的東西。偶爾忍不住了自己也發兩條……好了,今天教大家用Python發一個不一樣的朋友圈。
效果如下:

看出什麼來了嗎?沒錯,我們把一張圖檔切成了9張,然後利用朋友圈的9宮格顯示,得到了挺不錯的效果。好了,廢話少說,下面開工。
02
環境準備
Python版本:3.6.0
系統平台:Windows 10 X64
IDE:pycharm
相關子產品:
PIL子產品;
Image子產品;
以及一些Python自帶的子產品。
03
PIL庫介紹
對于圖像識别,大量的工作在于圖像的處理,處理效果好,那麼才能很好地識别,是以,良好的圖像處理是識别的基礎。在Python中,有一個優秀的圖像處理架構,就是PIL庫。由于PIL隻支援Python2.7,是以使用Python3的程式猿們又在PIL的基礎上分離出來了一個分支,建立了另外一個庫Pillow,是可以支援Python3的。
Pillow相容了PIL的大部分文法,使用起來也非常的簡單。Pillow 是 PIL的對Python3支援的另外一個分支,當然他對Python2也相容,由于PIL安裝起來比較煩,而使用pip可以很輕松的安裝Pillow:
Python 2.7
PIL: pip install pillow
Python 3
PIL: pip3 install pillow
Image類是PIL中的核心類,你有很多種方式來對它進行初始化,比如從檔案中加載一張圖像,處理其他形式的圖像,或者是從頭創造一張圖像等。
04
切割圖檔
上面說了這麼多,接下來我們就要用這個PIL庫進行圖檔切割啦。不過先做兩點說明:如果是正方形圖檔,直接切割;如果不是正方形圖檔,用白色填充成正方形再切割。大體步驟如下:
1、讀取圖檔。
1if __name__ == '__main__':
2 file_path = "F:\\17-個人部落格\\Python高逼格朋友圈\\998.jpg"
3 image = Image.open(file_path)
這一步很簡單,從檔案加載圖像,用Image函數的open方法。如果成功,這個函數将傳回一個圖像對象。
2、填充圖檔。
1# 先将 input image 填充為正方形
2def fill_image(image):
3 width, height = image.size
4 # 選取長和寬中較大值作為新圖檔的
5 new_image_length = width if width > height else height
6 # 生成新圖檔[白底]
7 new_image = Image.new(image.mode, (new_image_length, new_image_length), color='white') # 注意這個函數!
8 # 将之前的圖粘貼在新圖上,居中
9 if width > height: # 原圖寬大于高,則填充圖檔的豎直次元 #(x,y)二進制組表示粘貼上圖相對下圖的起始位置,是個坐标點。
10 new_image.paste(image, (0, int((new_image_length - height) / 2)))
11 else:
12 new_image.paste(image, (int((new_image_length - width) / 2), 0))
13 return new_image
首先用PIL庫下的Image類建立一個正方形新圖(邊長我們選擇原圖中長寬較大的那個),将之前的圖檔粘貼到新圖上面。這樣,一張圖檔就算是填充好啦。
3、切割圖檔。
1# 先将 input image 填充為正方形
2def cut_image(image):
3 width, height = image.size
4 item_width = int(width / 3) # 因為朋友圈一行放3張圖。
5 box_list = []
6 # (left, upper, right, lower)
7 for i in range(0, 3):
8 for j in range(0, 3):
9 # print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width))
10 box = (j * item_width, i * item_width, (j + 1) * item_width, (i + 1) * item_width)
11 box_list.append(box)
12 image_list = [image.crop(box) for box in box_list]
13 return image_list
然後進行循環切片,首先是在圖檔上定位好我們box的區域(相當于圈出一塊将要切掉的圖檔),注意區域由一個4元組定義,表示為坐标是 (left, upper, right, lower)。 Python Imaging Library 使用左上角為 (0, 0)的坐标系統。然後添加到box_list中,最後用crop方法将其切下來,儲存到image_list中。
4、儲存圖檔。
1# 儲存
2def save_images(image_list):
3 index = 1
4 for image in image_list:
5 image.save('F:\\17-個人部落格\\Python高逼格朋友圈\\' + str(index) + '.png', 'PNG')
6 index += 1
儲存圖檔簡單了,注意你們的儲存路徑就行。
05
完整代碼
1'''''
2将一張圖檔填充為正方形後切為9張圖
3Author:微信公衆号:程式猿聲
4'''
5from PIL import Image
6
7
8# 先将 input image 填充為正方形
9def fill_image(image):
10 width, height = image.size
11 # 選取長和寬中較大值作為新圖檔的
12 new_image_length = width if width > height else height
13 # 生成新圖檔[白底]
14 new_image = Image.new(image.mode, (new_image_length, new_image_length), color='white') # 注意這個函數!
15 # 将之前的圖粘貼在新圖上,居中
16 if width > height: # 原圖寬大于高,則填充圖檔的豎直次元 #(x,y)二進制組表示粘貼上圖相對下圖的起始位置,是個坐标點。
17 new_image.paste(image, (0, int((new_image_length - height) / 2)))
18 else:
19 new_image.paste(image, (int((new_image_length - width) / 2), 0))
20 return new_image
21
22
23def cut_image(image):
24 width, height = image.size
25 item_width = int(width / 3) # 因為朋友圈一行放3張圖。
26 box_list = []
27 # (left, upper, right, lower)
28 for i in range(0, 3):
29 for j in range(0, 3):
30 # print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width))
31 box = (j * item_width, i * item_width, (j + 1) * item_width, (i + 1) * item_width)
32 box_list.append(box)
33 image_list = [image.crop(box) for box in box_list]
34 return image_list
35
36
37# 儲存
38def save_images(image_list):
39 index = 1
40 for image in image_list:
41 image.save('F:\\17-個人部落格\\Python高逼格朋友圈\\' + str(index) + '.png', 'PNG')
42 index += 1
43
44
45if __name__ == '__main__':
46 file_path = "F:\\17-個人部落格\\Python高逼格朋友圈\\998.jpg"
47 image = Image.open(file_path)
48 # image.show()
49 image = fill_image(image)
50 image_list = cut_image(image)
51 save_images(image_list)