朋友圈下面的这种图片排列风格,相比大家一定会很熟悉,有关于职位招聘的

Snipaste_2020-08-02_19-48-58.png

祝贺节日的,

Snipaste_2020-08-02_19-49-57.png

筛自己美照的,

Snipaste_2020-08-02_19-51-37.png

这种因为图片刚好为 3*3 的排列方式,所以被称为 9 宫格图片风格,图片的生成原理就是把一张图片按区域等比例分为 9 份碎片,朋友圈发状态时只需要自己调整一下图片碎片放置位置即可。

虽然 9 宫格制作原理相对比较简单,但它的加入让朋友圈中只有一张图片的动态在视觉方面提升了一个档次

接下来 本文将介绍如何用 Python 将一张图片转化为 9 宫格,并加入 GUI 界面,封装成一个程序,先看一下程序的预览效果:

录制_2020_08_02_19_41_58_289.gif

本次制作的环境配置介绍如下:

Python 3.7;

Opencv: 3.4;

PyQt5 : 5.9;

制作步骤

首先先将一下九宫格图片转换的基本思路:

1,先把图片变为正方形,不够的边用白色像素填充;

2,找到图片的三等距离,用 for 递归形式 把图片划分为 9 个区域,并存储为列表,因为这里的图片是以数组形式表示,因此根据数组形式很好划分;

3,把 2 分割得到的图片列表分别进行存储,利用文件名来进行编号;

核心代码如下:

if self.open_file_path and self.save_file_path:

try:

img = cv2.imread(self.open_file_path)

if len(img.shape) == 2: # 判断是否为灰度图

last_dim = 1

else:

last_dim = 3

if img.shape[0] != img.shape[1]:

# 长宽不一致

new_image = np.zeros((max(img.shape), max(img.shape), last_dim), dtype=np.uint8) + 255

# 图像填充

new_image[

int((new_image.shape[0] - img.shape[0]) / 2):img.shape[0] + int((new_image.shape[0] - img.shape[0]) / 2),

int((new_image.shape[1] - img.shape[1]) / 2):img.shape[1] + int((new_image.shape[1] - img.shape[1]) / 2),:] = img

else:

new_image = img

# 开始进行图像分割

col_width = int(new_image.shape[0] / 3)

# 得到九宫格图像

image_list = [new_image[i * col_width:(i + 1) * col_width, j * (col_width):(j + 1) * col_width, :] for i in

range(3) for j in range(3)]

for i in range(9):

image_name = str(i)

save_image_path = os.path.join(self.save_file_path, f'{image_name}.png')

cv2.imwrite(save_image_path, np.array(image_list[i]))

print(f'save {image_name} sucessfully!')

QMessageBox.information(self,'info','转换完成!')

except Exception as e:

print(e)

QMessageBox.warning(self,'error',f'转换失败{str(e)}')

else:

QMessageBox.information(self,'err','文件为空,请重新操作')

GUI 封装

第二部分就是 GUI 封装,这里我用的是 PyQt5 ,创建一个 QWidgt 组件,放置三个按钮,两个 LineEdit 共5个组件,因为没有设置任何属性(颜色、背景、交互效果),也没排版,所以程序比较简陋

Snipaste_2020-08-02_20-31-59.png

在程序里,还在交互界面中加入了一些异常信息处理,比如打开地址为空、转换失败,程序会给相应的提示,比如下面这种,在没有选择文件夹时点击 开始转换按钮,给出了错误提示

Snipaste_2020-08-02_20-39-06.png

GUI 界面的主要代码部分:

def open_origin_file(self):

open_file = QFileDialog.getOpenFileName(None,"Open File","C:/","Image (*.png)")

if open_file[0]:

print(open_file[0])

self.open_file_path = open_file[0]

self.line_edit.setText(self.open_file_path)

else:

QMessageBox.warning(self,"info","Fail to open file, please try it again!")

def save_file(self):

open_file = QFileDialog.getExistingDirectory(None,'Open File','C:/')

if open_file:

print(open_file)

self.save_file_path = open_file

self.line_edit1.setText(str(self.save_file_path))

else:

QMessageBox.warning(self,'info','Fail to open file, Please try it again!')

这里我找了一张图片来测试一下这个小程序,图片是一个动漫角色-皮卡丘,效果如下,

Snipaste_2020-08-02_20-55-46.png

最后随意找了一张图片做成九宫格发到了朋友圈,结果在下面第二张图片(原图为第一张),客观一点地说,相对于单张图片视觉效果并没有提升,主要原因就是原图的长宽高比例不一致,也就是说,对于某些长宽不一致的图片在转化为九宫格之前最好裁剪一下效果会更好,否则并不适合转化为九宫格

