diff --git a/src/calibre/ebooks/metadata/mobi.py b/src/calibre/ebooks/metadata/mobi.py index 408bab828d..30668d70f7 100644 --- a/src/calibre/ebooks/metadata/mobi.py +++ b/src/calibre/ebooks/metadata/mobi.py @@ -404,14 +404,16 @@ class MetadataUpdater(object): if self.cover_record is not None: size = len(self.cover_record) cover = rescale_image(data, size) - cover += '\0' * (size - len(cover)) - self.cover_record[:] = cover + if len(cover) <= size: + cover += '\0' * (size - len(cover)) + self.cover_record[:] = cover if self.thumbnail_record is not None: size = len(self.thumbnail_record) thumbnail = rescale_image(data, size, dimen=MAX_THUMB_DIMEN) - thumbnail += '\0' * (size - len(thumbnail)) - self.thumbnail_record[:] = thumbnail - return + if len(thumbnail) <= size: + thumbnail += '\0' * (size - len(thumbnail)) + self.thumbnail_record[:] = thumbnail + return def set_metadata(stream, mi): mu = MetadataUpdater(stream) diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index e8fc4557fd..5e4dca4a9e 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -112,15 +112,34 @@ def align_block(raw, multiple=4, pad='\0'): def rescale_image(data, maxsizeb, dimen=None): if dimen is not None: - return thumbnail(data, width=dimen, height=dimen)[-1] - # Replace transparent pixels with white pixels and convert to JPEG - data = save_cover_data_to(data, 'img.jpg', return_data=True) + data = thumbnail(data, width=dimen, height=dimen)[-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 + + if hasattr(img, 'set_compression_quality'): + 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(data) + img.load(orig_data) w, h = img.size img.size = (int(scale*w), int(scale*h)) + if hasattr(img, 'set_compression_quality'): + img.set_compression_quality(quality) data = img.export('jpg') scale -= 0.05 return data diff --git a/src/calibre/utils/magick/draw.py b/src/calibre/utils/magick/draw.py index 80fd683196..88f488cb23 100644 --- a/src/calibre/utils/magick/draw.py +++ b/src/calibre/utils/magick/draw.py @@ -72,6 +72,8 @@ def thumbnail(data, width=120, height=120, bgcolor='#ffffff', fmt='jpg'): img.size = (nwidth, nheight) canvas = create_canvas(img.size[0], img.size[1], bgcolor) canvas.compose(img) + if fmt == 'jpg' and hasattr(canvas, 'set_compression_quality'): + canvas.set_compression_quality(70) return (canvas.size[0], canvas.size[1], canvas.export(fmt)) def identify_data(data):