diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 29e1901ce2..f1eeb23643 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -9,12 +9,6 @@ The database used to store ebook metadata import os, sys, shutil, cStringIO, glob,functools, traceback from itertools import repeat from math import floor -try: - from PIL import Image as PILImage - PILImage -except ImportError: - import Image as PILImage - from PyQt4.QtGui import QImage @@ -37,7 +31,7 @@ from calibre.utils.date import utcnow, now as nowf, utcfromtimestamp from calibre.utils.config import prefs from calibre.utils.search_query_parser import saved_searches from calibre.ebooks import BOOK_EXTENSIONS, check_ebook_format - +from calibre.utils.magick_draw import save_cover_data_to if iswindows: import calibre.utils.winshell as winshell @@ -475,11 +469,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if callable(getattr(data, 'save', None)): data.save(path) else: - f = data - if not callable(getattr(data, 'read', None)): - f = cStringIO.StringIO(data) - im = PILImage.open(f) - im.convert('RGB').save(path, 'JPEG') + if callable(getattr(data, 'read', None)): + data = data.read() + save_cover_data_to(data, path) def book_on_device(self, id): if callable(self.book_on_device_func): diff --git a/src/calibre/utils/magick_draw.py b/src/calibre/utils/magick_draw.py index aeb5bb2268..c4a6c1d76e 100644 --- a/src/calibre/utils/magick_draw.py +++ b/src/calibre/utils/magick_draw.py @@ -212,6 +212,23 @@ def create_cover_page(top_lines, logo_path, width=590, height=750, p.DestroyMagickWand(canvas) return ans +def save_cover_data_to(data, path, bgcolor='white'): + ''' + Saves image in data to path, in the format specified by the path + extension. Composes the image onto a blank cancas so as to + properly convert transparent images. + ''' + with open(path, 'wb') as f: + f.write(data) + with p.ImageMagick(): + img = load_image(path) + canvas = create_canvas(p.MagickGetImageWidth(img), + p.MagickGetImageHeight(img), bgcolor) + compose_image(canvas, img, 0, 0) + p.MagickWriteImage(canvas, path) + p.DestroyMagickWand(img) + p.DestroyMagickWand(canvas) + def test(): import subprocess with TemporaryFile('.png') as f: