Skip to content Skip to sidebar Skip to footer

Creating A Movie In Jython/python

I am trying to make a movie, whilst creating frames through a loop. It is saving, but only the first frame (which it plays as a movie - short movie!) I've tried various things and

Solution 1:

My first sight at JES video functions and at your code tells me something like (fully working example):

import os
import random

defsynthesizeFrameAndCreateMovie(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 inrange(0, nb_frames):
    pic=makeEmptyPicture(w, h)
    for x inrange (0, w):
      for y inrange (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 moviereturn movie

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

Output (frames):


......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......


EDIT :

More fun : animating a line (code taken form here)...

import os
import random

# Draw point, with check if the point is in the image areadefdrawPoint(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_algorithmdefdrawLine(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 -1if (x0 < x1): 
     sx = 1else: 
     sx = -1if (y0 < y1):
     sy = 1else: 
     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)
       breakif (e2 <  dx):
       err = err + dx
       y0 = y0 + sy 

# Draw infinite line from segmentdefdrawInfiniteLine(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 degresdefdrawInfiniteLineA(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)


defsynthesizeFrameAndCreateMovie(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 inrange(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 moviereturn 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)

Output (frames):


......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......


Solution 2:

I changed your code.

  • Used '%03d'%x instead of if*3.
  • change 'pic00.png' to 'pic001.png' because the loop in synthesiseFrame start from 1.
  • '\' -> os.path.join(..); Put import os if you didn't.

defsynthesiseFrame(folder):
  m = 0.5for frameNumber inrange(1,121):
    pic=makeEmptyPicture(960,540)
    for x inrange (0,960):
      for y inrange (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 ifreturn 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)

EDIT

  • x (in outer loop) -> frameNumber

Post a Comment for "Creating A Movie In Jython/python"