tsvico的博客

好的代码像粥一样,都是用时间熬出来的

python图片分割

要用到Python中的PIL(Python Image Library)库,学习一个关于图片分割的demo

这是发的一个朋友圈,切图前是一张图,切图后就是九张图

image

除了可以处理规整的正方形图片,还可以处理非规则的图片。比如宽度远大于高度的图片,取宽和高之间的较大值,然后填充白色,就可以构造出一张正方形的图片啦。

PIL库是一个非常强大的Python图像处理标准库,但是呢,由于PIL支持Python2.7,所以使用Python3的程序媛men又在PIL的基础上分离出来一个分支,创建了另外一个库Pillow。Pillow兼容大部分PIL语法,使用起来也方便。第一次使用需要安装,以下是Python2.7版本示例,这里安装PIL

1
2
3
sudo apt-get install python-imaging
或者
pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

Python3的要安装Pillow,如果安装了Anaconda,Pillow就已经可用了。否则,需要在命令行下通过pip安装

1
pip3 install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

下面写一下如何使用PIL库实现图片分割

思路如下

思路图

对应代码(有相关注释)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#coding:utf-8
'''
将一张图片填充为正方形后切成9张图
'''
from PIL import Image
import sys

#_1_#将图片填充为正方形
def fill_image(image):
width,height = image.size
#选取长和宽中的较大值作为新图片的长和宽
new_image_legth = width if width > height else height
#生成新图片【白底】
new_image = Image.new(image.mode,(new_image_legth,new_image_legth),color='white')
#将之前的图片粘贴到新图片上,居中
if width > height:#原图宽大于高,则填充图片竖直维度
#(x,y)二元组表示粘贴上图相对下图的起始位置
new_image.paste(image, (0, int((new_image_legth - height) / 2)))
else:
new_image.paste(image ,(int((new_image_legth - width) / 2), 0))

return new_image
#_2_切图
def cut_image(image):
width,height = image.size
item_width = int(width / 3)
box_list = []
#(left,upper,right,lower)
for i in range(0,3):#两重循环,生成9张图片基于原图的位置
for j in range(0,3):
box = (j*item_width,i*item_width,(j+1)*item_width,(i+1)*item_width)
box_list.append(box)
image_list = [image.crop(box) for box in box_list]
return image_list

#_3_保存
def save_images(image_list):
index = 1
for image in image_list:
image.save('./image/python'+str(index) + '.png', 'PNG')
index += 1


if __name__ == '__main__':
file_path = "1.jpg"
image = Image.open(file_path)
#image.show()#打开图片
image = fill_image(image)
image_list = cut_image(image)
save_images(image_list)

示例原图

image

成功后的图

图片可能太大了☺,删除了

坚持原创技术分享,您的支持将鼓励我继续创作!