簡體   English   中英

PyGame 或 Moviepy - 顯示具有透明度的視頻

[英]PyGame OR Moviepy - Show a video with transparency

我的情況很奇怪,但我會盡力解釋一切。 所以我使用 PyGame 編寫游戲。 我使用moviepy在表面上顯示視頻。 現在我正在做一個戰斗屏幕,我想為攻擊設置動畫。 我會顯示一個快速截圖

這是戰斗畫面

當點擊“火球”時,我想顯示一個火球。 視頻本身具有透明度,但會用白色填充。

例如,我以前用於顯示過場動畫的代碼如下:

video = VideoFileClip('assets/Attacks/Frantz/fireball.webm')
video.preview()

當它播放視頻時,它看起來像這樣:

這里

我的初始文件是一個 gif,我轉換為 mp4。 我發現 mp4 不支持 alpha/transparency 我嘗試使用 gif 通過將video = VideoFileClip('assets/Attacks/Frantz/fireball.mp4')替換為video = VideoFileClip('assets/Attacks/Frantz/fireball.gif')但是白色背景也發生了同樣的事情(是的,gif 具有 100% 的透明度)我有點不知道該怎么做。 我是否應該嘗試其他文件格式,如果是,我該如何刪除透明度,但我認為我需要更改代碼中的某些內容,以便我可以實際使用 gif 或其他內容。

這是gif順便說一句的文件

如果很奇怪,我知道我的問題,但它是針對學校項目的,我將不勝感激

電影不是你想要的。 你想要的是一個動畫精靈。 動畫精靈由許多不同的精靈組成,這些精靈在連續的幀中顯示。 這些精靈的來源可以是精靈表、動畫 GIF 或位圖列表。

關於這個主題有各種各樣的問題和答案。 例如:


由於您的 GIF 不是透明的,因此您必須使用set_colorkey()為透明顏色設置顏色鍵:

pygameImage.set_colorkey((0, 0, 0))

例子:

import pygame
from PIL import Image, ImageSequence

def pilImageToSurface(pilImage):
    return pygame.image.fromstring(
        pilImage.tobytes(), pilImage.size, pilImage.mode).convert()

def pilImageToSurface(pilImage):
    return pygame.image.fromstring(
        pilImage.tobytes(), pilImage.size, pilImage.mode).convert()

def loadGIF(filename):
    pilImage = Image.open(filename)
    frames = []
    if pilImage.format == 'GIF' and pilImage.is_animated:
        for frame in ImageSequence.Iterator(pilImage):
            pygameImage = pilImageToSurface(frame.convert('RGB'))
            pygameImage.set_colorkey((0, 0, 0))
            frames.append(pygameImage)
    else:
        frames.append(pilImageToSurface(pilImage))
    return frames
 
pygame.init()
window = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()

background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.get_size(), (128, 128, 128), (64, 64, 64)
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect, color in tiles:#
    pygame.draw.rect(background, color, rect)

gifFrameList = loadGIF('fire.gif')
currentFrame = 0

run = True
while run:
    clock.tick(20)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.blit(background, (0, 0))

    rect = gifFrameList[currentFrame].get_rect(center = (250, 250))
    window.blit(gifFrameList[currentFrame], rect)
    currentFrame = (currentFrame + 1) % len(gifFrameList)
    
    pygame.display.flip()

pygame.quit()
exit()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM