Use ImageMagick instead of Qt to generate thumbnails when sending covers to device.

This commit is contained in:
Kovid Goyal 2010-09-04 13:28:09 -06:00
parent 0c9f21ed5b
commit 0bba8cf23d
2 changed files with 24 additions and 20 deletions

View File

@ -9,9 +9,8 @@ from itertools import repeat
from functools import partial from functools import partial
from binascii import unhexlify from binascii import unhexlify
from PyQt4.Qt import QMenu, QAction, QActionGroup, QIcon, SIGNAL, QPixmap, \ from PyQt4.Qt import QMenu, QAction, QActionGroup, QIcon, SIGNAL, \
Qt, pyqtSignal, QColor, QPainter, QDialog, QMessageBox Qt, pyqtSignal, QDialog, QMessageBox
from PyQt4.QtSvg import QSvgRenderer
from calibre.customize.ui import available_input_formats, available_output_formats, \ from calibre.customize.ui import available_input_formats, available_output_formats, \
device_plugins device_plugins
@ -21,7 +20,7 @@ from calibre.gui2.dialogs.choose_format import ChooseFormatDialog
from calibre.utils.ipc.job import BaseJob from calibre.utils.ipc.job import BaseJob
from calibre.devices.scanner import DeviceScanner from calibre.devices.scanner import DeviceScanner
from calibre.gui2 import config, error_dialog, Dispatcher, dynamic, \ from calibre.gui2 import config, error_dialog, Dispatcher, dynamic, \
pixmap_to_data, warning_dialog, \ warning_dialog, \
question_dialog, info_dialog, choose_dir question_dialog, info_dialog, choose_dir
from calibre.ebooks.metadata import authors_to_string from calibre.ebooks.metadata import authors_to_string
from calibre import preferred_encoding, prints 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.ebooks.metadata.meta import set_metadata
from calibre.constants import DEBUG from calibre.constants import DEBUG
from calibre.utils.config import prefs, tweaks from calibre.utils.config import prefs, tweaks
from calibre.utils.magick.draw import thumbnail
# }}} # }}}
class DeviceJob(BaseJob): # {{{ class DeviceJob(BaseJob): # {{{
@ -617,14 +616,8 @@ class DeviceMixin(object): # {{{
self.connect_to_folder_named(tweaks['auto_connect_to_folder']) self.connect_to_folder_named(tweaks['auto_connect_to_folder'])
def set_default_thumbnail(self, height): def set_default_thumbnail(self, height):
r = QSvgRenderer(I('book.png')) img = I('book.png', data=True)
pixmap = QPixmap(height, height) self.default_thumbnail = thumbnail(img, 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))
def connect_to_folder_named(self, folder): def connect_to_folder_named(self, folder):
if os.path.exists(folder) and os.path.isdir(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) self.library_view.model().delete_books_by_id(remove)
def cover_to_thumbnail(self, data): def cover_to_thumbnail(self, data):
p = QPixmap()
p.loadFromData(data)
if not p.isNull():
ht = self.device_manager.device.THUMBNAIL_HEIGHT \ ht = self.device_manager.device.THUMBNAIL_HEIGHT \
if self.device_manager else DevicePlugin.THUMBNAIL_HEIGHT if self.device_manager else DevicePlugin.THUMBNAIL_HEIGHT
p = p.scaledToHeight(ht, Qt.SmoothTransformation) try:
return (p.width(), p.height(), pixmap_to_data(p)) return thumbnail(data, ht, ht)
except:
pass
def email_news(self, id): def email_news(self, id):
opts = email_config().parse() opts = email_config().parse()

View File

@ -8,6 +8,7 @@ __docformat__ = 'restructuredtext en'
from calibre.utils.magick import Image, DrawingWand, create_canvas from calibre.utils.magick import Image, DrawingWand, create_canvas
from calibre.constants import __appname__, __version__ from calibre.constants import __appname__, __version__
from calibre import fit_image
def save_cover_data_to(data, path, bgcolor='white', resize_to=None): 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.compose(img)
canvas.save(path) 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): def identify_data(data):
''' '''
Identify the image in data. Returns a 3-tuple Identify the image in data. Returns a 3-tuple