专栏首页程序猿声10分钟教你用Python发一个高逼格的朋友圈

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

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)

本文分享自微信公众号 - 程序猿声(ProgramDream),作者:邓发珩

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 10分钟教你用python 30行代码搞定简单手写识别!

    毕业季刚结束,眼瞅着2018级小萌新马上就要来了,老腊肉小编为了咱学弟学妹们的学习,绞尽脑汁准备编一套大学秘籍,这不刚开了个头就遇上了个难题——做笔记到...

    短短的路走走停停
  • 【C/C++教学】浅谈交换两个数的不同实现方法

    在小编辛辛苦苦撸了一个月C语言之后,屁颠屁颠跑去老师面前想装个B。老师说哎那你说说怎么实现两个数的交换?这TM不太简单了嘛。当小编把代码给老师看的时候,老师蛋蛋...

    短短的路走走停停
  • 作业车间调度JSP与遗传算法GA及其Python/Java/C++实现

    最近小编接触了遗传算法(Genetic Algorithm)。关于遗传算法,公众号内已经有多盘技术推文介绍:

    短短的路走走停停
  • 几十行代码 帮你发高逼格朋友圈(九宫格图片的制作)

    相信大家看了代码就知道是怎么实现的了吧,代码中可能比较难理解的地方我也给出了相应的注释,大家赶快用代码去跑一跑。

    KEVINGUO_CN
  • python将1张图片分割成9张

    周小董
  • sublime text3 复制格式化高亮代码-富文本以及html

    3.在下方输入https://github.com/n1k0/SublimeHighlight/tree/python3 导入模块,看提示加载成功后再继续,没成...

    陈平安
  • weex-16-image组件

    DE2586BB-4A0A-4904-AA87-EF44A8A5BC74.png

    酷走天涯
  • 项目经理最牛思维导图二

    yeedomliu
  • 互联网黑话指南

    grain先森
  • Reference Nodes(引用节点)

    iOSDevLog

扫码关注云+社区

领取腾讯云代金券