Python Pygame:帧重影?
我正在使用pygame开发python中的动画环境。用户绘制每个帧,然后使用ffmpeg将动画保存为.avi电影。我想实现一个功能,但不确定如何实现。。帧重影。与绘制当前帧时显示上一帧类似 我尝试创建一个名为“重影”(ghost)的曲面,在按下下一帧键时复制当前帧。然后以10的alpha级别绘制,但结果不正确 我不知道该怎么办,以下是所有认为自己有想法的人的源代码:Python Pygame:帧重影?,python,animation,ffmpeg,pygame,Python,Animation,Ffmpeg,Pygame,我正在使用pygame开发python中的动画环境。用户绘制每个帧,然后使用ffmpeg将动画保存为.avi电影。我想实现一个功能,但不确定如何实现。。帧重影。与绘制当前帧时显示上一帧类似 我尝试创建一个名为“重影”(ghost)的曲面,在按下下一帧键时复制当前帧。然后以10的alpha级别绘制,但结果不正确 我不知道该怎么办,以下是所有认为自己有想法的人的源代码: #Anim8 import pygame,subprocess,shutil from os import makedirs f
#Anim8
import pygame,subprocess,shutil
from os import makedirs
from pygame.locals import *
from random import randrange
pygame.init()
screen=pygame.display.set_mode((740,580))
draw=pygame.Surface((740,540))
draw.fill((200,200,200))
bcol=(200,200,200)
gui=pygame.Surface((740,40))
gui.fill((50,50,50))
size=2
color=(0,0,0)
screen.fill((200,200,200))
prevcol=0
newcol=0
f=0
msg=''
framerate=60
try:
makedirs('anim')
except:
pass
def DrawColors(x,y):
pygame.draw.rect(gui, (255,0,0), (x+3,y+3,15,15),0)
pygame.draw.rect(gui, (0,0,0), (x+3,y+21,15,15),0)
pygame.draw.rect(gui, (0,255,0), (x+21,y+3,15,15),0)
pygame.draw.rect(gui, (200,200,200), (x+21,y+21,15,15),0)
pygame.draw.rect(gui, (0,0,255), (x+39,y+3,15,15),0)
while True:
pygame.display.set_caption('Anim8 - Sam Tubb - '+'Frame: '+str(f)+' '+str(msg))
mse=pygame.mouse.get_pos()
screen.blit(gui, (0,0))
DrawColors(0,0)
screen.blit(draw,(0,40))
key=pygame.key.get_pressed()
if key[K_1]:
framerate=10
msg='Frame Rate set to 10'
if key[K_2]:
framerate=20
msg='Frame Rate set to 20'
if key[K_3]:
framerate=30
msg='Frame Rate set to 30'
if key[K_4]:
framerate=40
msg='Frame Rate set to 40'
if key[K_5]:
framerate=50
msg='Frame Rate set to 50'
if key[K_6]:
framerate=60
msg='Frame Rate set to 60'
if key[K_7]:
framerate=70
msg='Frame Rate set to 70'
if key[K_8]:
framerate=80
msg='Frame Rate set to 80'
if key[K_9]:
framerate=90
msg='Frame Rate set to 90'
if key[K_0]:
framerate=100
msg='Frame Rate set to 100'
if key[K_a]:
pygame.image.save(draw, 'anim/frame'+str(f)+'.png')
f+=1
for e in pygame.event.get():
if e.type==QUIT:
shutil.rmtree('anim')
exit()
if e.type==KEYDOWN:
if e.key==K_s:
msg='Added Frame!'
pygame.image.save(draw, 'anim/frame'+str(f)+'.png')
f+=1
if e.key==K_c:
draw.fill(bcol)
if e.key==K_r:
name='anim'+str(randrange(0,999))+str(randrange(0,999))+'.avi'
msg='Rendering: '+name
pygame.display.set_caption('Anim8 - Sam Tubb - '+'Frame: '+str(f)+' '+str(msg))
subprocess.call('ffmpeg -f image2 -s 640x480 -i anim/frame%01d.png -r '+str(framerate)+' '+name,shell=True)
msg='Done!'
if e.key==K_p:
subprocess.call('ffplay '+name,shell=True)
if e.type==MOUSEBUTTONDOWN:
if e.button==1:
try:
prevcol=color
newcol=gui.get_at(mse)
if newcol==(50,50,50):
newcol=prevcol
color=newcol
except:
pass
if e.button==3:
try:
prevcol=bcol
newcol=gui.get_at(mse)
if newcol==(50,50,50):
newcol=prevcol
draw.fill(newcol)
bcol=newcol
except:
pass
if e.button==4:
size+=1
if size>7:
size=7
if e.button==5:
size-=1
if size==0:
size=1
if e.type == pygame.MOUSEMOTION:
lineEnd = pygame.mouse.get_pos()
lineEnd = (lineEnd[0],lineEnd[1]-40)
if pygame.mouse.get_pressed() == (1, 0, 0):
pygame.draw.line(draw, color, lineStart, lineEnd, size)
lineStart = lineEnd
pygame.display.flip()
哦,另一方面,如果有人好奇的话,这里是输出的样子。。我制作了一个小小的新年动画:
不相关,但您在输入后声明了
-r
,因此这将成为一个输出选项。输入的默认值-r
为25。因此,ffmpeg
将丢弃或复制帧以达到所需的输出帧速率。您可以将-r
移动到输入,或者如果需要以特定帧速率读取输入并限制为特定输出帧速率,则可以使用单独的-r
进行输入和输出。谢谢您的建议!你的方法听起来很完美,你有没有试过看它是否是一个小错误,比如在错误的时间出现了打字错误或闪电?问题是我无法清除添加帧之间的鬼影表面,所以我放弃了它,你想让我重新编写它以便你可以查看它吗?