9张照片弄成一个九宫格

我们很多人都有每天用手机刷朋友的习惯 。或许大家都注意到了,比较近微信朋友圈和微博都开始玩9方图了 。
可以说,把一张图,或者一张动图,或者视频,分成9份,发给朋友圈,很有意思 。
,博主们利用python、opencv、pyqt5的知识,帮你实现任意图像、视频、动画的9格原理 。
文末还有生成9格的pyqt5源代码和exe的可执行文件 。
生成9格图片
一般来说,我们生成的9个正方形的原图一定是正方形 。毕竟朋友圈和微博整体的9个方格都是正方形 。
但是为了完成9格,博主只需要删除下面的代码就可以完成任意图形的9格,但是大部分平台不支持非正方形9格图片 。
下面,我们直接把一张图片分成9份,代码如下:
#如果不是os. path. exists(" image"): os. makereaders(" image")image=cv2 . imead(imagefilename,1) #删除代码段标题高度,宽度,n=image. shapeifwidth=height: image=cv2 . resize(image,(width,width))height=widthelse: image=cv2 . resize(image,(height,height))width=height#删除结束高度* (i1),j*宽度,宽度* (j1))结果=图像[i* height:height* (i1),j* width: width*(j1)]打印(" image/" str(x)") 。png")cv2.imwrite("image/" str(x)" 。" png",结果)x=1
这里,我们是一个横切算法 。首先,在j循环结束之前我是不会改变的,所以我们可以保证之前的分段永远是三分之一 。
后一部分是宽度分割,第一部分是j=0,后一部分是j=1作为第一个三分之一 。经过一个周期,j=1,即(width,width*2),比较后当j=2时,(width* 2,width*3) 。(删除纸条中间的代码,你就得到9份任意图 。)
i和j的算法是一样的,原理如下 。记住这里是宽度,高度是用整个宽度和高度除以3得到的 。
当然,用绘图工具分割有点不规则 。请见谅,读者可以把它当成常规 。同时,如果我和j改变位置,那么图片就是一个垂直分割算法 。会从左到右,从上到下切割 。
生成9方形网格动画
动图可以通过两种形式生成:一种是提供一个短视频,转换成动图;一种是直接提供一个gif动画,直接剪切 。
短视频生成动画9格
首先,我们来看一看,提供一个简短的视频分割后动画 。代码如下:
#短视频生成9-grid动画defgrid9 _ gif(srcvideofilename): ifnotos. path. exists(" gif"): os. makereaders(" gif")all_ frames=[]cap=cv2 。videocapture(srcvideofilename)fps=cap. get(cv2 。cap_prop_fps)为i在范围(9)内: list=[]all_ frames. append(list)while(cap. isopended): ret,frame=cap. readifret: height,width,n=frame. shapeifwidth=height: frame=cv2 . r
esize(frame,(width,width))height=widthelse: frame=cv2 . resize(frame,(height,height))width=heightheight=int(height/3)width=int(width/3)frame_ list=[]foriinrange(0,3):forjinrange(0,3): result=frame[i* height: height*(i^ 1),j* width3360 width*(j^ 1)]frame_ list. append(result)append(image)else: breakforindex,framesinzip(range(9),all_ frames): imageio. mimsave(" gif/" str(index1)") 。gif",帧," gif",持续时间=float(1/fps))cap.release
事实上,可以看出中间的分割算法与图片中的完全相同 。因为视频本身是由单一画面组成的 。
在这里,我们只需要对视频的每一张图片进行分段,然后分别存储 。看完之后,我们可以把每个部分转换成gif 。(至于每帧运动画面的间隔时间,是视频的1/fps)
gif直接生成动画9格
对于gif,opencv不直接处理动画的功能 。所以比较简单的方法就是把动画转换成视频,然后通过上面的代码进行处理 。
代码如下:
# gif生成9方画defgrid9 _ gif2(srcgiffilename):
clip=mp 。视频文件剪辑(srcgiffilename)
clip. write_ videofile(" gifvideo. mp4 ")
grid9_gif("gifvideo.mp4 ")
这里使用moviepy库将gif转换成视频,然后由上面的grid9_gif处理 。