原图

1.png

没裁剪直接转化的图

微信图片_20200807235727.jpg

裁剪之后转化的图

微信图片_20200808001007.jpg

裁剪之后在转化视觉效果就有明显的提升,感兴趣的小伙伴们也来试一下,关于文章完整源码,公号 【Z先生点记】后台回复 九宫格即可获取。

好了,以上就是本篇文章的全部内容啦,最后感谢大家的阅读!

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

  1. python做身份证识别_不到100行代码搞定Python做OCR识别身份证,文字等各种字体

    不告诉你我用了它配合Python简简单单开发OCR识别,带你识别手写体.印刷体.身份证等N种,附代码! 一.你心目中的OCR 在你心目中,OCR是多大(-, 厉害,好厉害,非常厉害,-)呢? 是这么大 ...

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

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

  3. python加密敏感信息_仅需10行代码,使用python加密用户敏感数据

    原标题:仅需10行代码,使用python加密用户敏感数据 数据分析师必须要遵守的一个规则就是数据保密,但在跨部门沟通的时候,难免会有数据泄露的情况,所以,对于用户的姓名.手机号.地址等敏感信息,一般需 ...

  4. python编写装饰器_我也来写一下python装饰器

    有借用,但原文出处已经找不到了,根据笔记分享一下解释器的基础. 下面的代码表示,等待两秒钟,输出'test is running'. 现在要求增加统计程序运行时间的功能. 等待两秒钟,输出'test ...

  5. python编写程序题目_让我们一起来写python程序,做些简单的题目

    题目:企业发放的奖金根据利润提成.利润(s)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%:20万到40万 ...

  6. 100行的python作品详解_不到 100 行 Python 代码徐峥变葛优

    给照片换脸大家应该都见过,本文我们来介绍一下如何通过 Python 实现换脸. 功能实现 实现换脸功能,我们大致可以分为两种:一种是所有功能都通过自己编码来实现,另一种是借助于第三方 API 来实现, ...

  7. python博弈论代码_使用 40 多行的 Python 代码实现一个简单的演化过程

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在纳米比亚的 PyCon 会议上,我发表了一篇名为 <使用 Python 解决"升级版的剪 ...

  8. python编程高手教程_写给编程高手的Python教程(01) 数据结构

    如何在列表,字典,集合中根据条件筛选数据 案例:如何在下列列表data中筛选出大于0的数 data = [1, -1, 2, 3, 4, 7] 复制代码 使用filter函数,第一个参数为一个函数,也 ...

  9. python画画100行代码_简单几步,100行代码用Python画一个蝙蝠侠的logo

    原标题:简单几步,100行代码用Python画一个蝙蝠侠的logo 转自:菜鸟学Python 蝙蝠侠作为DC漫画的核心人物之一,一直都受到广大粉丝的喜爱,而笔者作为DC的铁杆粉丝,自然也是老爷(粉丝对 ...

最新文章

  1. 好程序员web前端分享js剪切板Clipboard.js 使用
  2. python 惰性_Python学习---django惰性机制
  3. if/ else 你真的会吗?
  4. Python编程基础:第十五节 二维列表2D Lists
  5. 数据存储方案-闭包表
  6. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块...
  7. Windows性能分析器概述(三)
  8. Python入门教程之Python保留字符大全
  9. select事件有哪些_Android 深入底层:Linux事件管理机制 epoll
  10. 搭建springmvc项目遇到的问题
  11. CSDI2018广州关于《Nginx》的分享(附文字速录与PPT)
  12. 程序员的十一个层次,你感觉自己属于那一层?
  13. 农夫山泉背后的男人“有点狠”
  14. 网站入侵工具之wscan使用详解
  15. 如何给php安装上pecl,PHP PECL如何安装扩展?
  16. 【牛客网刷题】通信-华为公司专项练习
  17. 【Android】App开发-动画效果篇
  18. C++“读取“大量数据时--快读
  19. npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1
  20. pcf8563 C语言编程

热门文章

  1. 如何在word文档中添加两个目录
  2. 直线检测——对比M-LSD直线检测(基于深度学习)与霍夫曼直线检测
  3. Centos7安装ftp服务
  4. 基于STM32 STC15和SU-03T语音模块的智能语音垃圾桶设计
  5. 【mysql】连表查询(内连接,左连接,右连接,全外连接)
  6. Kitti数据集的读取与显示
  7. 10.卡尔曼滤波之次优滤波器——常增益和解耦
  8. Flutter学习笔记学习资料推荐
  9. 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
  10. 支付宝sdk 参数 转网页url(h5 支付)