#!/usr/bin/env python3 import sys import os import argparse import inkex from inkex import Rectangle from PIL import Image import base64 from io import BytesIO, StringIO from distutils.spawn import find_executable import subprocess from lxml import etree class WebpImport(inkex.InputExtension): def add_arguments(self, pars): pars.add_argument('inputfile') def effect(self): if os.name == 'nt': tmp = os.getenv('TEMP') + '\\' else: tmp = '/tmp/' convertfile = os.path.join(tmp, "webp.png") if find_executable('magick'): command = "magick \"%s\" \"%s\" " % (self.options.inputfile, convertfile) elif find_executable('convert'): command = "convert \"%s\" \"%s\" " % (self.options.inputfile, convertfile) else: inkex.errormsg('ImageMagick does not appear to be installed.') exit() p = subprocess.Popen(command, shell=True) return_code = p.wait() #inkex.utils.debug("command:" + command) #inkex.utils.debug("Errorcode:" + str(return_code)) try: img = Image.open(convertfile) except Image.DecompressionBombError as e: #we could also increse PIL.Image.MAX_IMAGE_PIXELS = some large int self.msg("Error. Image is too large. Reduce DPI and try again!") exit(1) output_buffer = BytesIO() img.save(output_buffer, format='PNG') width, height = img.size byte_data = output_buffer.getvalue() base64_str = base64.b64encode(byte_data).decode('UTF-8') webp = etree.SubElement(Rectangle(), '{http://www.w3.org/2000/svg}image') webp.attrib['x'] = str(0) webp.attrib['y'] = str(0) webp.attrib['width'] = str(width) webp.attrib['height'] = str(height) webp.attrib['{http://www.w3.org/1999/xlink}href'] = "data:image/png;base64,{}".format(base64_str) base = ('' ).format(width, height, 0, 0, width, height) output = StringIO(base) tree = etree.parse(output) output.close() tree.getroot().append(webp) svgfile = os.path.join(tmp, "webp.svg") with open(svgfile, 'w') as file: tree.write(svgfile) with open(svgfile, 'r') as newfile: sys.stdout.write(newfile.read()) def load(self, stream): return str(stream.read()) if __name__ == '__main__': WebpImport().run()