2

我正在尝试制作电影,同时通过循环创建帧。它正在保存,但只有第一帧(它作为电影播放 - 短片!)我尝试了各种方法,但无法弄清楚我做错了什么。谢谢

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)
4

2 回答 2

4

我对JES 视频功能和您的代码的第一眼告诉我类似(完全工作的示例):

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)


输出(帧):


……………………………………………………………… 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_


编辑 :

更有趣:为线条制作动画(此处采用代码形式)...

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)


输出(帧):


……………………………………………………………… 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_ 在此处输入图像描述_


于 2013-06-25T03:06:20.887 回答
4

我改变了你的代码。

  • 使用 '%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
于 2013-06-25T02:58:53.797 回答