%PDF- %PDF-
Direktori : /lib/calibre/calibre/utils/magick/ |
Current File : //lib/calibre/calibre/utils/magick/legacy.py |
#!/usr/bin/env python3 # License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net> import os from io import BytesIO from calibre.utils.img import ( image_and_format_from_data, clone_image, null_image, resize_image, overlay_image, rotate_image, quantize_image, remove_borders_from_image, add_borders_to_image, gaussian_blur_image, create_canvas, despeckle_image, image_to_data, flip_image, image_has_transparent_pixels, set_image_opacity, gaussian_sharpen_image, texture_image, grayscale_image ) from calibre.utils.imghdr import identify class PixelWand: def __init__(self): self.color = '#ffffff' class Image: def __init__(self): self.read_format = None self.write_format = None self.img = null_image() @property def clone(self): ans = Image() ans.img = clone_image(self.img) ans.read_format = self.read_format ans.write_format = self.write_format return ans def open(self, path_or_file): if hasattr(path_or_file, 'read'): self.load(path_or_file.read()) else: with lopen(path_or_file, 'rb') as f: self.load(f.read()) def load(self, data): if not data: raise ValueError('No image data present') self.img, self.read_format = image_and_format_from_data(data) read = load def from_qimage(self, img): self.img = clone_image(img) def to_qimage(self): return clone_image(self.img) @property def type(self): if len(self.img.colorTable()) > 0: return 'PaletteType' return 'TrueColorType' @type.setter def type(self, t): if t == 'GrayscaleType': self.img = grayscale_image(self.img) elif t == 'PaletteType': self.img = quantize_image(self.img) @property def format(self): return self.write_format or self.read_format @format.setter def format(self, val): self.write_format = val @property def colorspace(self): return 'RGBColorspace' @colorspace.setter def colorspace(self, val): raise NotImplementedError('Changing image colorspace is not supported') @property def size(self): return self.img.width(), self.img.height() @size.setter def size(self, val): w, h = val[:2] self.img = resize_image(self.img, w, h) def save(self, path, format=None): if format is None: ext = os.path.splitext(path)[1] if len(ext) < 2: raise ValueError('No format specified') format = ext[1:] format = format.upper() with lopen(path, 'wb') as f: f.write(self.export(format)) def compose(self, img, left=0, top=0, operation='OverCompositeOp'): bounds = self.size if left < 0 or top < 0 or left >= bounds[0] or top >= bounds[1]: raise ValueError('left and/or top out of bounds') self.img = overlay_image(img.img, self.img, left=left, top=top) def rotate(self, background_pixel_wand, degrees): self.img = rotate_image(self.img, degrees) def quantize(self, number_colors, colorspace='RGBColorspace', treedepth=0, dither=True, measure_error=False): self.img = quantize_image(self.img, max_colors=number_colors, dither=dither) def identify(self, data): fmt, width, height = identify(data) return width, height, fmt def remove_border(self, fuzz=None): if fuzz is not None and fuzz < 0 or fuzz > 255: fuzz = None self.img = remove_borders_from_image(self.img, fuzz) trim = remove_border def add_border(self, pixel_wand, dx, dy): self.img = add_borders_to_image(self.img, left=dx, top=dy, right=dx, bottom=dy, border_color=pixel_wand.color) def blur(self, radius=-1, sigma=3.0): self.img = gaussian_blur_image(self.img, radius, sigma) def copy(self, img): self.img = clone_image(img.img) def create_canvas(self, width, height, background_pixel_wand): self.img = create_canvas(width, height, background_pixel_wand) def despeckle(self): self.img = despeckle_image(self.img) def export(self, fmt='JPEG'): if fmt.lower() == 'gif': data = image_to_data(self.img, fmt='PNG', png_compression_level=0) from PIL import Image i = Image.open(BytesIO(data)) buf = BytesIO() i.save(buf, 'gif') return buf.getvalue() return image_to_data(self.img, fmt=fmt) def flip(self, vertical=True): self.img = flip_image(self.img, horizontal=not vertical, vertical=vertical) def has_transparent_pixels(self): return image_has_transparent_pixels(self.img) def set_border_color(self, *args, **kw): pass # no-op def set_compression_quality(self, *args, **kw): pass # no-op def set_opacity(self, alpha=0.5): self.img = set_image_opacity(self.img, alpha) def set_page(self, *args, **kw): pass # no-op def sharpen(self, radius=0, sigma=3): self.img = gaussian_sharpen_image(self.img, radius, sigma) def texture(self, img): self.img = texture_image(self.img, img.img) def thumbnail(self, width, height): self.img = resize_image(self.img, width, height)