diff --git a/renderlib.py b/renderlib.py index 57c9366..0d749f1 100644 --- a/renderlib.py +++ b/renderlib.py @@ -11,6 +11,7 @@ from svgtemplate import SVGTemplate from lxml import etree from urllib.request import urlopen from wand.image import Image +from tempfile import NamedTemporaryFile # Frames per second. Increasing this renders more frames, the avconf-statements would still need modifications fps = 25 @@ -83,14 +84,18 @@ def ensureFilesRemoved(pattern): for f in glob.glob(pattern): os.unlink(f) -def renderFrame(infile, task, outfile): +def renderFrame(svg, task, outfile): width = 1920 height = 1080 + outfile = os.path.abspath(outfile) if args.imagemagick: # invoke imagemagick to convert the generated svg-file into a png inside the .frames-directory - with Image(filename=infile) as img: - with img.convert('png') as converted: - converted.save(filename=outfile) + with NamedTemporaryFile(dir=task.workdir, suffix='.svg') as svgfile: + svgfile.write(svg.svgstr.encode('utf-8')) + svgfile.flush() + with Image(filename=svgfile.name) as img: + with img.convert('png') as converted: + converted.save(filename=outfile) elif args.resvg: # invoke inkscape to convert the generated svg-file into a png inside the .frames-directory cmd = 'resvg --background white --width={1} --height={2} "{4}" "{3}" 2>&1 >/dev/null'.format(task.workdir, width, height, outfile, infile) @@ -98,11 +103,10 @@ def renderFrame(infile, task, outfile): if errorReturn != '': print("resvg exited with error\n" + errorReturn) # sys.exit(42) - else: # invoke inkscape to convert the generated svg-file into a png inside the .frames-directory - cmd = 'inkscape --export-background=white --export-background-opacity=0 --export-width={1} --export-height={2} --export-filename="{3}" "{4}" --pipe 2>&1 >/dev/null'.format(task.workdir, width, height, os.path.abspath(outfile), os.path.abspath(infile)) - errorReturn = subprocess.check_output(cmd, shell=True, universal_newlines=True, stderr=subprocess.STDOUT, cwd=task.workdir) + cmd = 'inkscape --export-background=white --export-background-opacity=0 --export-width={1} --export-height={2} --export-filename="{3}" --pipe 2>&1 >/dev/null'.format(task.workdir, width, height, outfile) + errorReturn = subprocess.check_output(cmd, shell=True, universal_newlines=True, input=svg.svgstr, stderr=subprocess.STDOUT, cwd=task.workdir) if errorReturn != '': print("inkscape exited with error\n" + errorReturn) # sys.exit(42) @@ -135,26 +139,20 @@ def cachedRenderFrame(frame, frameNr, task, cache): elif not skip_rendering: cache[frame] = frameNr - svgfile = '{0}/.frames/{1:04d}.svg'.format(task.workdir, frameNr) - - with SVGTemplate(task, svgfile) as svg: + outfile = '{0}/.frames/{1:04d}.png'.format(task.workdir, frameNr) + with SVGTemplate(task) as svg: svg.replacetext() svg.transform(frame) - svg.write() - - outfile = '{0}/.frames/{1:04d}.png'.format(task.workdir, frameNr) - renderFrame(svgfile, task, outfile) + renderFrame(svg, task, outfile) # increment frame-number frameNr += 1 def rendertask_image(task): - svgfile = '{0}/image.svg'.format(task.workdir) - with SVGTemplate(task, svgfile) as svg: + with SVGTemplate(task) as svg: svg.replacetext() - svg.write() - renderFrame(svgfile, task, task.outfile) + renderFrame(svg, task, task.outfile) def rendertask_video(task): # iterate through the animation sequence frame by frame diff --git a/svgtemplate.py b/svgtemplate.py index 4391214..410934c 100644 --- a/svgtemplate.py +++ b/svgtemplate.py @@ -12,21 +12,14 @@ cssutils.ser.prefs.lineSeparator = ' ' cssutils.log.setLevel(logging.FATAL) class SVGTemplate: - def __init__(self, task, outfile): + def __init__(self, task): self.task = task - self.outfile = outfile def __enter__(self): with builtins.open(os.path.join(self.task.workdir, self.task.infile), 'r') as fp: self.svgstr = fp.read() return self - def write(self): - # open the output-file (named ".gen.svg" in the workdir) - with builtins.open(self.outfile, 'w') as fp: - # write the generated svg-text into the output-file - fp.write(self.svgstr) - def replacetext(self): for key in self.task.parameters.keys(): self.svgstr = self.svgstr.replace(key, xmlescape(str(self.task.parameters[key])))