https://mp.weixin.qq.com/s?__biz=MzU5MjEwMTE2OQ==&mid=2247486931&idx=1&sn=5c32fe2117599492970cd04448a07b31&chksm=fe25a78dc9522e9bae849dc247b70104c87777ac2c8d67f5b8ae8835e9a26c6323c93df43b70&scene=21#wechat_redirect

01 前言

在日常的生活中,大家偶尔会看到朋友圈发的照片由一张被切成九张的效果,有时由一张照片被切成九张照片所带来的视觉盛宴是不一样的!

现在许多 P 图工具里面自带了这种功能,而微信小程序里也有专门可以切图的工具。为了熟练巩固的练习调库操作,今天就来带大家看看,如何用 Python 实现这个小功能。

对图像知识感兴趣的同学,可以看看之前写的一篇文章《图像学小知识,不看后悔...100%有用!》

02 成果展示

先来看看成果,原图为文章开始的图片,一图切九图朋友圈:

九张图发朋友圈的时候,还有个比较有意思的事,上传时是乱序的,还需要你自己像玩拼图一样自己摆位置。

03 思路讲解

这个小功能的实现利用了 Python 中的一个图形处理库,Pillow。

Pillow是由从著名的Python图像处理库PIL发展出来的一个分支,通过Pillow可以实现图像压缩和图像处理等各种操作。

1pip install pillow  # 安装 pillow 库

大体实现思路以下几步:

  1. 读取到原图片,获取图片尺寸后,将宽高对比,生成以白色为背景的大正方形图

  2. 将大正方形图按照 3*3 比例进行切割,生成9个小正方形图

  3. 分别生成 9 张小正方形图片

04 代码讲解

按照上面的思路,写出代码:

1. 填充原图形的背景,生成大正方形图

1def fill_images(image):
2    """ 填充正方形白色背景图片 """
3    width, height = image.size  # 获取图片的宽高
4    side = max(width, height)  # 对比宽和高哪个大
5
6    # 新生成的图片是正方形的,边长取大的,背景设置白色
7    new_image = Image.new(image.mode, (side, side), color='white')
8
9    # 根据尺寸不同,将原图片放入新建的空白图片中部
10    if width > height:
11        new_image.paste(image, (0, int((side - height) / 2)))
12    else:
13        new_image.paste(image, (int((side - width) / 2), 0))
14    return new_image

代码中的顺序,可以理解为下面几个图形,首先在原有的照片基础上覆盖上白色背景:

其次,比较宽和高的生成规则是下面两个图,我们可以将背景调成黑色,便于观察,当宽大于高的像素时,你的照片就是横着铺满正方形的,而背景图填充上下,黑色背景是不是有股电影大片的气息

当高大于宽的像素时,你的照片就是竖着铺满正方形的,而背景图填充左右:

第一步到这里就完成了,你得到的就是一张被背景颜色填满的正方形。

2. 对大正方形进行切割

1def cut_images(image):
2    """ 切割大正方形图 """
3    width, height = image.size
4    one_third_width = int(width / 3)  # 三分之一正方形线像素
5
6    # 保存每一个小切图的区域
7    box_list = []
8
9    """ 
10    切图区域是矩形,位置由对角线的两个点(左上,右下)确定,
11    而 crop() 实际要传入四个参数(left, upper, right, lower) 
12    """
13    for x in range(3):
14        for y in range(3):
15            left = x * one_third_width  # 左像素
16            upper = y * one_third_width  # 上像素
17            right = (x + 1) * one_third_width  # 右像素
18            lower = (y + 1) * one_third_width  # 下像素
19            box = (left, upper, right, lower)
20            box_list.append(box)
21    image_list = [image.crop(box) for box in box_list]
22    return image_list

上述代码实际发生的事情就是下面几张图所示:

首先定位三分线:

根据左上,右下两个像素点的位置,确定新的图形:

最后将每个小正方形的左上和右下像素点进行存储,以元组的形式写到list中,在调用 crop 函数进行图像复制。关于 crop 函数,官方文档:

3. 存储切割后的9张图片(不放代码了,比较简单)

05 总结

Pillow 库对图像处理操作支持非常友好,而本次的小工具核心就在于如果进行对原有图片进行切割。内嵌两次循环来逐行遍历,双重遍历的思想会经常用到,这块可以注意下。

当然如果要是嫌源代码运行麻烦,可以打成 exe 文件来使用哟。这下又可以在朋友圈秀操作了!(比如改改背景呀,黑色背景什么的。)

关于源代码,老规矩,上传到 github 了:

https://github.com/unlimitbladeworks/python-tools/blob/master/automation/cut-picture/cut.py

