%PDF- %PDF-
| Direktori : /usr/lib/calibre/calibre/ebooks/oeb/polish/check/ |
| Current File : //usr/lib/calibre/calibre/ebooks/oeb/polish/check/images.py |
#!/usr/bin/env python3
__license__ = 'GPL v3'
__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
from io import BytesIO
from PIL import Image
from calibre import as_unicode
from calibre.ebooks.oeb.polish.check.base import BaseError, WARN
from calibre.ebooks.oeb.polish.check.parsing import EmptyFile
from polyglot.builtins import error_message
class InvalidImage(BaseError):
HELP = _('An invalid image is an image that could not be loaded, typically because'
' it is corrupted. You should replace it with a good image or remove it.')
def __init__(self, msg, *args, **kwargs):
BaseError.__init__(self, 'Invalid image: ' + msg, *args, **kwargs)
class CMYKImage(BaseError):
HELP = _('Reader devices based on Adobe Digital Editions cannot display images whose'
' colors are specified in the CMYK colorspace. You should convert this image'
' to the RGB colorspace, for maximum compatibility.')
INDIVIDUAL_FIX = _('Convert image to RGB automatically')
level = WARN
def __call__(self, container):
from qt.core import QImage
from calibre.gui2 import pixmap_to_data
ext = container.mime_map[self.name].split('/')[-1].upper()
if ext == 'JPG':
ext = 'JPEG'
if ext not in ('PNG', 'JPEG', 'GIF'):
return False
with container.open(self.name, 'r+b') as f:
raw = f.read()
i = QImage()
i.loadFromData(raw)
if i.isNull():
return False
raw = pixmap_to_data(i, format=ext, quality=95)
f.seek(0)
f.truncate()
f.write(raw)
return True
def check_raster_images(name, mt, raw):
if not raw:
return [EmptyFile(name)]
errors = []
try:
i = Image.open(BytesIO(raw))
except Exception as e:
errors.append(InvalidImage(as_unicode(error_message(e)), name))
else:
if i.mode == 'CMYK':
errors.append(CMYKImage(_('Image is in the CMYK colorspace'), name))
return errors