From 814cf18c69c7656b0db438c54c03c39619e51302 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Mar 2017 22:06:16 +0530 Subject: [PATCH] Add support for reading JPEG-XR images --- src/calibre/utils/img.py | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/calibre/utils/img.py b/src/calibre/utils/img.py index 75e324ad07..68244cd759 100644 --- a/src/calibre/utils/img.py +++ b/src/calibre/utils/img.py @@ -2,17 +2,28 @@ # vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2015, Kovid Goyal -from __future__ import (unicode_literals, division, absolute_import, - print_function) -import os, subprocess, errno, shutil, tempfile, sys +from __future__ import absolute_import, division, print_function, unicode_literals + +import errno +import os +import shutil +import subprocess +import sys +import tempfile from io import BytesIO from threading import Thread -from PyQt5.Qt import QImage, QByteArray, QBuffer, Qt, QImageReader, QColor, QImageWriter, QTransform, QPixmap +from PyQt5.Qt import ( + QBuffer, QByteArray, QColor, QImage, QImageReader, QImageWriter, QPixmap, Qt, + QTransform +) + from calibre import fit_image, force_unicode from calibre.constants import iswindows, plugins +from calibre.ptempfile import TemporaryDirectory from calibre.utils.config_base import tweaks from calibre.utils.filenames import atomic_rename +from calibre.utils.imghdr import what # Utilities {{{ imageops, imageops_err = plugins['imageops'] @@ -39,6 +50,22 @@ def get_exe_path(name): if not base: return name return os.path.join(base, name) + + +def load_jxr_data(data): + with TemporaryDirectory() as tdir: + if iswindows and isinstance(tdir, type('')): + tdir = tdir.encode('mbcs') + with lopen(os.path.join(tdir, 'input.jxr'), 'wb') as f: + f.write(data) + cmd = [get_exe_path('JxrDecApp'), '-i', 'input.jxr', '-o', 'output.tif', '-c', '0'] + creationflags = 0x08 if iswindows else 0 + subprocess.Popen(cmd, cwd=tdir, stdout=lopen(os.devnull, 'wb'), stderr=subprocess.STDOUT, creationflags=creationflags).wait() + i = QImage() + if not i.load(os.path.join(tdir, 'output.tif')): + raise NotImage('Failed to convert JPEG-XR image') + return i + # }}} # Loading images {{{ @@ -55,6 +82,8 @@ def image_from_data(data): return data i = QImage() if not i.loadFromData(data): + if what(None, data) == 'jxr': + return load_jxr_data(data) raise NotImage('Not a valid image') return i @@ -543,6 +572,9 @@ def test(): # {{{ despeckle_image(img) remove_borders_from_image(img) image_to_data(img, fmt='GIF') + raw = subprocess.Popen([get_exe_path('JxrDecApp'), '-h'], creationflags=0x08 if iswindows else 0, stdout=subprocess.PIPE).stdout.read() + if b'JPEG XR Decoder Utility' not in raw: + raise SystemExit('Failed to run JxrDecApp') # }}}