【问题标题】:Creating a movie in Jython/Python在 Jython/Python 中创建电影
【发布时间】:2013-06-21 17:09:55
【问题描述】:

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

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)

【问题讨论】:

    标签: python frame jython movie jes


    【解决方案1】:

    我更改了你的代码。

    • 使用 '%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

    【讨论】:

      【解决方案2】:

      我在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)
      


      输出(帧):


      .......................... ...................


      编辑:

      更有趣:为线条制作动画(代码取自 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)
      


      输出(帧):


      .......................... ...................


      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 2017-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多