summaryrefslogtreecommitdiffstats
path: root/share/extensions/raster_output_png.py
diff options
context:
space:
mode:
Diffstat (limited to 'share/extensions/raster_output_png.py')
-rwxr-xr-xshare/extensions/raster_output_png.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/share/extensions/raster_output_png.py b/share/extensions/raster_output_png.py
new file mode 100755
index 0000000..b70baa0
--- /dev/null
+++ b/share/extensions/raster_output_png.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+"""
+Optimise PNG file using optipng
+"""
+
+import os
+import inkex
+from inkex.extensions import TempDirMixin
+from inkex.command import ProgramRunError, call
+
+
+class PngOutput(TempDirMixin, inkex.RasterOutputExtension):
+ def add_arguments(self, pars):
+ pars.add_argument("--tab")
+ # Lossless options
+ pars.add_argument("--interlace", type=inkex.Boolean, default=False)
+ pars.add_argument("--level", type=int, default=0)
+ # Lossy options
+ pars.add_argument("--bitdepth", type=inkex.Boolean, default=False)
+ pars.add_argument("--color", type=inkex.Boolean, default=False)
+ pars.add_argument("--palette", type=inkex.Boolean, default=False)
+
+ def load(self, stream):
+ """Load the PNG file (prepare it for optipng)"""
+ self.png_file = os.path.join(self.tempdir, "input.png")
+ with open(self.png_file, "wb") as fhl:
+ fhl.write(stream.read())
+
+ def save(self, stream):
+ """Pass the PNG file to optipng with the options"""
+ options = {
+ "o": self.options.level,
+ "i": int(self.options.interlace),
+ "nb": not self.options.bitdepth,
+ "nc": not self.options.color,
+ "np": not self.options.palette,
+ }
+ try:
+ call("optipng", self.png_file, oldie=True, clobber=True, **options)
+ except ProgramRunError as err:
+ if "IDAT recoding is necessary" in err.stderr.decode("utf-8"):
+ raise inkex.AbortExtension(
+ _(
+ "The optipng command failed, possibly due to a mismatch of the"
+ "interlacing and compression level options. Please try to disable "
+ '"Interlaced" or set "Level" to 1 or higher.'
+ )
+ )
+ else:
+ raise inkex.AbortExtension(
+ _("The optipng command failed with the following message:")
+ + "\n"
+ + err.stderr.decode("utf-8")
+ )
+
+ if os.path.isfile(self.png_file):
+ with open(self.png_file, "rb") as fhl:
+ stream.write(fhl.read())
+
+
+if __name__ == "__main__":
+ PngOutput().run()