mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
EPUB output: Now works when launched from the command line with no X server on linux
This commit is contained in:
parent
371cb45028
commit
a52d470f20
@ -6,32 +6,60 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
|
import cStringIO
|
||||||
|
|
||||||
from calibre import fit_image
|
from calibre import fit_image
|
||||||
|
|
||||||
class RescaleImages(object):
|
class RescaleImages(object):
|
||||||
'Rescale all images to fit inside given screen size'
|
'Rescale all images to fit inside given screen size'
|
||||||
|
|
||||||
def __call__(self, oeb, opts):
|
def __call__(self, oeb, opts):
|
||||||
from PyQt4.Qt import QApplication, QImage, Qt
|
|
||||||
from calibre.gui2 import pixmap_to_data
|
|
||||||
self.oeb, self.opts, self.log = oeb, opts, oeb.log
|
self.oeb, self.opts, self.log = oeb, opts, oeb.log
|
||||||
page_width, page_height = opts.dest.width, opts.dest.height
|
from calibre.gui2 import is_ok_to_use_qt
|
||||||
for item in oeb.manifest:
|
self.rescale(qt=is_ok_to_use_qt())
|
||||||
|
|
||||||
|
def rescale(self, qt=True):
|
||||||
|
from PyQt4.Qt import QImage, Qt
|
||||||
|
from calibre.gui2 import pixmap_to_data
|
||||||
|
try:
|
||||||
|
from PIL import Image as PILImage
|
||||||
|
PILImage
|
||||||
|
except ImportError:
|
||||||
|
import Image as PILImage
|
||||||
|
|
||||||
|
|
||||||
|
page_width, page_height = self.opts.dest.width, self.opts.dest.height
|
||||||
|
for item in self.oeb.manifest:
|
||||||
if item.media_type.startswith('image'):
|
if item.media_type.startswith('image'):
|
||||||
raw = item.data
|
raw = item.data
|
||||||
if not raw: continue
|
if not raw: continue
|
||||||
if QApplication.instance() is None:
|
if qt:
|
||||||
QApplication([])
|
img = QImage(10, 10, QImage.Format_ARGB32_Premultiplied)
|
||||||
|
if not img.loadFromData(raw): continue
|
||||||
|
width, height = img.width(), img.height()
|
||||||
|
else:
|
||||||
|
f = cStringIO.StringIO(raw)
|
||||||
|
try:
|
||||||
|
im = PILImage.open(f)
|
||||||
|
except IOError:
|
||||||
|
continue
|
||||||
|
width, height = im.size
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
img = QImage(10, 10, QImage.Format_ARGB32_Premultiplied)
|
|
||||||
if not img.loadFromData(raw): continue
|
|
||||||
width, height = img.width(), img.height()
|
|
||||||
scaled, new_width, new_height = fit_image(width, height,
|
scaled, new_width, new_height = fit_image(width, height,
|
||||||
page_width, page_height)
|
page_width, page_height)
|
||||||
if scaled:
|
if scaled:
|
||||||
self.log('Rescaling image', item.href)
|
self.log('Rescaling image', item.href)
|
||||||
img = img.scaled(new_width, new_height,
|
if qt:
|
||||||
Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
|
img = img.scaled(new_width, new_height,
|
||||||
item.data = pixmap_to_data(img)
|
Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
|
||||||
|
item.data = pixmap_to_data(img)
|
||||||
|
else:
|
||||||
|
im = im.resize((int(new_width), int(new_height)), PILImage.ANTIALIAS)
|
||||||
|
of = cStringIO.StringIO()
|
||||||
|
im.convert('RGB').save(of, 'JPEG')
|
||||||
|
item.data = of.getvalue()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user