From 0bba8cf23dc8ffec20b253f4246de7db34317f5a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 4 Sep 2010 13:28:09 -0600 Subject: [PATCH] Use ImageMagick instead of Qt to generate thumbnails when sending covers to device. --- src/calibre/gui2/device.py | 32 ++++++++++++-------------------- src/calibre/utils/magick/draw.py | 12 ++++++++++++ 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 1ab00979eb..5fb8b1028b 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -9,9 +9,8 @@ from itertools import repeat from functools import partial from binascii import unhexlify -from PyQt4.Qt import QMenu, QAction, QActionGroup, QIcon, SIGNAL, QPixmap, \ - Qt, pyqtSignal, QColor, QPainter, QDialog, QMessageBox -from PyQt4.QtSvg import QSvgRenderer +from PyQt4.Qt import QMenu, QAction, QActionGroup, QIcon, SIGNAL, \ + Qt, pyqtSignal, QDialog, QMessageBox from calibre.customize.ui import available_input_formats, available_output_formats, \ device_plugins @@ -21,7 +20,7 @@ from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.utils.ipc.job import BaseJob from calibre.devices.scanner import DeviceScanner from calibre.gui2 import config, error_dialog, Dispatcher, dynamic, \ - pixmap_to_data, warning_dialog, \ + warning_dialog, \ question_dialog, info_dialog, choose_dir from calibre.ebooks.metadata import authors_to_string from calibre import preferred_encoding, prints @@ -34,7 +33,7 @@ from calibre.devices.folder_device.driver import FOLDER_DEVICE from calibre.ebooks.metadata.meta import set_metadata from calibre.constants import DEBUG from calibre.utils.config import prefs, tweaks - +from calibre.utils.magick.draw import thumbnail # }}} class DeviceJob(BaseJob): # {{{ @@ -617,14 +616,8 @@ class DeviceMixin(object): # {{{ self.connect_to_folder_named(tweaks['auto_connect_to_folder']) def set_default_thumbnail(self, height): - r = QSvgRenderer(I('book.png')) - pixmap = QPixmap(height, height) - pixmap.fill(QColor(255,255,255)) - p = QPainter(pixmap) - r.render(p) - p.end() - self.default_thumbnail = (pixmap.width(), pixmap.height(), - pixmap_to_data(pixmap)) + img = I('book.png', data=True) + self.default_thumbnail = thumbnail(img, height, height) def connect_to_folder_named(self, folder): if os.path.exists(folder) and os.path.isdir(folder): @@ -959,13 +952,12 @@ class DeviceMixin(object): # {{{ self.library_view.model().delete_books_by_id(remove) def cover_to_thumbnail(self, data): - p = QPixmap() - p.loadFromData(data) - if not p.isNull(): - ht = self.device_manager.device.THUMBNAIL_HEIGHT \ - if self.device_manager else DevicePlugin.THUMBNAIL_HEIGHT - p = p.scaledToHeight(ht, Qt.SmoothTransformation) - return (p.width(), p.height(), pixmap_to_data(p)) + ht = self.device_manager.device.THUMBNAIL_HEIGHT \ + if self.device_manager else DevicePlugin.THUMBNAIL_HEIGHT + try: + return thumbnail(data, ht, ht) + except: + pass def email_news(self, id): opts = email_config().parse() diff --git a/src/calibre/utils/magick/draw.py b/src/calibre/utils/magick/draw.py index b0f75b4ecd..17bf1c273a 100644 --- a/src/calibre/utils/magick/draw.py +++ b/src/calibre/utils/magick/draw.py @@ -8,6 +8,7 @@ __docformat__ = 'restructuredtext en' from calibre.utils.magick import Image, DrawingWand, create_canvas from calibre.constants import __appname__, __version__ +from calibre import fit_image def save_cover_data_to(data, path, bgcolor='white', resize_to=None): ''' @@ -23,6 +24,17 @@ def save_cover_data_to(data, path, bgcolor='white', resize_to=None): canvas.compose(img) canvas.save(path) +def thumbnail(data, width=120, height=120, bgcolor='white', fmt='jpg'): + img = Image() + img.load(data) + owidth, oheight = img.size + scaled, nwidth, nheight = fit_image(owidth, oheight, width, height) + if scaled: + img.size = (nwidth, nheight) + canvas = create_canvas(img.size[0], img.size[1], bgcolor) + canvas.compose(img) + return (canvas.size[0], canvas.size[1], canvas.export(fmt)) + def identify_data(data): ''' Identify the image in data. Returns a 3-tuple