前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >10分钟教你用Python发一个高逼格的朋友圈

10分钟教你用Python发一个高逼格的朋友圈

作者头像
短短的路走走停停
发布2019-05-14 18:09:49
6790
发布2019-05-14 18:09:49
举报
文章被收录于专栏:程序猿声程序猿声

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、读取图片。

代码语言:javascript
复制
1if __name__ == '__main__':
2    file_path = "F:\\17-个人博客\\Python高逼格朋友圈\\998.jpg"
3    image = Image.open(file_path)

这一步很简单,从文件加载图像,用Image函数的open方法。如果成功,这个函数将返回一个图像对象。

2、填充图片。

代码语言:javascript
复制
 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、切割图片。

代码语言:javascript
复制
 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、保存图片。

代码语言:javascript
复制
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

完整代码

代码语言:javascript
复制
 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)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿声 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档