項羽死在什么地方(項羽死的地方現在是哪里)
2024-09-29
更新時間:2024-09-29 18:03:00作者:未知
九宮格怎么做(手機制作九宮格圖片)。本站來告訴相關信息,希望對您有所幫助。
我們很多人每天都有用手機刷朋友圈的習慣,可能大家也注意到了,最近微信朋友圈與微博已經掀起了9宮格圖片的玩法。
可以說將單個圖片,或者說單個動圖亦或視頻分割成9份發(fā)在朋友圈,感覺很有趣。
今天,博主就通過Python、OpenCV、pyqt5的知識,來幫助大家實現任意圖像,視頻,動圖的9宮格原理。
文末還有配套生成9宮格的pyqt5的源代碼以及exe可運行文件奉上。
生成9宮格圖片
一般來說,我們生成的9宮格原圖必須是正方形的,畢竟朋友圈與微博整體的9宮格就是正方形的。
但是博主為了9宮格的完備,只需要刪除下面一段代碼就可以完成任意圖形的9宮格,只是大多數平臺不支持非正方形的9宮格圖片。
下面,我們直接將一張圖片分割成9份,代碼如下:
# 生成9宮格圖片
def grid9_image(imageFileName):
if not os.path.exists('image'):
os.makedirs('image')
image = cv2.imread(imageFileName, 1)
#刪除代碼段頭
width, n = image.shape
if width >= height:
image = cv2.resize(image, (width, width))
height=width
else:
image = cv2.resize(image, (height, height))
width = height
#刪除代碼段尾
height = int(height / 3)
width = int(width / 3)
x = 1
for i in range(0, 3):
for j in range(0, 3):
* height, height * (i + 1), j * width, width * (j + 1))
result = image[i * height:height * (i + 1), j * width:width * (j + 1)]
+ str(x) + ".png")
+ str(x) + ".png", result)
x += 1
這里,我們是橫切分算法,首先i在j循環(huán)結束之前是不會變化的,那么就可以保證前面的切分一直就是三分之一。
后面的是寬度切分,第1份j=0,后面就是j+1=1為前三分之一,循環(huán)一次后j=1,也就是(width,widht*2),最后j=2時,(width*2,width*3)。(把注釋中間的代碼刪除,得到的是任意圖形的均分9份)
i與j的算法同理,原理如下圖。記得這里是width,height是整體寬度高度除于3后得到的。
當然,使用畫圖工具分割的有點不規(guī)則該請見諒,讀者可以把其想象成規(guī)整的看。同時如果i,j調換位置,那么圖片就是豎切分算法。會從左到右,從上到下依次切分。
生成9宮格動圖
動圖可以由兩種形式生成:一種是提供一個短視頻轉換為動圖;一種是直接提供一個GIF動圖,直接切分。
短視頻生成動圖9宮格
首先,我們來看看,提供一個短視頻后切分動圖,代碼如下:
# 短視頻生成9宮格動圖
def grid9_gif(srcVideoFileName):
if not os.path.exists('gif'):
os.makedirs('gif')
all_frames = []
cap = cv2.VideoCapture(srcVideoFileName)
fps = cap.get(cv2.CAP_PROP_FPS)
for i in range(9):
list = []
all_frames.append(list)
while (cap.isOpened()):
frame = cap.read()
if ret:
width, n = frame.shape
if width >= height:
frame = cv2.resize(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:width * (j + 1)]
frame_list.append(result)
for index, image in zip(range(9), frame_list):
all_frames[index].append(image)
else:
break
for index, frames in zip(range(9), all_frames):
+ str(index + 1) + ".gif", frames, 'GIF', duration=float(1 / fps))
cap.release()
其實,可以看出來,中間的切分算法與圖片的一模一樣。因為視頻本身就是由單一的圖片構成的。
這里,我們只要將視頻每個圖片切分,然后分別存儲,等到讀取完成之后,將每個部分轉換為GIF即可。(至于動圖的每幀間隔時間,就是1/視頻的FPS)
GIF直接生成動圖9宮格
對于GIF,OpenCV并沒有直接處理動圖的函數。所以,最簡單的方式,就是通過將動圖轉換為視頻后,在通過上面的代碼進行處理。
代碼如下:
# GIF生成9宮格動圖
def grid9_gif2(srcGIFFileName):
clip = mp.VideoFileClip(srcGIFFileName)
clip.write_videofile("gifVideo.mp4")
grid9_gif('gifVideo.mp4')
這里就是使用moviepy庫將GIF轉換為視頻后,再通過上面的grid9_gif處理。
需要注意的是,目前各大平臺并不支持動圖自動播放,比如微博必須點擊動圖才能動,如果后續(xù)支持動圖自動播放,那么這種動圖9宮格的切分也能完美實現。目前效果與靜態(tài)圖片一樣,只能看到每個動圖的第1幀。
生成9宮格視頻
生成9宮格視頻,我們就不必切分了。因為視頻本身就是一個整體,沒有哪個社交軟件,可以同一條朋友圈或者微博發(fā)9個視頻的。
所以,我們只需要將視頻中間畫上4條分割線,就完成了9宮格視頻的生成。代碼如下:
#生成9宮格視頻
def gird9_Video(srcVideoFileName, outputVideoFilename):
cap = cv2.VideoCapture(srcVideoFileName)
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
videoWriter = cv2.VideoWriter(outputVideoFilename + ".avi", fourcc, fps, (width, height))
i = 1
while (cap.isOpened()):
ret, frame = cap.read()
if ret:
cv2.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), 3)
cv2.line(frame, (int(width / 3), 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)
videoWriter.write(frame)
else:
break
cap.release()
代碼很簡單,就是對每個視頻的圖片畫4條分割線。運行之后,效果如下:
使用pyqt5打包成exe界面
對于我們程序員來說,部署的Python環(huán)境可以直接運行上面的代碼生成你想要的任何9宮格素材。但是對于不是程序員的小伙伴,提供一個可運行的程序,往往體驗更加友好。
這里,博主將通過pyqt5打包上述功能成為GUI界面程序。因為代碼過多,對pyqt5感興趣的可以直接前往github網址下載。