Python九宫格,python画九宫格图
下面朋友圈的图片排列风格大家会比较熟悉,是关于求职招聘的。
sni paste _ 2020-08-02 _ 19-48-58 . png
祝贺节日,
sni paste _ 2020-08-02 _ 19-49-57 . png
筛选自己漂亮的照片,
sni paste _ 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;
pyqt 5:5.9;
生产步骤
首先说一下九宫格图片转换的基本思路:
1、先把图片变成正方形,用白色像素填充不足的边缘;
2.求图片的三阶距离,将图片以for递归的形式划分为9个区域,存储为一个列表。因为这里的图片是用数组形式表示的,所以按照数组形式划分的很好;
3、将两次分割得到的图片列表分别存储,并按文件名编号;
核心代码如下:
如果self.open_file_path和self.save_file_path:
尝试:
img=cv2 . im read(self . open _ file _ path)
Len (img。shape)==2: #判断是否为灰度图像。
last_dim=1
否则:
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
#图像填充
新图像[
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
否则:
新图像=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
范围(3)中j的范围(3)]
对于范围(9)中的I:
image_name=str(i)
save _ image _ path=OS . path . join(self . save _ file _ path,f“{ image _ name }”。png’)
cv2.imwrite(保存图像路径,np.array(图像列表[i]))
成功打印并保存{image_name}!)
QMessagebox.information (self, info ,转换完成!)
例外情况为e:
打印(e)
QMessagebox.warning (self, error ,f 转换失败{str(e)} )
否则:
QMessagebox.information (self, err ,文件为空,请重试)
GUI封装
第二部分是GUI封装。这里我使用PyQt5,创建一个QWidgt组件,放置三个按钮和两个包含五个组件的LineEdit。因为没有属性(颜色、背景、交互效果),也没有布局,所以程序比较简单。
sni paste _ 2020-08-02 _ 20-31-59 . png
程序中在交互界面中加入了一些异常信息处理,比如打开地址为空,转换失败等。程序会给出相应的提示,比如如下。当没有选择文件夹时,单击开始转换按钮并给出错误提示。
sni paste _ 2020-08-02 _ 20-39-06 . png
GUI的主要代码部分:
def open_origin_file(自身):
Open _ File=qfiledialog . get Open filename(None,打开文件, C:/, Image (*。png))
如果打开_文件[0]:
打印(打开文件[0])
self . open _ file _ path=open _ file[0]
self . line _ edit . settext(self . open _ file _ path)
否则:
QMessageBox.warning(self, info ,无法打开文件,请重试!)
定义保存文件(自身):
Open _ File=qfiledialog . getexistingdirectory(None,打开文件, C:/)
如果打开_文件:
打印(打开文件)
self . save _ file _ path=openfile
self . line _ edit 1 . settext(str(self . save _ file _ path))
否则:
QMessageBox.warning(self, info ,无法打开文件,请重试!)
在这里,我找了一张图来测试这个小程序。图片是一个动漫角色——简单香。效果如下,
sni paste _ 2020-08-02 _ 20-55-46 . png
最后我随便找了一张图发到朋友圈。结果就是下面的第二张图(原图是第一张)。客观来说,视觉效果相比单张图片并没有提升。主要原因是原图长宽比不一致。也就是说,最好把一些长宽不一致的图片剪下来,再转换成九宫格,否则不适合转换成九宫格。
原图
1.png
无剪裁图形直接转换
微信_20200807235727.jpg
之后,裁剪转换后的图形。
微信_20200808001007.jpg
切割后改造的视觉效果明显提升,有兴趣的朋友也来试试。关于文章完整源代码,公众号【Z老师笔记】可在后台回复九宫格获取。
好了,这篇文章就讲到这里。最后,感谢您的阅读!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。