mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Use ImageMagick instead of Qt to generate thumbnails when sending covers to device.
This commit is contained in:
parent
0c9f21ed5b
commit
0bba8cf23d
@ -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()
|
ht = self.device_manager.device.THUMBNAIL_HEIGHT \
|
||||||
p.loadFromData(data)
|
if self.device_manager else DevicePlugin.THUMBNAIL_HEIGHT
|
||||||
if not p.isNull():
|
try:
|
||||||
ht = self.device_manager.device.THUMBNAIL_HEIGHT \
|
return thumbnail(data, ht, ht)
|
||||||
if self.device_manager else DevicePlugin.THUMBNAIL_HEIGHT
|
except:
|
||||||
p = p.scaledToHeight(ht, Qt.SmoothTransformation)
|
pass
|
||||||
return (p.width(), p.height(), pixmap_to_data(p))
|
|
||||||
|
|
||||||
def email_news(self, id):
|
def email_news(self, id):
|
||||||
opts = email_config().parse()
|
opts = email_config().parse()
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user