Another place ImageMagick was used in the news download subsystem

This commit is contained in:
Kovid Goyal 2016-05-04 17:26:13 +05:30
parent 945e5a9ae2
commit 65b30cdad0
3 changed files with 22 additions and 17 deletions

View File

@ -140,6 +140,18 @@ def save_cover_data_to(data, path=None, bgcolor='#ffffff', resize_to=None, compr
with lopen(path, 'wb') as f: with lopen(path, 'wb') as f:
f.write(image_to_data(img, compression_quality, fmt)) f.write(image_to_data(img, compression_quality, fmt))
def blend_on_canvas(img, width, height, bgcolor='#ffffff'):
w, h = img.width(), img.height()
scaled, nw, nh = fit_image(w, h, width, height)
if scaled:
img = img.scaled(nw, nh, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
w, h = nw, nh
nimg = QImage(width, height, QImage.Format_RGB32)
nimg.fill(QColor(bgcolor))
p = QPainter(nimg)
p.drawImage((width - w)//2, (height - h)//2, img)
p.end()
return nimg
def run_optimizer(file_path, cmd, as_filter=False, input_data=None): def run_optimizer(file_path, cmd, as_filter=False, input_data=None):
file_path = os.path.abspath(file_path) file_path = os.path.abspath(file_path)

View File

@ -23,6 +23,7 @@ from calibre.ebooks.metadata.toc import TOC
from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata import MetaInformation
from calibre.web.feeds import feed_from_xml, templates, feeds_from_index, Feed from calibre.web.feeds import feed_from_xml, templates, feeds_from_index, Feed
from calibre.web.fetch.simple import option_parser as web2disk_option_parser, RecursiveFetcher, AbortArticle from calibre.web.fetch.simple import option_parser as web2disk_option_parser, RecursiveFetcher, AbortArticle
from calibre.web.fetch.utils import prepare_masthead_image
from calibre.utils.threadpool import WorkRequest, ThreadPool, NoResultsPending from calibre.utils.threadpool import WorkRequest, ThreadPool, NoResultsPending
from calibre.ptempfile import PersistentTemporaryFile from calibre.ptempfile import PersistentTemporaryFile
from calibre.utils.date import now as nowf from calibre.utils.date import now as nowf
@ -1374,22 +1375,7 @@ class BasicNewsRecipe(Recipe):
width=self.MI_WIDTH, height=self.MI_HEIGHT) width=self.MI_WIDTH, height=self.MI_HEIGHT)
def prepare_masthead_image(self, path_to_image, out_path): def prepare_masthead_image(self, path_to_image, out_path):
from calibre import fit_image prepare_masthead_image(path_to_image, out_path, self.MI_WIDTH, self.MI_HEIGHT)
from calibre.utils.magick import Image, create_canvas
img = Image()
img.open(path_to_image)
width, height = img.size
scaled, nwidth, nheight = fit_image(width, height, self.MI_WIDTH, self.MI_HEIGHT)
img2 = create_canvas(width, height)
frame = create_canvas(self.MI_WIDTH, self.MI_HEIGHT)
img2.compose(img)
if scaled:
img2.size = (nwidth, nheight, 'LanczosFilter', 0.5)
left = int((self.MI_WIDTH - nwidth)/2.0)
top = int((self.MI_HEIGHT - nheight)/2.0)
frame.compose(img2, left, top)
frame.save(out_path)
def create_opf(self, feeds, dir=None): def create_opf(self, feeds, dir=None):
if dir is None: if dir is None:

View File

@ -4,7 +4,7 @@
from __future__ import (unicode_literals, division, absolute_import, from __future__ import (unicode_literals, division, absolute_import,
print_function) print_function)
from calibre.utils.img import image_from_data, scale_image, image_to_data from calibre.utils.img import image_from_data, scale_image, image_to_data, blend_on_canvas
def rescale_image(data, scale_news_images, compress_news_images_max_size, compress_news_images_auto_size): def rescale_image(data, scale_news_images, compress_news_images_max_size, compress_news_images_auto_size):
orig_data = data # save it in case compression fails orig_data = data # save it in case compression fails
@ -38,6 +38,13 @@ def rescale_image(data, scale_news_images, compress_news_images_max_size, compre
return data return data
def prepare_masthead_image(path_to_image, out_path, mi_width, mi_height):
with lopen(path_to_image, 'rb') as f:
img = image_from_data(f.read())
img = blend_on_canvas(img, mi_width, mi_height)
with lopen(out_path, 'wb') as f:
f.write(image_to_data(img))
if __name__ == '__main__': if __name__ == '__main__':
import sys import sys
data = sys.stdin.read() data = sys.stdin.read()