【带你成为pyq最靓的仔】朋友圈九宫格(一)之图片切割篇

简介: 既然能够对图片进行九宫格化操作,那么视频是不是也可以呢?答案是肯定的,关于对视频进行九宫格化的操作我将在本系列推文的第二篇进行讲解

前言


这是一篇"蓄谋已久"的文章,为什么这么说呢?


记得那时我刚从健身房出来,当我在公交车站台等车的时候,无聊刷起了朋友圈,看到朋友圈里有好友在发九宫格的动态,就觉得好洋气呀,于是我就萌生了一个罪恶的想法,能不能借助Python帮我自动处理一下图片呢,毕竟我手残,搞不了这么精细的活,对吧,于是就诞生了这篇分享文章;


既然能够对图片进行九宫格化操作,那么视频是不是也可以呢?答案是肯定的,关于对视频进行九宫格化的操作我将在本系列推文的第二篇进行讲解(文章末尾我放了一个九宫格视频的demo,小伙伴们可以先看看)


朋友圈九宫格图片技术详解


首先,我们来看看我当时在朋友圈里看到的这条动态:


微信图片_20220611015319.png


我们知道,朋友圈一次最多可以分享9张图片,因此我们只需要将一张完整的图片按照合适的尺寸切割成9张小图,然后按照原图的顺序对其进行拖拽拼接即可。接下来,我将以我个人的证件照为例,来为大家完整的演示这个案例。


在此之前,我们先来介绍一下完成此案例所需要掌握的一些知识。



01 - 相关API介绍


  • PIL.Image.open(fp,mode='r')


微信图片_20220611015324.png


  • PIL.Image.new(mode,size,color=0)


微信图片_20220611015340.png

  • Image.paste(im,box=None,mask=None)


微信图片_20220611015344.png

  • Image.crop(box=None)


微信图片_20220611015348.png


  • Image.save(fp,format=None,**params)


微信图片_20220611015351.png



02 - 思路分析及部分代码展示


我们可以将总体思路概括为以下三大步骤:


  1. 输入想要发朋友圈的图片;
  2. 通过代码进行切割并将切割好的图片进行保存
  3. 朋友圈


有了思路之后,我们来详细讲解一下每一步所对应的细节:


首先我们来对用户输入的图片进行预处理,即对图片进行正方形化添加白色背景两个操作,代码如下:


# 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


其次,我们来对已经预处理好的图片进行切割操作,为了方便小伙伴们理解切割图片的具体细节,请看下图:


微信图片_20220611015355.png


我们对所输入的图片建立二维坐标系,图片切割的顺序即为图中所示的数字顺序,切割功能部分的实现代码如下所示:


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

最后,将我们输入的图片切割完成之后,我们只需要将其保存在本地即可,如下所示:


微信图片_20220611015400.png


接着我们再来看看保存功能部分的代码实现:


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


写完了所有的功能实现之后,我们来看一下发出来的朋友圈长什么样子:


微信图片_20220611015405.png

哈哈哈,不错,毕竟我花瓶的称号不是浪得虚名的,大功告成!


写在最后


在上述文章中我们详细介绍了如何将一张图片切割成9部分,并将其发布在朋友圈中,小伙伴们学会了吗,快去实现一下吧!

相关文章
|
数据处理 C++ UED
如何作为一个嵌入式软件工程师博主获得铁粉:C/C++ 技术分享之道
如何作为一个嵌入式软件工程师博主获得铁粉:C/C++ 技术分享之道
349 0
|
Web App开发 Dart 监控
Golang+chromedp+goquery 简单爬取动态数据 |Go主题月
胖sir,最近一段时间正在使用golang来进行开发项目,慢慢的对golang有了一些了解,突然有一天,我想用golang来实现爬取网站上的数据,例如天气预报,每日一句等等,发现这些网站的数据都是javascript动态生成,苦恼呀,不知道如何才能把网站上的动态数据获取下来,为我所用呀,例如我抓取到动态数据之后发邮件给我哟
878 0
|
运维 监控 Java
面经:Storm实时计算框架原理与应用场景
【4月更文挑战第11天】本文是关于Apache Storm实时流处理框架的面试攻略和核心原理解析。文章分享了面试常见主题,包括Storm的架构与核心概念(如Spout、Bolt、Topology、Tuple和Ack机制),编程模型与API,部署与运维,以及应用场景与最佳实践。通过代码示例展示了如何构建一个简单的WordCountTopology,强调理解和运用Storm的关键知识点对于面试和实际工作的重要性。
925 4
面经:Storm实时计算框架原理与应用场景
|
存储 缓存 运维
阿里云经济型e与通用算力型u1实例性能、适用场景及常见问题
在阿里云的众多云服务器实例类型中,经济型e和通用算力型u1实例因其高性价比和广泛的适用性而备受青睐。2024年经济型e实例2核2G3M带宽40G ESSD Entry盘99元1年,通用算力型u1实例2核4G5M带宽80G ESSD Entry盘199元1年,本文将深入解析这两种实例的性能特点、适用场景以及购买建议,以供参考。
阿里云经济型e与通用算力型u1实例性能、适用场景及常见问题
|
存储 安全 编译器
快速入门C++17:了解最新的语言特性和功能(下)
快速入门C++17:了解最新的语言特性和功能
|
机器学习/深度学习 传感器 算法
【OpenCV】告别人工目检:深度学习技术引领工业品缺陷检测新时代
【OpenCV】告别人工目检:深度学习技术引领工业品缺陷检测新时代
394 2
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
1575 0
|
网络安全 网络虚拟化 网络架构
什么是共享IP,如何判断IP是否被共享
**摘要:** 共享IP指多个用户或设备共用同一地址,常见于家庭网络、公共Wi-Fi及代理/VPN服务。判断IP是否共享可通过检查网络连接数、使用在线检测工具、观察网络活动、咨询ISP或检查路由器设置。共享IP不必然带来安全问题,但在特定场景下需关注。
|
存储 C语言 C++
C++遍历文件夹获取各文件名称并筛选指定格式类型的文件或具有特定名称的文件
C++遍历文件夹获取各文件名称并筛选指定格式类型的文件或具有特定名称的文件
395 1