Python处理图片九宫格,炫酷朋友圈相关推荐

  1. 不到100行代码 Python制作一个九宫格图片生成器,炫酷朋友圈!

    朋友圈下面的这种图片排列风格,相比大家一定会很熟悉,有关于职位招聘的 祝贺节日的, 筛自己美照的, 这种因为图片刚好为 3*3 的排列方式,所以被称为 9 宫格图片风格,图片的生成原理就是把一张图片按 ...

  2. 用python编写图片生成器_不到100行代码 Python制作一个九宫格图片生成器,炫酷朋友圈!...

    朋友圈下面的这种图片排列风格,相比大家一定会很熟悉,有关于职位招聘的 Snipaste_2020-08-02_19-48-58.png 祝贺节日的, Snipaste_2020-08-02_19-49 ...

  3. 用Python分割九宫格图片发朋友圈

    近日,朋友圈流行起了发九宫格的图片,就是将一张图片切割成九张图,然后在朋友圈发九张,但看起来就像一张一样,这不,我楼下的小A就狂发了一堆. 看起来好像挺好玩的,于是就问了小A他是怎样做的,他跟我说要下 ...

  4. python把一堆图片分成n份,用Python一键生成炫酷九宫格图片,火了朋友圈

    原标题:用Python一键生成炫酷九宫格图片,火了朋友圈 作为一个男同胞来说,为了给女朋友拍一张美美的照片,着实需要花费很大的时间和精力,不仅仅需要从众多的图片中精心挑选,而且还需要有着超强的图片精修 ...

  5. python大游戏_玩游戏就能学Python?太炫酷了!

    原标题:玩游戏就能学Python?太炫酷了! 要说现在最火的语言,那一定是Python了. 各种排行榜里,Python的排名都是蹭蹭蹭地往上涨.Python也确实是最适合新手入门的语言了,语法简单,应 ...

  6. 【微信辅助】疫情当前,python帮你找出朋友圈的武汉朋友给予关怀

    我是程序员小小叶,为大家带来原创精彩技术内容. 疫情无论是对于个体还是企业都是无法承受之重.希望疫情早日过去,这是作为一个普通人一个的小小心愿. 我们身边的亲朋好友也或多或少受到了疫情的影响,让我们来 ...

  7. Python爬虫爬取微信朋友圈的方法,感兴趣的朋友可以了解下

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 小雨 | 作者 python教程 | 来源 接下来,我们将实现微信朋友圈的 ...

  8. Python爬虫爬取微信朋友圈

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.op-kg.com/ ...

  9. python实现动态壁纸_流弊了!竟然用Python做一个炫酷的小姐姐动态壁纸

    原标题:流弊了!竟然用Python做一个炫酷的小姐姐动态壁纸 公众号关注 " 菜鸟学Python" 设为 "星标",每天带你玩转Python! (女神IU,图片 ...

  10. 元旦到了,手把手教你用 Python 制作一个炫酷烟花秀

    大家好,我是小张, 今天是2021 的最后一天,到了这个时间点,部分小伙伴已经开始复盘这一年的得与失.比如今年增加了多少技能点,看了多少本书,写了多少篇文章或者年前的小目标实现进度大概多少等等:做一个 ...

最新文章

  1. Selenium 2 WebDriver 多线程 并发
  2. Gurobi Optimizer的安装教程
  3. java自动生成代码原理_原来这就是Java代码生成器的原理啊,太简单了
  4. P1207 双重回文数
  5. mysql 备份库的shell_MySQL数据库的shell脚本自动备份
  6. php生成链接列表,根据URL链接和抛文本生成链接a标签的PHP函数
  7. 线程的3种实现方式并深入源码简单分析实现原理
  8. 2016专接本c语言真题_专科三年记录+自己学习专接本历程
  9. Spring 访问数据库
  10. python 获取网页元素_记一次python提取网页标签元素的坑
  11. 1.3、TetGen网格化过程之描述
  12. 福建省12.5米DEM数字高程数据
  13. Mybatis源码导入
  14. python入门心得_python学习心得:如何入门
  15. 计算机网络——网线制作和局域网组建
  16. 《智能时代》读书笔记:这是最好的时代,也是最坏的时代
  17. PROFINET 链路简述
  18. 1980年红色1元纸币值多少钱?
  19. 工业控制系统协议相关的安全问题
  20. ROS安装与机器人环境配置总结

热门文章

  1. onap桂林版部署教程
  2. nginx的安装升级、常用配置(一)
  3. 联想Filez zBox2022企业版为企业的 “零信任体系”构建保驾护航
  4. python excel 微信_Python读写Excel文件第三方库汇总,你想要的都在这儿!,微信文件第三方打开...
  5. java c/s网络聊天室,基于c-s网络聊天室报告.doc
  6. html怎么转换成xmind,怎么把html导入XMind
  7. Android批量打包-如何一秒内打几十个apk渠道包
  8. Doom3bfg 技术说明
  9. 微信小程序对商户而言到底有什么用?
  10. 常用颜色透明度色值表