2013-06-25 69 views
2

我試圖製作電影,同時通過循環創建幀。這是節省,但只有第一幀(它扮演的是一部電影 - 短片!)我嘗試了各種各樣的東西,無法弄清楚我做錯了什麼。謝謝在Jython/Python中創建電影

def synthesiseFrame(folder): 
    folder =r"D:\FOLDER" 
    m=0.5 
    for x in range(1,121): 
    pic=makeEmptyPicture(960,540) 
    for x in range (0,960): 
     for y in range (0,540): 
     r=#some code 
     g=#some code 
     b=#some code 
     color =makeColor (r,g,b) 
     px= getPixel (pic, x, y) 
     setColor(px, color) 
    numStr=str(x) 

    m=m+0.0125 
    if x<10: 
     writePictureTo(pic, folder+"\pic00"+numStr+".png") 
    if x >=10 and x<100: 
     writePictureTo(pic, folder+"\pic0"+numStr+".png") 
    if x>=100: 
     writePictureTo(pic,folder+"\pic"+numStr+".png") 

    return movie 

movie=synthesiseFrame(folder) 
folder =r"D:\FOLDER" 
file=r"D:\FOLDER\pic00.png" 
movie=makeMovieFromInitialFile(file) 
writeQuicktime(movie,"D:\FOLDER\movie.mov", 30) 
playMovie(movie) 
+1

好吧,睡覺的時間。但那很酷。 +1爲樂趣;)很快見到你。 –

+1

Ouaip,ca marche! A +。戈捷。 –

回答

3

我第一眼在JES video functions,並在你的代碼告訴我喜歡的事(完整的工作示例):

import os 
import random 

def synthesizeFrameAndCreateMovie(folder): 

    # Create an empty movie to receive the frames 
    movie = makeMovie() 

    # Compute & save the frames 
    w = 40 
    h = 25 
    nb_frames = 60  # Will give 60 frames at 30 fps => movie duration : 2 sec. 
    for z in range(0, nb_frames): 
    pic=makeEmptyPicture(w, h) 
    for x in range (0, w): 
     for y in range (0, h): 
     #makeColor() takes red, green, and blue (in that order) between 0 and 255 
     r = random.randint(0, 255) 
     g = random.randint(0, 255) 
     b = random.randint(0, 255) 
     color = makeColor(r,g,b) 
     px = getPixel(pic, x, y) 
     setColor(px, color) 

    # Create one frame and inject in the movie object 
    filename = os.path.join(folder, 'pic%03d.png' % z) 
    writePictureTo(pic, filename) 
    addFrameToMovie(filename, movie) 

    # return the movie 
    return movie 

movie = synthesizeFrameAndCreateMovie("D:\\FOLDER") 
print movie 
#writeQuicktime(movie,"D:\\FOLDER\\movie.mov", 30) 
playMovie(movie) 


輸出(幀):


...... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ......


編輯:

更多樂趣:動畫的線(代碼採取形式here)...

import os 
import random 

# Draw point, with check if the point is in the image area 
def drawPoint(pic, col, x, y): 
    if (x >= 0) and (x < getWidth(pic)) and (y >= 0) and (y < getHeight(pic)): 
    px = getPixel(pic, x, y) 
    setColor(px, col) 


# Draw line segment, given two points 
# From Bresenham's line algorithm 
# http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm 
def drawLine(pic, col, x0, y0, x1, y1): 

    dx = abs(x1-x0) 
    dy = abs(y1-y0) 
    sx = sy = 0 

    #sx = 1 if x0 < x1 else -1 
    #sy = 1 if y0 < y1 else -1 

    if (x0 < x1): 
    sx = 1 
    else: 
    sx = -1 
    if (y0 < y1): 
    sy = 1 
    else: 
    sy = -1 

    err = dx - dy 

    while (True): 

    drawPoint(pic, col, x0, y0) 

    if (x0 == x1) and (y0 == y1): 
     break 

    e2 = 2 * err 
    if (e2 > -dy): 
     err = err - dy 
     x0 = x0 + sx 

    if (x0 == x1) and (y0 == y1): 
     drawPoint(pic, col, x0, y0) 
     break 

    if (e2 < dx): 
     err = err + dx 
     y0 = y0 + sy 

