mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 02:34:06 -04:00
Add functionality to the magick_draw module and add commented out code to use it to resize new cover when updating EPUB metadata
This commit is contained in:
parent
983ff06f35
commit
497150207c
@ -5,7 +5,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
|||||||
|
|
||||||
'''Read meta information from epub files'''
|
'''Read meta information from epub files'''
|
||||||
|
|
||||||
import os, re, posixpath
|
import os, re, posixpath, shutil
|
||||||
from cStringIO import StringIO
|
from cStringIO import StringIO
|
||||||
from contextlib import closing
|
from contextlib import closing
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ from calibre.utils.zipfile import ZipFile, BadZipfile, safe_replace
|
|||||||
from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup
|
from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup
|
||||||
from calibre.ebooks.metadata import MetaInformation
|
from calibre.ebooks.metadata import MetaInformation
|
||||||
from calibre.ebooks.metadata.opf2 import OPF
|
from calibre.ebooks.metadata.opf2 import OPF
|
||||||
from calibre.ptempfile import TemporaryDirectory
|
from calibre.ptempfile import TemporaryDirectory, PersistentTemporaryFile
|
||||||
from calibre import CurrentDir
|
from calibre import CurrentDir
|
||||||
|
|
||||||
class EPubException(Exception):
|
class EPubException(Exception):
|
||||||
@ -205,11 +205,19 @@ def set_metadata(stream, mi, apply_null=False, update_timestamp=False):
|
|||||||
cover_replacable = not reader.encryption_meta.is_encrypted(cpath) and \
|
cover_replacable = not reader.encryption_meta.is_encrypted(cpath) and \
|
||||||
os.path.splitext(cpath)[1].lower() in ('.png', '.jpg', '.jpeg')
|
os.path.splitext(cpath)[1].lower() in ('.png', '.jpg', '.jpeg')
|
||||||
if cover_replacable:
|
if cover_replacable:
|
||||||
from calibre.ptempfile import PersistentTemporaryFile
|
from calibre.utils.magick_draw import save_cover_data_to, \
|
||||||
from calibre.utils.magick_draw import save_cover_data_to
|
identify
|
||||||
new_cover = PersistentTemporaryFile(suffix=os.path.splitext(cpath)[1])
|
new_cover = PersistentTemporaryFile(suffix=os.path.splitext(cpath)[1])
|
||||||
|
resize_to = None
|
||||||
|
if False: # Resize new cover to same size as old cover
|
||||||
|
shutil.copyfileobj(reader.open(cpath), new_cover)
|
||||||
new_cover.close()
|
new_cover.close()
|
||||||
save_cover_data_to(new_cdata, new_cover.name)
|
width, height, fmt = identify(new_cover.name)
|
||||||
|
resize_to = (width, height)
|
||||||
|
else:
|
||||||
|
new_cover.close()
|
||||||
|
save_cover_data_to(new_cdata, new_cover.name,
|
||||||
|
resize_to=resize_to)
|
||||||
replacements[cpath] = open(new_cover.name, 'rb')
|
replacements[cpath] = open(new_cover.name, 'rb')
|
||||||
except:
|
except:
|
||||||
import traceback
|
import traceback
|
||||||
|
@ -2661,7 +2661,7 @@ else:
|
|||||||
MagickGetImageSignature = _magick.MagickGetImageSignature
|
MagickGetImageSignature = _magick.MagickGetImageSignature
|
||||||
# MagickGetImageFormat
|
# MagickGetImageFormat
|
||||||
try:
|
try:
|
||||||
_magick.MagickGetImageFormat.restype = ctypes.POINTER(ctypes.c_char)
|
_magick.MagickGetImageFormat.restype = ctypes.c_char_p
|
||||||
_magick.MagickGetImageFormat.argtypes = (MagickWand,)
|
_magick.MagickGetImageFormat.argtypes = (MagickWand,)
|
||||||
except AttributeError,e:
|
except AttributeError,e:
|
||||||
pass
|
pass
|
||||||
|
@ -220,7 +220,7 @@ def create_cover_page(top_lines, logo_path, width=590, height=750,
|
|||||||
p.DestroyMagickWand(canvas)
|
p.DestroyMagickWand(canvas)
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
def save_cover_data_to(data, path, bgcolor='white'):
|
def save_cover_data_to(data, path, bgcolor='white', resize_to=None):
|
||||||
'''
|
'''
|
||||||
Saves image in data to path, in the format specified by the path
|
Saves image in data to path, in the format specified by the path
|
||||||
extension. Composes the image onto a blank canvas so as to
|
extension. Composes the image onto a blank canvas so as to
|
||||||
@ -230,6 +230,8 @@ def save_cover_data_to(data, path, bgcolor='white'):
|
|||||||
f.write(data)
|
f.write(data)
|
||||||
with p.ImageMagick():
|
with p.ImageMagick():
|
||||||
img = load_image(path)
|
img = load_image(path)
|
||||||
|
if resize_to is not None:
|
||||||
|
p.MagickResizeImage(img, resize_to[0], resize_to[1], p.CatromFilter, 1.0)
|
||||||
canvas = create_canvas(p.MagickGetImageWidth(img),
|
canvas = create_canvas(p.MagickGetImageWidth(img),
|
||||||
p.MagickGetImageHeight(img), bgcolor)
|
p.MagickGetImageHeight(img), bgcolor)
|
||||||
compose_image(canvas, img, 0, 0)
|
compose_image(canvas, img, 0, 0)
|
||||||
@ -237,6 +239,22 @@ def save_cover_data_to(data, path, bgcolor='white'):
|
|||||||
p.DestroyMagickWand(img)
|
p.DestroyMagickWand(img)
|
||||||
p.DestroyMagickWand(canvas)
|
p.DestroyMagickWand(canvas)
|
||||||
|
|
||||||
|
def identify(path):
|
||||||
|
'''
|
||||||
|
Identify the image at path. Returns a 3-tuple
|
||||||
|
(width, height, format)
|
||||||
|
or raises an IOError.
|
||||||
|
'''
|
||||||
|
with p.ImageMagick():
|
||||||
|
img = load_image(path)
|
||||||
|
width = p.MagickGetImageWidth(img)
|
||||||
|
height = p.MagickGetImageHeight(img)
|
||||||
|
fmt = p.MagickGetImageFormat(img)
|
||||||
|
if not fmt:
|
||||||
|
fmt = ''
|
||||||
|
fmt = fmt.decode('utf-8', 'replace')
|
||||||
|
return (width, height, fmt)
|
||||||
|
|
||||||
def test():
|
def test():
|
||||||
import subprocess
|
import subprocess
|
||||||
with TemporaryFile('.png') as f:
|
with TemporaryFile('.png') as f:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user