关注:23 发布时间:2022-02-02 19:13:01
我们很多人都有每天用手机刷朋友的习惯。或许大家都注意到了,比较近微信朋友圈和微博都开始玩9方图了。
可以说,把一张图,或者一张动图,或者视频,分成9份,发给朋友圈,很有意思。
,博主们利用python、opencv、pyqt5的知识,帮你实现任意图像、视频、动画的9格原理。
文末还有生成9格的pyqt5源代码和exe的可执行文件。
生成9格图片
一般来说,我们生成的9个正方形的原图一定是正方形。毕竟朋友圈和微博整体的9个方格都是正方形。
但是为了完成9格,博主只需要删除下面的代码就可以完成任意图形的9格,但是大部分平台不支持非正方形9格图片。
下面,我们直接把一张图片分成9份,代码如下:
#如果不是os . path . exists(" image "): os . make readers(" image ")image=cv2 . imead(image filename,1) #删除代码段标题高度,宽度,n=image . shapeif width=height : image=cv2 . resize(image,(width,width))height=width else : image=cv2 . resize(image,(height,height))width=height #删除结束高度* (i 1),j *宽度,宽度* (j 1))结果=图像[i * height:height * (i 1),j * width : width *(j 1)]打印(" 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动画defgrid 9 _ gif(srcvideofilename): if not os . path . exists(" gif "): os . make readers(" gif ")all _ frames=[]cap=cv2。video capture(srcvideofilename)fps=cap . get(cv2。cap_prop_fps)为i在范围(9)内: list=[]all _ frames . append(list)while(cap . isopended): ret,frame=cap . readif ret : height,width,n=frame . shapeif width=height : frame=cv2 . r
esize(frame,(width,width))height=width else : frame=cv2 . resize(frame,(height,height))width=height height=int(height/3)width=int(width/3)frame _ list=[]for i in range(0,3):for j in range(0,3): result=frame[i * height : height *(i ^ 1),j * width 3360 width *(j ^ 1)]frame _ list . append(result)append(image)else : break for index,frames in zip(range(9),all _ frames): imageio . mimsave(" gif/" str(index 1)")。gif ",帧," gif ",持续时间=float(1/fps))cap.release
事实上,可以看出中间的分割算法与图片中的完全相同。因为视频本身是由单一画面组成的。
在这里,我们只需要对视频的每一张图片进行分段,然后分别存储。看完之后,我们可以把每个部分转换成gif。(至于每帧运动画面的间隔时间,是视频的1/fps)
gif直接生成动画9格
对于gif,opencv不直接处理动画的功能。所以比较简单的方法就是把动画转换成视频,然后通过上面的代码进行处理。
代码如下:
# gif生成9方画defgrid 9 _ gif 2(srcgiffilename):
clip=mp。视频文件剪辑(srcgiffilename)
clip . write _ video file(" gifvideo . mp4 ")
grid9_gif("gifvideo.mp4 ")
这里使用moviepy库将gif转换成视频,然后由上面的grid9_gif处理。
需要注意的是,目前各大平台都不支持动画的自动播放。比如微博必须动画才能移动。如果以后支持动画的自动播放,那么动画9的这种分割是可以完美实现的。目前效果和静止图片一样,只能看到每张运动图片的第一帧。
生成9格视频
生成9格视频,不用拆分。因为视频本身就是一个整体,没有哪个社交软件可以在同一个朋友圈或者微博里发9个视频。
所以我们只需要在视频中间画四条分割线就可以完成9格视频的生成。代码如下:
# generate 9-grid video def grid 9 _ video(srcvideofilename,output video filename): cap=cv2。video capture(srcvideofilename)fps=cap . get(cv2。cap_prop_fps)宽度=int(cap.get(cv2。cap_prop_frame_width))高度=int(cap.get(cv2。cap _ prop _ frame _ height))fourcc=cv2。video writer _ fourcc(* " mjpg ")video writer=cv2。视频编写器(输出视频文件名)。avi ",fourcc,fps,(width,height))i=1 while(cap . isopended): ret,frame=cap . readif ret : cv 2 . line(frame,(0,int(height/3)),(width,int(height/3)),(255,255,255),3)cv2.line(frame,(0,int(height/3 * 2)),(width,int(height/3 * 2)),(255,255,255)
pan class="hljs-number"0),(int(width/3),height,(255,255,255),3)cv2.line(frame,(int(width/3 * 2),0),(int(width/3 * 2),height,(255,255,255),3)video writer . write(frame)else : break cap . release
代码很简单,就是给每个视频画面画4条分割线。运行后,效果如下:
使用pyqt5打包到exe接口
对于我们程序员来说,部署好的python环境可以直接运行上面的代码,生成你想要的9格素材。但是对于不是程序员的伙伴来说,提供一个可运行的程序往往更友好。
在这里,博主会通过pyqt5将上述功能打包成gui界面程序。因为代码太多,对pyqt5感兴趣的可以直接去github。
28位用户关注
98位用户关注
142位用户关注
21位用户关注
96位用户关注
37位用户关注