def get_cover(self, id, thumbnail=False, thumb_width=60, thumb_height=80): try: self.set_header('Content-Type', 'image/jpeg') cover = self.db.cover(id, index_is_id=True) if cover is None: cover = self.default_cover updated = self.build_time else: updated = self.db.cover_last_modified(id, index_is_id=True) self.set_header('Last-Modified', self.last_modified(updated)) if thumbnail: return generate_thumbnail(cover, width=thumb_width, height=thumb_height)[-1] img = Image() img.load(cover) width, height = img.size scaled, width, height = fit_image( width, height, thumb_width if thumbnail else self.max_cover_width, thumb_height if thumbnail else self.max_cover_height) if not scaled: return cover return save_cover_data_to(img, 'img.jpg', return_data=True, resize_to=(width, height)) except Exception as err: import traceback logging.error('Failed to generate cover:') logging.error(traceback.print_exc()) raise web.HTTPError(404, 'Failed to generate cover: %r' % err)
def get_cover(self, id, thumbnail=False, thumb_width=60, thumb_height=80): try: cherrypy.response.headers['Content-Type'] = 'image/jpeg' cherrypy.response.timeout = 3600 cover = self.db.cover(id, index_is_id=True) if cover is None: cover = self.default_cover updated = self.build_time else: updated = self.db.cover_last_modified(id, index_is_id=True) cherrypy.response.headers['Last-Modified'] = self.last_modified(updated) if thumbnail: return generate_thumbnail(cover, width=thumb_width, height=thumb_height)[-1] img = Image() img.load(cover) width, height = img.size scaled, width, height = fit_image(width, height, thumb_width if thumbnail else self.max_cover_width, thumb_height if thumbnail else self.max_cover_height) if not scaled: return cover return save_cover_data_to(img, 'img.jpg', return_data=True, resize_to=(width, height)) except Exception as err: import traceback cherrypy.log.error('Failed to generate cover:') cherrypy.log.error(traceback.print_exc()) raise cherrypy.HTTPError(404, 'Failed to generate cover: %r'%err)
def rescale(self, qt=True): from calibre.utils.magick.draw import Image is_image_collection = getattr(self.opts, 'is_image_collection', False) if is_image_collection: page_width, page_height = self.opts.dest.comic_screen_size else: page_width, page_height = self.opts.dest.width, self.opts.dest.height page_width -= (self.opts.margin_left + self.opts.margin_right) * self.opts.dest.dpi/72. page_height -= (self.opts.margin_top + self.opts.margin_bottom) * self.opts.dest.dpi/72. for item in self.oeb.manifest: if item.media_type.startswith('image'): ext = item.media_type.split('/')[-1].upper() if ext == 'JPG': ext = 'JPEG' if ext not in ('PNG', 'JPEG', 'GIF'): ext = 'JPEG' raw = item.data if hasattr(raw, 'xpath') or not raw: # Probably an svg image continue try: img = Image() img.load(raw) except: continue width, height = img.size try: if self.check_colorspaces and img.colorspace == 'CMYKColorspace': # We cannot do an automatic conversion of CMYK to RGB as # ImageMagick inverts colors if you just set the colorspace # to rgb. See for example: https://bugs.launchpad.net/bugs/1246710 self.log.warn( 'The image %s is in the CMYK colorspace, you should convert' ' it to sRGB as Adobe Digital Editions cannot render CMYK' % item.href) except Exception: pass scaled, new_width, new_height = fit_image(width, height, page_width, page_height) if scaled: new_width = max(1, new_width) new_height = max(1, new_height) self.log('Rescaling image from %dx%d to %dx%d'%( width, height, new_width, new_height), item.href) try: img.size = (new_width, new_height) data = img.export(ext.lower()) except KeyboardInterrupt: raise except: self.log.exception('Failed to rescale image') else: item.data = data item.unload_data_from_memory()
def mobify_image(data): 'Convert PNG images to GIF as the idiotic Kindle cannot display some PNG' fmt = what(None, data) if fmt == 'png': im = Image() im.load(data) data = im.export('gif') return data
def mobify_image(data): "Convert PNG images to GIF as the idiotic Kindle cannot display some PNG" fmt = what(None, data) if fmt == "png": im = Image() im.load(data) data = im.export("gif") return data
def icon(ctx, rd, which): sz = rd.query.get("sz") if sz != "full": try: sz = int(rd.query.get("sz", 48)) except Exception: sz = 48 if which in {"", "_"}: raise HTTPNotFound() if which.startswith("_"): base = os.path.join(config_dir, "tb_icons") path = os.path.abspath(os.path.join(base, *which[1:].split("/"))) if not path.startswith(base) or ":" in which: raise HTTPNotFound("Naughty, naughty!") else: base = P("images", allow_user_override=False) path = os.path.abspath(os.path.join(base, *which.split("/"))) if not path.startswith(base) or ":" in which: raise HTTPNotFound("Naughty, naughty!") path = os.path.relpath(path, base).replace(os.sep, "/") path = P("images/" + path) if sz == "full": try: return share_open(path, "rb") except EnvironmentError: raise HTTPNotFound() with lock: tdir = os.path.join(rd.tdir, "icons") cached = os.path.join(tdir, "%d-%s.png" % (sz, which)) try: return share_open(cached, "rb") except EnvironmentError: pass try: src = share_open(path, "rb") except EnvironmentError: raise HTTPNotFound() with src: img = Image() img.load(src.read()) width, height = img.size scaled, width, height = fit_image(width, height, sz, sz) if scaled: img.size = (width, height) try: ans = share_open(cached, "w+b") except EnvironmentError: try: os.mkdir(tdir) except EnvironmentError: pass ans = share_open(cached, "w+b") ans.write(img.export("png")) ans.seek(0) return ans
def icon(ctx, rd, which): sz = rd.query.get('sz') if sz != 'full': try: sz = int(rd.query.get('sz', 48)) except Exception: sz = 48 if which in {'', '_'}: raise HTTPNotFound() if which.startswith('_'): base = os.path.join(config_dir, 'tb_icons') path = os.path.abspath(os.path.join(base, *which[1:].split('/'))) if not path.startswith(base) or ':' in which: raise HTTPNotFound('Naughty, naughty!') else: base = P('images', allow_user_override=False) path = os.path.abspath(os.path.join(base, *which.split('/'))) if not path.startswith(base) or ':' in which: raise HTTPNotFound('Naughty, naughty!') path = os.path.relpath(path, base).replace(os.sep, '/') path = P('images/' + path) if sz == 'full': try: return lopen(path, 'rb') except EnvironmentError: raise HTTPNotFound() tdir = os.path.join(rd.tdir, 'icons') cached = os.path.join(tdir, '%d-%s.png' % (sz, which)) try: return lopen(cached, 'rb') except EnvironmentError: pass try: src = lopen(path, 'rb') except EnvironmentError: raise HTTPNotFound() with src: img = Image() img.load(src.read()) width, height = img.size scaled, width, height = fit_image(width, height, sz, sz) if scaled: img.size = (width, height) try: ans = lopen(cached, 'w+b') except EnvironmentError: try: os.mkdir(tdir) except EnvironmentError: pass ans = lopen(cached, 'w+b') ans.write(img.export('png')) ans.seek(0) return ans
def rescale(self, qt=True): from calibre.utils.magick.draw import Image is_image_collection = getattr(self.opts, 'is_image_collection', False) if is_image_collection: page_width, page_height = self.opts.dest.comic_screen_size else: page_width, page_height = self.opts.dest.width, self.opts.dest.height page_width -= (self.opts.margin_left + self.opts.margin_right) * self.opts.dest.dpi/72. page_height -= (self.opts.margin_top + self.opts.margin_bottom) * self.opts.dest.dpi/72. for item in self.oeb.manifest: if item.media_type.startswith('image'): ext = item.media_type.split('/')[-1].upper() if ext == 'JPG': ext = 'JPEG' if ext not in ('PNG', 'JPEG', 'GIF'): ext = 'JPEG' raw = item.data if hasattr(raw, 'xpath') or not raw: # Probably an svg image continue try: img = Image() img.load(raw) except: continue width, height = img.size scaled, new_width, new_height = fit_image(width, height, page_width, page_height) if scaled: new_width = max(1, new_width) new_height = max(1, new_height) self.log('Rescaling image from %dx%d to %dx%d'%( width, height, new_width, new_height), item.href) try: img.size = (new_width, new_height) data = img.export(ext.lower()) except KeyboardInterrupt: raise except: self.log.exception('Failed to rescale image') else: item.data = data item.unload_data_from_memory()
def process_result(log, result): plugin, data = result try: im = Image() im.load(data) im.trim(10) width, height = im.size fmt = im.format if width < 50 or height < 50: raise ValueError('Image too small') data = save_cover_data_to(im, '/cover.jpg', return_data=True) except: log.exception('Invalid cover from', plugin.name) return None return (plugin, width, height, fmt, data)
def process_result(log, result): plugin, data = result try: im = Image() im.load(data) if getattr(plugin, "auto_trim_covers", False): im.trim(10) width, height = im.size fmt = im.format if width < 50 or height < 50: raise ValueError("Image too small") data = save_cover_data_to(im, "/cover.jpg", return_data=True) except: log.exception("Invalid cover from", plugin.name) return None return (plugin, width, height, fmt, data)
def get_cover(self, id, thumbnail=False, thumb_width=60, thumb_height=80): try: cherrypy.response.headers['Content-Type'] = 'image/jpeg' cherrypy.response.timeout = 3600 cover = self.db.cover(id, index_is_id=True) if cover is None: cover = self.default_cover updated = self.build_time else: updated = self.db.cover_last_modified(id, index_is_id=True) cherrypy.response.headers['Last-Modified'] = self.last_modified( updated) if thumbnail: quality = tweaks[ 'content_server_thumbnail_compression_quality'] if quality < 50: quality = 50 elif quality > 99: quality = 99 return generate_thumbnail(cover, width=thumb_width, height=thumb_height, compression_quality=quality)[-1] img = Image() img.load(cover) width, height = img.size scaled, width, height = fit_image( width, height, thumb_width if thumbnail else self.max_cover_width, thumb_height if thumbnail else self.max_cover_height) if not scaled: return cover return save_cover_data_to(img, 'img.jpg', return_data=True, resize_to=(width, height)) except Exception as err: import traceback cherrypy.log.error('Failed to generate cover:') cherrypy.log.error(traceback.print_exc()) raise cherrypy.HTTPError(404, 'Failed to generate cover: %r' % err)
def icon(ctx, rd, which): sz = rd.query.get('sz') if sz != 'full': try: sz = int(rd.query.get('sz', 48)) except Exception: sz = 48 if which in {'', '_'}: raise HTTPNotFound() if which.startswith('_'): base = os.path.join(config_dir, 'tb_icons') path = os.path.abspath(os.path.join(base, *which[1:].split('/'))) if not path.startswith(base) or ':' in which: raise HTTPNotFound('Naughty, naughty!') else: base = P('images', allow_user_override=False) path = os.path.abspath(os.path.join(base, *which.split('/'))) if not path.startswith(base) or ':' in which: raise HTTPNotFound('Naughty, naughty!') path = os.path.relpath(path, base).replace(os.sep, '/') path = P('images/' + path) if sz == 'full': try: return share_open(path, 'rb') except EnvironmentError: raise HTTPNotFound() with lock: tdir = os.path.join(rd.tdir, 'icons') cached = os.path.join(tdir, '%d-%s.png' % (sz, which)) try: return share_open(cached, 'rb') except EnvironmentError: pass try: src = share_open(path, 'rb') except EnvironmentError: raise HTTPNotFound() with src: img = Image() img.load(src.read()) width, height = img.size scaled, width, height = fit_image(width, height, sz, sz) if scaled: img.size = (width, height) try: ans = share_open(cached, 'w+b') except EnvironmentError: try: os.mkdir(tdir) except EnvironmentError: pass ans = share_open(cached, 'w+b') ans.write(img.export('png')) ans.seek(0) return ans
def rescale(self, qt=True): from calibre.utils.magick.draw import Image is_image_collection = getattr(self.opts, 'is_image_collection', False) if is_image_collection: page_width, page_height = self.opts.dest.comic_screen_size else: page_width, page_height = self.opts.dest.width, self.opts.dest.height page_width -= (self.opts.margin_left + self.opts.margin_right) * self.opts.dest.dpi / 72. page_height -= (self.opts.margin_top + self.opts.margin_bottom) * self.opts.dest.dpi / 72. for item in self.oeb.manifest: if item.media_type.startswith('image'): ext = item.media_type.split('/')[-1].upper() if ext == 'JPG': ext = 'JPEG' if ext not in ('PNG', 'JPEG', 'GIF'): ext = 'JPEG' raw = item.data if hasattr(raw, 'xpath') or not raw: # Probably an svg image continue try: img = Image() img.load(raw) except: continue width, height = img.size scaled, new_width, new_height = fit_image( width, height, page_width, page_height) if scaled: new_width = max(1, new_width) new_height = max(1, new_height) self.log( 'Rescaling image from %dx%d to %dx%d' % (width, height, new_width, new_height), item.href) try: img.size = (new_width, new_height) data = img.export(ext.lower()) except KeyboardInterrupt: raise except: self.log.exception('Failed to rescale image') else: item.data = data item.unload_data_from_memory()
def rescale_image(data, maxsizeb=IMAGE_MAX_SIZE, dimen=None): ''' Convert image setting all transparent pixels to white and changing format to JPEG. Ensure the resultant image has a byte size less than maxsizeb. If dimen is not None, generate a thumbnail of width=dimen, height=dimen or width, height = dimen (depending on the type of dimen) Returns the image as a bytestring ''' if dimen is not None: if hasattr(dimen, '__len__'): width, height = dimen else: width = height = dimen data = thumbnail(data, width=width, height=height, compression_quality=90)[-1] else: # Replace transparent pixels with white pixels and convert to JPEG data = save_cover_data_to(data, 'img.jpg', return_data=True) if len(data) <= maxsizeb: return data orig_data = data img = Image() quality = 95 img.load(data) while len(data) >= maxsizeb and quality >= 10: quality -= 5 img.set_compression_quality(quality) data = img.export('jpg') if len(data) <= maxsizeb: return data orig_data = data scale = 0.9 while len(data) >= maxsizeb and scale >= 0.05: img = Image() img.load(orig_data) w, h = img.size img.size = (int(scale * w), int(scale * h)) img.set_compression_quality(quality) data = img.export('jpg') scale -= 0.05 return data
def rescale(self): from calibre.utils.magick.draw import Image is_image_collection = getattr(self.opts, "is_image_collection", False) if is_image_collection: page_width, page_height = self.opts.dest.comic_screen_size else: page_width, page_height = self.opts.dest.width, self.opts.dest.height page_width -= (self.opts.margin_left + self.opts.margin_right) * self.opts.dest.dpi / 72.0 page_height -= (self.opts.margin_top + self.opts.margin_bottom) * self.opts.dest.dpi / 72.0 for item in self.oeb.manifest: if item.media_type.startswith("image"): ext = item.media_type.split("/")[-1].upper() if ext == "JPG": ext = "JPEG" if ext not in ("PNG", "JPEG", "GIF"): ext = "JPEG" raw = item.data if hasattr(raw, "xpath") or not raw: # Probably an svg image continue try: img = Image() img.load(raw) except: continue width, height = img.size try: if self.check_colorspaces and img.colorspace == "CMYKColorspace": # We cannot do an imagemagick conversion of CMYK to RGB as # ImageMagick inverts colors if you just set the colorspace # to rgb. See for example: https://bugs.launchpad.net/bugs/1246710 from PyQt5.Qt import QImage from calibre.gui2 import pixmap_to_data qimg = QImage() qimg.loadFromData(raw) if not qimg.isNull(): raw = item.data = pixmap_to_data(qimg, format=ext, quality=95) img = Image() img.load(raw) self.log.warn( "The image %s is in the CMYK colorspace, converting it " "to RGB as Adobe Digital Editions cannot display CMYK" % item.href ) else: self.log.warn( "The image %s is in the CMYK colorspace, you should convert" " it to sRGB as Adobe Digital Editions cannot render CMYK" % item.href ) except Exception: pass scaled, new_width, new_height = fit_image(width, height, page_width, page_height) if scaled: new_width = max(1, new_width) new_height = max(1, new_height) self.log("Rescaling image from %dx%d to %dx%d" % (width, height, new_width, new_height), item.href) try: img.size = (new_width, new_height) data = img.export(ext.lower()) except KeyboardInterrupt: raise except: self.log.exception("Failed to rescale image") else: item.data = data item.unload_data_from_memory()
def rescale_image(data, maxsizeb=IMAGE_MAX_SIZE, dimen=None): ''' Convert image setting all transparent pixels to white and changing format to JPEG. Ensure the resultant image has a byte size less than maxsizeb. If dimen is not None, generate a thumbnail of width=dimen, height=dimen or width, height = dimen (depending on the type of dimen) Returns the image as a bytestring ''' if dimen is not None: if hasattr(dimen, '__len__'): width, height = dimen else: width = height = dimen data = thumbnail(data, width=width, height=height, compression_quality=90)[-1] else: # Replace transparent pixels with white pixels and convert to JPEG data = save_cover_data_to(data, 'img.jpg', return_data=True) if len(data) <= maxsizeb: return data orig_data = data img = Image() quality = 95 img.load(data) while len(data) >= maxsizeb and quality >= 10: quality -= 5 img.set_compression_quality(quality) data = img.export('jpg') if len(data) <= maxsizeb: return data orig_data = data scale = 0.9 while len(data) >= maxsizeb and scale >= 0.05: img = Image() img.load(orig_data) w, h = img.size img.size = (int(scale*w), int(scale*h)) img.set_compression_quality(quality) data = img.export('jpg') scale -= 0.05 return data
def rescale(self, qt=True): from calibre.utils.magick.draw import Image is_image_collection = getattr(self.opts, 'is_image_collection', False) if is_image_collection: page_width, page_height = self.opts.dest.comic_screen_size else: page_width, page_height = self.opts.dest.width, self.opts.dest.height page_width -= (self.opts.margin_left + self.opts.margin_right) * self.opts.dest.dpi/72. page_height -= (self.opts.margin_top + self.opts.margin_bottom) * self.opts.dest.dpi/72. for item in self.oeb.manifest: if item.media_type.startswith('image'): ext = item.media_type.split('/')[-1].upper() if ext == 'JPG': ext = 'JPEG' if ext not in ('PNG', 'JPEG', 'GIF'): ext = 'JPEG' raw = item.data if hasattr(raw, 'xpath') or not raw: # Probably an svg image continue try: img = Image() img.load(raw) except: continue width, height = img.size try: if self.check_colorspaces and img.colorspace == 'CMYKColorspace': # We cannot do an imagemagick conversion of CMYK to RGB as # ImageMagick inverts colors if you just set the colorspace # to rgb. See for example: https://bugs.launchpad.net/bugs/1246710 from PyQt4.Qt import QImage from calibre.gui2 import pixmap_to_data qimg = QImage() qimg.loadFromData(raw) if not qimg.isNull(): raw = item.data = pixmap_to_data(qimg, format=ext, quality=95) img = Image() img.load(raw) self.log.warn( 'The image %s is in the CMYK colorspace, converting it ' 'to RGB as Adobe Digital Editions cannot display CMYK' % item.href) else: self.log.warn( 'The image %s is in the CMYK colorspace, you should convert' ' it to sRGB as Adobe Digital Editions cannot render CMYK' % item.href) except Exception: pass scaled, new_width, new_height = fit_image(width, height, page_width, page_height) if scaled: new_width = max(1, new_width) new_height = max(1, new_height) self.log('Rescaling image from %dx%d to %dx%d'%( width, height, new_width, new_height), item.href) try: img.size = (new_width, new_height) data = img.export(ext.lower()) except KeyboardInterrupt: raise except: self.log.exception('Failed to rescale image') else: item.data = data item.unload_data_from_memory()