#!/usr/bin/env python3 import sys import os import argparse import inkex import shutil from inkex import Rectangle from PIL import Image import base64 from io import BytesIO, StringIO 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 shutil.which('magick'): command = "magick \"%s\" \"%s\" " % (self.options.inputfile, convertfile) elif os.name != 'nt' and shutil.which('convert'): #on Windows this command is reserved for some HDD actions command = "convert \"%s\" \"%s\" " % (self.options.inputfile, convertfile) else: inkex.errormsg('ImageMagick does not appear to be installed. Get it from https://imagemagick.org/script/download.php') 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()