【带你成为pyq最靓的仔】朋友圈九宫格(一)之图片切割篇
前言
这是一篇"蓄谋已久"的文章,为什么这么说呢?
记得那时我刚从健身房出来,当我在公交车站台等车的时候,无聊刷起了朋友圈,看到朋友圈里有好友在发九宫格的动态,就觉得好洋气呀,于是我就萌生了一个罪恶的想法,能不能借助Python帮我自动处理一下图片呢,毕竟我手残,搞不了这么精细的活,对吧,于是就诞生了这篇分享文章;
既然能够对图片进行九宫格化操作,那么视频是不是也可以呢?答案是肯定的,关于对视频进行九宫格化的操作我将在本系列推文的第二篇进行讲解(文章末尾我放了一个九宫格视频的demo,小伙伴们可以先看看)。
朋友圈九宫格图片技术详解
首先,我们来看看我当时在朋友圈里看到的这条动态:
我们知道,朋友圈一次最多可以分享9张图片,因此我们只需要将一张完整的图片按照合适的尺寸切割成9张小图,然后按照原图的顺序对其进行拖拽拼接即可。接下来,我将以我个人的证件照为例,来为大家完整的演示这个案例。
在此之前,我们先来介绍一下完成此案例所需要掌握的一些知识。
01 - 相关API介绍
-
PIL.Image.open
(fp,mode='r')
-
PIL.Image.new
(mode,size,color=0)
-
Image.paste
(im,box=None,mask=None)
-
Image.crop
(box=None)
-
Image.save
(fp,format=None,**params)
02 - 思路分析及部分代码展示
我们可以将总体思路概括为以下三大步骤:
- 输入想要发朋友圈的图片;
- 通过代码进行切割并将切割好的图片进行保存;
- 发朋友圈
有了思路之后,我们来详细讲解一下每一步所对应的细节:
首先,我们来对用户输入的图片进行预处理,即对图片进行正方形化和添加白色背景两个操作,代码如下:
# 1.将长宽不等的图片进行正方形化的处理;2.对所有输入的图片进行添加白色背景的操作
def fill_image_to_square(img):
# 获取输入图片的大小尺寸
width, height = img.size
# 若所输入图片大小尺寸不等,则将长宽中较大者作为新图片的大小
new_image_length = width if width > height else height
# 生成一个白色背景的图片,大小尺寸为用户所输入图片长宽尺寸的较大者
new_image = Image.new(img.mode, (new_image_length, new_image_length), color='white')
# 将用户所输入的图片粘贴在白色背景的正中央
if width > height:
new_image.paste(img, (0, int((new_image_length - height) / 2)))
else:
new_image.paste(img, (int((new_image_length - width) / 2), 0))
return new_image
其次,我们来对已经预处理好的图片进行切割操作,为了方便小伙伴们理解切割图片的具体细节,请看下图:
我们对所输入的图片建立二维坐标系,图片切割的顺序即为图中所示的数字顺序,切割功能部分的实现代码如下所示:
def cut_image(img):
width, height = img.size
# 一行放3张图
item_width = int(width / 3)
box_list = []
# (left, upper, right, lower)
for i in range(0, 3):
for j in range(0, 3):
print(j*item_width, i*item_width, (j+1)*item_width, (i+1)*item_width)
box = (j*item_width, i*item_width, (j+1)*item_width, (i+1)*item_width)
box_list.append(box)
img_list = [img.crop(box) for box in box_list]
return img_list
最后,将我们输入的图片切割完成之后,我们只需要将其保存在本地即可,如下所示:
接着我们再来看看保存功能部分的代码实现:
def save_cropped_image(img_list):
index = 1
for img in img_list:
# 保存到当前目录的dong_wechat文件夹下且图片格式为png
img.save("dong_wechat/"+str(index) + '.png', 'PNG')
index += 1
写完了所有的功能实现之后,我们来看一下发出来的朋友圈长什么样子:
哈哈哈,不错,毕竟我花瓶的称号不是浪得虚名的,大功告成!
写在最后
在上述文章中我们详细介绍了如何将一张图片切割成9部分,并将其发布在朋友圈中,小伙伴们学会了吗,快去实现一下吧!
- 因为超算云,你将比别人早10年“抵达”未来
- 网页加速特技之 AMP
- 刷屏的背后:原来腾讯字体是CDC和Monotype联手打造的
- 重磅!腾讯与科大讯飞技术共创,Google ProtoBuf进入TARS家族!
- 一个简易版的T4代码生成"框架"
- yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[上篇]
- 以上下文(Context)的形式创建一个共享数据的容器
- yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[下篇]
- ASP.NET MVC下的四种验证编程方式
- 总体介绍ASP.NET Web API下Controller的激活与释放流程
- 如何让ASP.NET Web API的Action方法在希望的Culture下执行
- ASP.NET Web API标准的“管道式”设计
- ASP.NET Web API路由系统:Web Host下的URL路由
- ASP.NET Web API路由系统:路由系统的几个核心类型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- K8s 安装部署
- [Oracle 日常管理]使用bbed读取数据文件
- ansible生产环境使用场景(四):encrypt_string加密和ansible-lint调试
- SQLite在C#中的安装与操作
- 详解强制Vue组件重新渲染的方法
- C# this.invoke()作用 多线程操作UI
- C#3种常见的定时器(多线程)
- C#使用MemoryStream类读写内存
- C# WPF基础之Timer
- Angular 父子Component的数据绑定实现
- C# WPF线程操作
- Angular 界面元素的条件渲染
- mysqlbinlog命令详解 Part 2 - MySQL 事件类型
- Angular list列表的事件响应实现
- Angular list列表绑定的一个例子