# Draw infinite line from segment 
def drawInfiniteLine(pic, col, x0, y0, x1, y1): 
    # y = m * x + b 
    m = (y0-y1)/(x0-x1) 
    if (abs(m) > 100.0): 
    m = 100.0 

    # y0 = m * x0 + b => b = y0 - m * x0 
    b = y0 - m * x0 

    x0 = 0 
    y0 = int(m*x0 + b) 
    # get a 2nd point far away from the 1st one 
    x1 = getWidth(pic) 
    y1 = int(m*x1 + b) 

    drawLine(pic, col, x0, y0, x1, y1) 

# Draw infinite line from origin point and angle 
# Angle 'theta' expressed in degres 
def drawInfiniteLineA(pic, col, x, y, theta): 

    # y = m * x + b 
    dx = y * tan(theta * pi/180.0) # (need radians) 
    dy = y 

    if (dx == 0): 
    dx += 0.000000001 # Avoid to divide by zero 

    m = dy/dx 

    # y = m * x + b => b = y - m * x 
    b = y - m * x 

    # get a 2nd point far away from the 1st one 
    x1 = 2 * getWidth(pic) 
    y1 = m*x1 + b 

    drawInfiniteLine(pic, col, x, y, x1, y1) 


def synthesizeFrameAndCreateMovie(folder): 

    # Create an empty movie to receive the frames 
    movie = makeMovie() 

    # Compute & save the frames 
    w = 40 
    h = 25 
    nb_frames = 120  # Will give 120 frames at 30 fps => movie duration : 4 sec. 
    for z in range(0, nb_frames): 
    pic = makeEmptyPicture(w, h) 
    addRectFilled(pic, 0, 0, w-1, h-1) 
    #makeColor() takes red, green, and blue (in that order) between 0 and 255 
    r = random.randint(0, 255) 
    g = random.randint(0, 255) 
    b = random.randint(0, 255) 
    col = makeColor(r,g,b) 
    theta = z * 360/nb_frames 
    if (theta != 180.0) and (theta != 0.0): 
     drawInfiniteLineA(pic, col, w//2, h//2, theta) 

    # Create one frame and inject in the movie object 
    filename = os.path.join(folder, 'pic%03d.png' % z) 
    writePictureTo(pic, filename) 
    addFrameToMovie(filename, movie) 

    # return the movie 
    return movie 

movie = synthesizeFrameAndCreateMovie("/home/FOLDER") 
print movie 
#writeQuicktime(movie,"/home/golgauth/Desktop/FOLDER/movie.mov", 30) 
#writeAVI(movie,"/home/golgauth/Desktop/FOLDER/movie.avi") 
playMovie(movie) 


輸出(幀):


...... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here ... enter image description here .. enter image description here ......


+1

'%03d'表示以3位數字編碼的整數:000,001,002,... 100. –

+0

告訴我如果您能夠將電影保存爲文件,因爲我不是。 –

+0

@我編輯了一個更有趣的例子:'帶有旋轉線的動畫'。如果你想嘗試一下;) –

3

我改變了你的代碼。

  • 使用'%03d'%x代替if * 3。
  • 將'pic00.png'更改爲'pic001.png',因爲synthesiseFrame中的循環從1開始。
  • '\' - > os.path.join(..);如果沒有,請輸入import os

def synthesiseFrame(folder): 
    m = 0.5 
    for frameNumber in range(1,121): 
    pic=makeEmptyPicture(960,540) 
    for x in range (0,960): 
     for y in range (0,540): 
     r = #some code 
     g = #some code 
     b = #some code 
     color =makeColor (r,g,b) 
     px= getPixel (pic, x, y) 
     setColor(px, color) 
    m += 0.0125 
    writePictureTo(pic, os.path.join(folder, 'pic%03d.png' % frameNumber)) # 3 if -> no if 
    return movie 

movie = synthesiseFrame(folder) 
folder = r"D:\FOLDER" 
file = r"D:\FOLDER\pic001.png" # 00 -> 001 
movie=makeMovieFromInitialFile(file) 
writeQuicktime(movie,"D:\FOLDER\movie.mov", 30) 
playMovie(movie) 

編輯

  • x(外循環) - >frameNumber
+0

您還會返回'synthesiseFrame'中不存在的變量'movie'。除非有效地創建電影,否則此函數不應返回任何內容。 –

+0

我測試了我的代碼:它可以工作...我現在更新我的答案。 –

+0

我弄不明白的最後一件事是如何將它保存在磁盤上。但我可以正確玩。 –