From b47701ec3a5c790741099702677a3d2fea01ed61 Mon Sep 17 00:00:00 2001 From: Ethan Dalool Date: Sat, 3 Aug 2019 00:49:15 -0700 Subject: [PATCH] Add imagecrunch. --- imagecrunch/PIL/BdfFontFile.py | 133 + imagecrunch/PIL/BlpImagePlugin.py | 435 +++ imagecrunch/PIL/BmpImagePlugin.py | 289 ++ imagecrunch/PIL/BufrStubImagePlugin.py | 72 + imagecrunch/PIL/ContainerIO.py | 116 + imagecrunch/PIL/CurImagePlugin.py | 86 + imagecrunch/PIL/DcxImagePlugin.py | 87 + imagecrunch/PIL/DdsImagePlugin.py | 172 + imagecrunch/PIL/EpsImagePlugin.py | 429 +++ imagecrunch/PIL/ExifTags.py | 315 ++ imagecrunch/PIL/FitsStubImagePlugin.py | 75 + imagecrunch/PIL/FliImagePlugin.py | 163 + imagecrunch/PIL/FontFile.py | 114 + imagecrunch/PIL/FpxImagePlugin.py | 229 ++ imagecrunch/PIL/FtexImagePlugin.py | 94 + imagecrunch/PIL/GbrImagePlugin.py | 94 + imagecrunch/PIL/GdImageFile.py | 83 + imagecrunch/PIL/GifImagePlugin.py | 814 +++++ imagecrunch/PIL/GimpGradientFile.py | 138 + imagecrunch/PIL/GimpPaletteFile.py | 62 + imagecrunch/PIL/GribStubImagePlugin.py | 73 + imagecrunch/PIL/Hdf5StubImagePlugin.py | 72 + imagecrunch/PIL/IcnsImagePlugin.py | 374 +++ imagecrunch/PIL/IcoImagePlugin.py | 284 ++ imagecrunch/PIL/ImImagePlugin.py | 347 +++ imagecrunch/PIL/Image.py | 2930 ++++++++++++++++++ imagecrunch/PIL/ImageChops.py | 283 ++ imagecrunch/PIL/ImageCms.py | 955 ++++++ imagecrunch/PIL/ImageColor.py | 309 ++ imagecrunch/PIL/ImageDraw.py | 387 +++ imagecrunch/PIL/ImageDraw2.py | 108 + imagecrunch/PIL/ImageEnhance.py | 100 + imagecrunch/PIL/ImageFile.py | 667 ++++ imagecrunch/PIL/ImageFilter.py | 486 +++ imagecrunch/PIL/ImageFont.py | 471 +++ imagecrunch/PIL/ImageGrab.py | 80 + imagecrunch/PIL/ImageMath.py | 271 ++ imagecrunch/PIL/ImageMode.py | 55 + imagecrunch/PIL/ImageMorph.py | 250 ++ imagecrunch/PIL/ImageOps.py | 529 ++++ imagecrunch/PIL/ImagePalette.py | 216 ++ imagecrunch/PIL/ImagePath.py | 20 + imagecrunch/PIL/ImageQt.py | 212 ++ imagecrunch/PIL/ImageSequence.py | 56 + imagecrunch/PIL/ImageShow.py | 194 ++ imagecrunch/PIL/ImageStat.py | 148 + imagecrunch/PIL/ImageTk.py | 303 ++ imagecrunch/PIL/ImageTransform.py | 98 + imagecrunch/PIL/ImageWin.py | 228 ++ imagecrunch/PIL/ImtImagePlugin.py | 95 + imagecrunch/PIL/IptcImagePlugin.py | 257 ++ imagecrunch/PIL/Jpeg2KImagePlugin.py | 276 ++ imagecrunch/PIL/JpegImagePlugin.py | 804 +++++ imagecrunch/PIL/JpegPresets.py | 241 ++ imagecrunch/PIL/McIdasImagePlugin.py | 75 + imagecrunch/PIL/MicImagePlugin.py | 107 + imagecrunch/PIL/MpegImagePlugin.py | 85 + imagecrunch/PIL/MpoImagePlugin.py | 99 + imagecrunch/PIL/MspImagePlugin.py | 192 ++ imagecrunch/PIL/OleFileIO.py | 4 + imagecrunch/PIL/PSDraw.py | 237 ++ imagecrunch/PIL/PaletteFile.py | 55 + imagecrunch/PIL/PalmImagePlugin.py | 236 ++ imagecrunch/PIL/PcdImagePlugin.py | 66 + imagecrunch/PIL/PcfFontFile.py | 245 ++ imagecrunch/PIL/PcxImagePlugin.py | 179 ++ imagecrunch/PIL/PdfImagePlugin.py | 227 ++ imagecrunch/PIL/PdfParser.py | 844 +++++ imagecrunch/PIL/PixarImagePlugin.py | 71 + imagecrunch/PIL/PngImagePlugin.py | 870 ++++++ imagecrunch/PIL/PpmImagePlugin.py | 157 + imagecrunch/PIL/PsdImagePlugin.py | 307 ++ imagecrunch/PIL/PyAccess.py | 319 ++ imagecrunch/PIL/SgiImagePlugin.py | 227 ++ imagecrunch/PIL/SpiderImagePlugin.py | 314 ++ imagecrunch/PIL/SunImagePlugin.py | 136 + imagecrunch/PIL/TarIO.py | 56 + imagecrunch/PIL/TgaImagePlugin.py | 209 ++ imagecrunch/PIL/TiffImagePlugin.py | 1838 +++++++++++ imagecrunch/PIL/TiffTags.py | 448 +++ imagecrunch/PIL/WalImageFile.py | 128 + imagecrunch/PIL/WebPImagePlugin.py | 316 ++ imagecrunch/PIL/WmfImagePlugin.py | 170 + imagecrunch/PIL/XVThumbImagePlugin.py | 80 + imagecrunch/PIL/XbmImagePlugin.py | 96 + imagecrunch/PIL/XpmImagePlugin.py | 129 + imagecrunch/PIL/__init__.py | 74 + imagecrunch/PIL/_binary.py | 94 + imagecrunch/PIL/_imaging.cp37-win32.pyd | Bin 0 -> 1297408 bytes imagecrunch/PIL/_imagingcms.cp37-win32.pyd | Bin 0 -> 190464 bytes imagecrunch/PIL/_imagingft.cp37-win32.pyd | Bin 0 -> 496128 bytes imagecrunch/PIL/_imagingmath.cp37-win32.pyd | Bin 0 -> 17408 bytes imagecrunch/PIL/_imagingmorph.cp37-win32.pyd | Bin 0 -> 10240 bytes imagecrunch/PIL/_imagingtk.cp37-win32.pyd | Bin 0 -> 12800 bytes imagecrunch/PIL/_tkinter_finder.py | 20 + imagecrunch/PIL/_util.py | 29 + imagecrunch/PIL/_version.py | 2 + imagecrunch/PIL/_webp.cp37-win32.pyd | Bin 0 -> 436736 bytes imagecrunch/PIL/features.py | 85 + imagecrunch/PIL_COPYRIGHT.txt | 26 + imagecrunch/README.md | 6 + imagecrunch/plugin.py | 118 + imagecrunch/plugin.xml | 11 + 103 files changed, 25166 insertions(+) create mode 100644 imagecrunch/PIL/BdfFontFile.py create mode 100644 imagecrunch/PIL/BlpImagePlugin.py create mode 100644 imagecrunch/PIL/BmpImagePlugin.py create mode 100644 imagecrunch/PIL/BufrStubImagePlugin.py create mode 100644 imagecrunch/PIL/ContainerIO.py create mode 100644 imagecrunch/PIL/CurImagePlugin.py create mode 100644 imagecrunch/PIL/DcxImagePlugin.py create mode 100644 imagecrunch/PIL/DdsImagePlugin.py create mode 100644 imagecrunch/PIL/EpsImagePlugin.py create mode 100644 imagecrunch/PIL/ExifTags.py create mode 100644 imagecrunch/PIL/FitsStubImagePlugin.py create mode 100644 imagecrunch/PIL/FliImagePlugin.py create mode 100644 imagecrunch/PIL/FontFile.py create mode 100644 imagecrunch/PIL/FpxImagePlugin.py create mode 100644 imagecrunch/PIL/FtexImagePlugin.py create mode 100644 imagecrunch/PIL/GbrImagePlugin.py create mode 100644 imagecrunch/PIL/GdImageFile.py create mode 100644 imagecrunch/PIL/GifImagePlugin.py create mode 100644 imagecrunch/PIL/GimpGradientFile.py create mode 100644 imagecrunch/PIL/GimpPaletteFile.py create mode 100644 imagecrunch/PIL/GribStubImagePlugin.py create mode 100644 imagecrunch/PIL/Hdf5StubImagePlugin.py create mode 100644 imagecrunch/PIL/IcnsImagePlugin.py create mode 100644 imagecrunch/PIL/IcoImagePlugin.py create mode 100644 imagecrunch/PIL/ImImagePlugin.py create mode 100644 imagecrunch/PIL/Image.py create mode 100644 imagecrunch/PIL/ImageChops.py create mode 100644 imagecrunch/PIL/ImageCms.py create mode 100644 imagecrunch/PIL/ImageColor.py create mode 100644 imagecrunch/PIL/ImageDraw.py create mode 100644 imagecrunch/PIL/ImageDraw2.py create mode 100644 imagecrunch/PIL/ImageEnhance.py create mode 100644 imagecrunch/PIL/ImageFile.py create mode 100644 imagecrunch/PIL/ImageFilter.py create mode 100644 imagecrunch/PIL/ImageFont.py create mode 100644 imagecrunch/PIL/ImageGrab.py create mode 100644 imagecrunch/PIL/ImageMath.py create mode 100644 imagecrunch/PIL/ImageMode.py create mode 100644 imagecrunch/PIL/ImageMorph.py create mode 100644 imagecrunch/PIL/ImageOps.py create mode 100644 imagecrunch/PIL/ImagePalette.py create mode 100644 imagecrunch/PIL/ImagePath.py create mode 100644 imagecrunch/PIL/ImageQt.py create mode 100644 imagecrunch/PIL/ImageSequence.py create mode 100644 imagecrunch/PIL/ImageShow.py create mode 100644 imagecrunch/PIL/ImageStat.py create mode 100644 imagecrunch/PIL/ImageTk.py create mode 100644 imagecrunch/PIL/ImageTransform.py create mode 100644 imagecrunch/PIL/ImageWin.py create mode 100644 imagecrunch/PIL/ImtImagePlugin.py create mode 100644 imagecrunch/PIL/IptcImagePlugin.py create mode 100644 imagecrunch/PIL/Jpeg2KImagePlugin.py create mode 100644 imagecrunch/PIL/JpegImagePlugin.py create mode 100644 imagecrunch/PIL/JpegPresets.py create mode 100644 imagecrunch/PIL/McIdasImagePlugin.py create mode 100644 imagecrunch/PIL/MicImagePlugin.py create mode 100644 imagecrunch/PIL/MpegImagePlugin.py create mode 100644 imagecrunch/PIL/MpoImagePlugin.py create mode 100644 imagecrunch/PIL/MspImagePlugin.py create mode 100644 imagecrunch/PIL/OleFileIO.py create mode 100644 imagecrunch/PIL/PSDraw.py create mode 100644 imagecrunch/PIL/PaletteFile.py create mode 100644 imagecrunch/PIL/PalmImagePlugin.py create mode 100644 imagecrunch/PIL/PcdImagePlugin.py create mode 100644 imagecrunch/PIL/PcfFontFile.py create mode 100644 imagecrunch/PIL/PcxImagePlugin.py create mode 100644 imagecrunch/PIL/PdfImagePlugin.py create mode 100644 imagecrunch/PIL/PdfParser.py create mode 100644 imagecrunch/PIL/PixarImagePlugin.py create mode 100644 imagecrunch/PIL/PngImagePlugin.py create mode 100644 imagecrunch/PIL/PpmImagePlugin.py create mode 100644 imagecrunch/PIL/PsdImagePlugin.py create mode 100644 imagecrunch/PIL/PyAccess.py create mode 100644 imagecrunch/PIL/SgiImagePlugin.py create mode 100644 imagecrunch/PIL/SpiderImagePlugin.py create mode 100644 imagecrunch/PIL/SunImagePlugin.py create mode 100644 imagecrunch/PIL/TarIO.py create mode 100644 imagecrunch/PIL/TgaImagePlugin.py create mode 100644 imagecrunch/PIL/TiffImagePlugin.py create mode 100644 imagecrunch/PIL/TiffTags.py create mode 100644 imagecrunch/PIL/WalImageFile.py create mode 100644 imagecrunch/PIL/WebPImagePlugin.py create mode 100644 imagecrunch/PIL/WmfImagePlugin.py create mode 100644 imagecrunch/PIL/XVThumbImagePlugin.py create mode 100644 imagecrunch/PIL/XbmImagePlugin.py create mode 100644 imagecrunch/PIL/XpmImagePlugin.py create mode 100644 imagecrunch/PIL/__init__.py create mode 100644 imagecrunch/PIL/_binary.py create mode 100644 imagecrunch/PIL/_imaging.cp37-win32.pyd create mode 100644 imagecrunch/PIL/_imagingcms.cp37-win32.pyd create mode 100644 imagecrunch/PIL/_imagingft.cp37-win32.pyd create mode 100644 imagecrunch/PIL/_imagingmath.cp37-win32.pyd create mode 100644 imagecrunch/PIL/_imagingmorph.cp37-win32.pyd create mode 100644 imagecrunch/PIL/_imagingtk.cp37-win32.pyd create mode 100644 imagecrunch/PIL/_tkinter_finder.py create mode 100644 imagecrunch/PIL/_util.py create mode 100644 imagecrunch/PIL/_version.py create mode 100644 imagecrunch/PIL/_webp.cp37-win32.pyd create mode 100644 imagecrunch/PIL/features.py create mode 100644 imagecrunch/PIL_COPYRIGHT.txt create mode 100644 imagecrunch/README.md create mode 100644 imagecrunch/plugin.py create mode 100644 imagecrunch/plugin.xml diff --git a/imagecrunch/PIL/BdfFontFile.py b/imagecrunch/PIL/BdfFontFile.py new file mode 100644 index 0000000..c8bc604 --- /dev/null +++ b/imagecrunch/PIL/BdfFontFile.py @@ -0,0 +1,133 @@ +# +# The Python Imaging Library +# $Id$ +# +# bitmap distribution font (bdf) file parser +# +# history: +# 1996-05-16 fl created (as bdf2pil) +# 1997-08-25 fl converted to FontFile driver +# 2001-05-25 fl removed bogus __init__ call +# 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) +# 2003-04-22 fl more robustification (from Graham Dumpleton) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +from . import Image, FontFile + + +# -------------------------------------------------------------------- +# parse X Bitmap Distribution Format (BDF) +# -------------------------------------------------------------------- + +bdf_slant = { + "R": "Roman", + "I": "Italic", + "O": "Oblique", + "RI": "Reverse Italic", + "RO": "Reverse Oblique", + "OT": "Other" +} + +bdf_spacing = { + "P": "Proportional", + "M": "Monospaced", + "C": "Cell" +} + + +def bdf_char(f): + # skip to STARTCHAR + while True: + s = f.readline() + if not s: + return None + if s[:9] == b"STARTCHAR": + break + id = s[9:].strip().decode('ascii') + + # load symbol properties + props = {} + while True: + s = f.readline() + if not s or s[:6] == b"BITMAP": + break + i = s.find(b" ") + props[s[:i].decode('ascii')] = s[i+1:-1].decode('ascii') + + # load bitmap + bitmap = [] + while True: + s = f.readline() + if not s or s[:7] == b"ENDCHAR": + break + bitmap.append(s[:-1]) + bitmap = b"".join(bitmap) + + [x, y, l, d] = [int(p) for p in props["BBX"].split()] + [dx, dy] = [int(p) for p in props["DWIDTH"].split()] + + bbox = (dx, dy), (l, -d-y, x+l, -d), (0, 0, x, y) + + try: + im = Image.frombytes("1", (x, y), bitmap, "hex", "1") + except ValueError: + # deal with zero-width characters + im = Image.new("1", (x, y)) + + return id, int(props["ENCODING"]), bbox, im + + +## +# Font file plugin for the X11 BDF format. + +class BdfFontFile(FontFile.FontFile): + + def __init__(self, fp): + + FontFile.FontFile.__init__(self) + + s = fp.readline() + if s[:13] != b"STARTFONT 2.1": + raise SyntaxError("not a valid BDF file") + + props = {} + comments = [] + + while True: + s = fp.readline() + if not s or s[:13] == b"ENDPROPERTIES": + break + i = s.find(b" ") + props[s[:i].decode('ascii')] = s[i+1:-1].decode('ascii') + if s[:i] in [b"COMMENT", b"COPYRIGHT"]: + if s.find(b"LogicalFontDescription") < 0: + comments.append(s[i+1:-1].decode('ascii')) + + # font = props["FONT"].split("-") + + # font[4] = bdf_slant[font[4].upper()] + # font[11] = bdf_spacing[font[11].upper()] + + # ascent = int(props["FONT_ASCENT"]) + # descent = int(props["FONT_DESCENT"]) + + # fontname = ";".join(font[1:]) + + # print("#", fontname) + # for i in comments: + # print("#", i) + + while True: + c = bdf_char(fp) + if not c: + break + id, ch, (xy, dst, src), im = c + if 0 <= ch < len(self.glyph): + self.glyph[ch] = xy, dst, src, im diff --git a/imagecrunch/PIL/BlpImagePlugin.py b/imagecrunch/PIL/BlpImagePlugin.py new file mode 100644 index 0000000..9b1a99a --- /dev/null +++ b/imagecrunch/PIL/BlpImagePlugin.py @@ -0,0 +1,435 @@ +""" +Blizzard Mipmap Format (.blp) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +BLP1 files, used mostly in Warcraft III, are not fully supported. +All types of BLP2 files used in World of Warcraft are supported. + +The BLP file structure consists of a header, up to 16 mipmaps of the +texture + +Texture sizes must be powers of two, though the two dimensions do +not have to be equal; 512x256 is valid, but 512x200 is not. +The first mipmap (mipmap #0) is the full size image; each subsequent +mipmap halves both dimensions. The final mipmap should be 1x1. + +BLP files come in many different flavours: +* JPEG-compressed (type == 0) - only supported for BLP1. +* RAW images (type == 1, encoding == 1). Each mipmap is stored as an + array of 8-bit values, one per pixel, left to right, top to bottom. + Each value is an index to the palette. +* DXT-compressed (type == 1, encoding == 2): +- DXT1 compression is used if alpha_encoding == 0. + - An additional alpha bit is used if alpha_depth == 1. + - DXT3 compression is used if alpha_encoding == 1. + - DXT5 compression is used if alpha_encoding == 7. +""" + +import struct +from io import BytesIO + +from . import Image, ImageFile + + +BLP_FORMAT_JPEG = 0 + +BLP_ENCODING_UNCOMPRESSED = 1 +BLP_ENCODING_DXT = 2 +BLP_ENCODING_UNCOMPRESSED_RAW_BGRA = 3 + +BLP_ALPHA_ENCODING_DXT1 = 0 +BLP_ALPHA_ENCODING_DXT3 = 1 +BLP_ALPHA_ENCODING_DXT5 = 7 + + +def unpack_565(i): + return ( + ((i >> 11) & 0x1f) << 3, + ((i >> 5) & 0x3f) << 2, + (i & 0x1f) << 3 + ) + + +def decode_dxt1(data, alpha=False): + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 8 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + # Decode next 8-byte block. + idx = block * 8 + color0, color1, bits = struct.unpack_from("> 2 + + a = 0xFF + if control == 0: + r, g, b = r0, g0, b0 + elif control == 1: + r, g, b = r1, g1, b1 + elif control == 2: + if color0 > color1: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + else: + r = (r0 + r1) // 2 + g = (g0 + g1) // 2 + b = (b0 + b1) // 2 + elif control == 3: + if color0 > color1: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + else: + r, g, b, a = 0, 0, 0, 0 + + if alpha: + ret[j].extend([r, g, b, a]) + else: + ret[j].extend([r, g, b]) + + return ret + + +def decode_dxt3(data): + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + idx = block * 16 + block = data[idx:idx + 16] + # Decode next 16-byte block. + bits = struct.unpack_from("<8B", block) + color0, color1 = struct.unpack_from(">= 4 + else: + high = True + a &= 0xf + a *= 17 # We get a value between 0 and 15 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + r, g, b = r0, g0, b0 + elif color_code == 1: + r, g, b = r1, g1, b1 + elif color_code == 2: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + elif color_code == 3: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) + + return ret + + +def decode_dxt5(data): + """ + input: one "row" of data (i.e. will produce 4 * width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block in range(blocks): + idx = block * 16 + block = data[idx:idx + 16] + # Decode next 16-byte block. + a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 + elif alphacode_index == 15: + alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) + else: # alphacode_index >= 18 and alphacode_index <= 45 + alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 + + if alphacode == 0: + a = a0 + elif alphacode == 1: + a = a1 + elif a0 > a1: + a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 + elif alphacode == 6: + a = 0 + elif alphacode == 7: + a = 255 + else: + a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + r, g, b = r0, g0, b0 + elif color_code == 1: + r, g, b = r1, g1, b1 + elif color_code == 2: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + elif color_code == 3: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) + + return ret + + +class BLPFormatError(NotImplementedError): + pass + + +class BlpImageFile(ImageFile.ImageFile): + """ + Blizzard Mipmap Format + """ + format = "BLP" + format_description = "Blizzard Mipmap Format" + + def _open(self): + self.magic = self.fp.read(4) + self._read_blp_header() + + if self.magic == b"BLP1": + decoder = "BLP1" + self.mode = "RGB" + elif self.magic == b"BLP2": + decoder = "BLP2" + self.mode = "RGBA" if self._blp_alpha_depth else "RGB" + else: + raise BLPFormatError("Bad BLP magic %r" % (self.magic)) + + self.tile = [ + (decoder, (0, 0) + self.size, 0, (self.mode, 0, 1)) + ] + + def _read_blp_header(self): + self._blp_compression, = struct.unpack(" mode, rawmode + 1: ("P", "P;1"), + 4: ("P", "P;4"), + 8: ("P", "P"), + 16: ("RGB", "BGR;15"), + 24: ("RGB", "BGR"), + 32: ("RGB", "BGRX"), +} + + +def _accept(prefix): + return prefix[:2] == b"BM" + + +# ============================================================================== +# Image plugin for the Windows BMP format. +# ============================================================================== +class BmpImageFile(ImageFile.ImageFile): + """ Image plugin for the Windows Bitmap format (BMP) """ + + # -------------------------------------------------------------- Description + format_description = "Windows Bitmap" + format = "BMP" + # --------------------------------------------------- BMP Compression values + COMPRESSIONS = {'RAW': 0, 'RLE8': 1, 'RLE4': 2, 'BITFIELDS': 3, 'JPEG': 4, 'PNG': 5} + RAW, RLE8, RLE4, BITFIELDS, JPEG, PNG = 0, 1, 2, 3, 4, 5 + + def _bitmap(self, header=0, offset=0): + """ Read relevant info about the BMP """ + read, seek = self.fp.read, self.fp.seek + if header: + seek(header) + file_info = {} + file_info['header_size'] = i32(read(4)) # read bmp header size @offset 14 (this is part of the header size) + file_info['direction'] = -1 + # --------------------- If requested, read header at a specific position + header_data = ImageFile._safe_read(self.fp, file_info['header_size'] - 4) # read the rest of the bmp header, without its size + # --------------------------------------------------- IBM OS/2 Bitmap v1 + # ------ This format has different offsets because of width/height types + if file_info['header_size'] == 12: + file_info['width'] = i16(header_data[0:2]) + file_info['height'] = i16(header_data[2:4]) + file_info['planes'] = i16(header_data[4:6]) + file_info['bits'] = i16(header_data[6:8]) + file_info['compression'] = self.RAW + file_info['palette_padding'] = 3 + # ---------------------------------------------- Windows Bitmap v2 to v5 + elif file_info['header_size'] in (40, 64, 108, 124): # v3, OS/2 v2, v4, v5 + if file_info['header_size'] >= 40: # v3 and OS/2 + file_info['y_flip'] = i8(header_data[7]) == 0xff + file_info['direction'] = 1 if file_info['y_flip'] else -1 + file_info['width'] = i32(header_data[0:4]) + file_info['height'] = i32(header_data[4:8]) if not file_info['y_flip'] else 2**32 - i32(header_data[4:8]) + file_info['planes'] = i16(header_data[8:10]) + file_info['bits'] = i16(header_data[10:12]) + file_info['compression'] = i32(header_data[12:16]) + file_info['data_size'] = i32(header_data[16:20]) # byte size of pixel data + file_info['pixels_per_meter'] = (i32(header_data[20:24]), i32(header_data[24:28])) + file_info['colors'] = i32(header_data[28:32]) + file_info['palette_padding'] = 4 + self.info["dpi"] = tuple( + map(lambda x: int(math.ceil(x / 39.3701)), + file_info['pixels_per_meter'])) + if file_info['compression'] == self.BITFIELDS: + if len(header_data) >= 52: + for idx, mask in enumerate(['r_mask', 'g_mask', 'b_mask', 'a_mask']): + file_info[mask] = i32(header_data[36+idx*4:40+idx*4]) + else: + # 40 byte headers only have the three components in the bitfields masks, + # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx + # See also https://github.com/python-pillow/Pillow/issues/1293 + # There is a 4th component in the RGBQuad, in the alpha location, but it + # is listed as a reserved component, and it is not generally an alpha channel + file_info['a_mask'] = 0x0 + for mask in ['r_mask', 'g_mask', 'b_mask']: + file_info[mask] = i32(read(4)) + file_info['rgb_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask']) + file_info['rgba_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask'], file_info['a_mask']) + else: + raise IOError("Unsupported BMP header type (%d)" % file_info['header_size']) + # ------------------ Special case : header is reported 40, which + # ---------------------- is shorter than real size for bpp >= 16 + self.size = file_info['width'], file_info['height'] + # -------- If color count was not found in the header, compute from bits + file_info['colors'] = file_info['colors'] if file_info.get('colors', 0) else (1 << file_info['bits']) + # -------------------------------- Check abnormal values for DOS attacks + if file_info['width'] * file_info['height'] > 2**31: + raise IOError("Unsupported BMP Size: (%dx%d)" % self.size) + # ----------------------- Check bit depth for unusual unsupported values + self.mode, raw_mode = BIT2MODE.get(file_info['bits'], (None, None)) + if self.mode is None: + raise IOError("Unsupported BMP pixel depth (%d)" % file_info['bits']) + # ----------------- Process BMP with Bitfields compression (not palette) + if file_info['compression'] == self.BITFIELDS: + SUPPORTED = { + 32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0), (0xff000000, 0xff0000, 0xff00, 0x0)], + 24: [(0xff0000, 0xff00, 0xff)], + 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)] + } + MASK_MODES = { + (32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", + (32, (0xff000000, 0xff0000, 0xff00, 0x0)): "XBGR", + (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", + (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", + (24, (0xff0000, 0xff00, 0xff)): "BGR", + (16, (0xf800, 0x7e0, 0x1f)): "BGR;16", + (16, (0x7c00, 0x3e0, 0x1f)): "BGR;15" + } + if file_info['bits'] in SUPPORTED: + if file_info['bits'] == 32 and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: + raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] + self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode + elif file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]: + raw_mode = MASK_MODES[(file_info['bits'], file_info['rgb_mask'])] + else: + raise IOError("Unsupported BMP bitfields layout") + else: + raise IOError("Unsupported BMP bitfields layout") + elif file_info['compression'] == self.RAW: + if file_info['bits'] == 32 and header == 22: # 32-bit .cur offset + raw_mode, self.mode = "BGRA", "RGBA" + else: + raise IOError("Unsupported BMP compression (%d)" % file_info['compression']) + # ---------------- Once the header is processed, process the palette/LUT + if self.mode == "P": # Paletted for 1, 4 and 8 bit images + # ----------------------------------------------------- 1-bit images + if not (0 < file_info['colors'] <= 65536): + raise IOError("Unsupported BMP Palette size (%d)" % file_info['colors']) + else: + padding = file_info['palette_padding'] + palette = read(padding * file_info['colors']) + greyscale = True + indices = (0, 255) if file_info['colors'] == 2 else list(range(file_info['colors'])) + # ------------------ Check if greyscale and ignore palette if so + for ind, val in enumerate(indices): + rgb = palette[ind*padding:ind*padding + 3] + if rgb != o8(val) * 3: + greyscale = False + # -------- If all colors are grey, white or black, ditch palette + if greyscale: + self.mode = "1" if file_info['colors'] == 2 else "L" + raw_mode = self.mode + else: + self.mode = "P" + self.palette = ImagePalette.raw("BGRX" if padding == 4 else "BGR", palette) + + # ----------------------------- Finally set the tile data for the plugin + self.info['compression'] = file_info['compression'] + self.tile = [('raw', (0, 0, file_info['width'], file_info['height']), offset or self.fp.tell(), + (raw_mode, ((file_info['width'] * file_info['bits'] + 31) >> 3) & (~3), file_info['direction']) + )] + + def _open(self): + """ Open file, check magic number and read header """ + # read 14 bytes: magic number, filesize, reserved, header final offset + head_data = self.fp.read(14) + # choke if the file does not have the required magic bytes + if head_data[0:2] != b"BM": + raise SyntaxError("Not a BMP file") + # read the start position of the BMP image data (u32) + offset = i32(head_data[10:14]) + # load bitmap information (offset=raster info) + self._bitmap(offset=offset) + + +# ============================================================================== +# Image plugin for the DIB format (BMP alias) +# ============================================================================== +class DibImageFile(BmpImageFile): + + format = "DIB" + format_description = "Windows Bitmap" + + def _open(self): + self._bitmap() + +# +# -------------------------------------------------------------------- +# Write BMP file + + +SAVE = { + "1": ("1", 1, 2), + "L": ("L", 8, 256), + "P": ("P", 8, 256), + "RGB": ("BGR", 24, 0), + "RGBA": ("BGRA", 32, 0), +} + + +def _save(im, fp, filename): + try: + rawmode, bits, colors = SAVE[im.mode] + except KeyError: + raise IOError("cannot write mode %s as BMP" % im.mode) + + info = im.encoderinfo + + dpi = info.get("dpi", (96, 96)) + + # 1 meter == 39.3701 inches + ppm = tuple(map(lambda x: int(x * 39.3701), dpi)) + + stride = ((im.size[0]*bits+7)//8+3) & (~3) + header = 40 # or 64 for OS/2 version 2 + offset = 14 + header + colors * 4 + image = stride * im.size[1] + + # bitmap header + fp.write(b"BM" + # file type (magic) + o32(offset+image) + # file size + o32(0) + # reserved + o32(offset)) # image data offset + + # bitmap info header + fp.write(o32(header) + # info header size + o32(im.size[0]) + # width + o32(im.size[1]) + # height + o16(1) + # planes + o16(bits) + # depth + o32(0) + # compression (0=uncompressed) + o32(image) + # size of bitmap + o32(ppm[0]) + o32(ppm[1]) + # resolution + o32(colors) + # colors used + o32(colors)) # colors important + + fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) + + if im.mode == "1": + for i in (0, 255): + fp.write(o8(i) * 4) + elif im.mode == "L": + for i in range(256): + fp.write(o8(i) * 4) + elif im.mode == "P": + fp.write(im.im.getpalette("RGB", "BGRX")) + + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 0, + (rawmode, stride, -1))]) + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(BmpImageFile.format, BmpImageFile, _accept) +Image.register_save(BmpImageFile.format, _save) + +Image.register_extension(BmpImageFile.format, ".bmp") + +Image.register_mime(BmpImageFile.format, "image/bmp") diff --git a/imagecrunch/PIL/BufrStubImagePlugin.py b/imagecrunch/PIL/BufrStubImagePlugin.py new file mode 100644 index 0000000..16d83c7 --- /dev/null +++ b/imagecrunch/PIL/BufrStubImagePlugin.py @@ -0,0 +1,72 @@ +# +# The Python Imaging Library +# $Id$ +# +# BUFR stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific BUFR image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + +def _accept(prefix): + return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" + + +class BufrStubImageFile(ImageFile.StubImageFile): + + format = "BUFR" + format_description = "BUFR" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(4)): + raise SyntaxError("Not a BUFR file") + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self.size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise IOError("BUFR save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) +Image.register_save(BufrStubImageFile.format, _save) + +Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/imagecrunch/PIL/ContainerIO.py b/imagecrunch/PIL/ContainerIO.py new file mode 100644 index 0000000..496ed68 --- /dev/null +++ b/imagecrunch/PIL/ContainerIO.py @@ -0,0 +1,116 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a class to read from a container file +# +# History: +# 1995-06-18 fl Created +# 1995-09-07 fl Added readline(), readlines() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +## +# A file object that provides read access to a part of an existing +# file (for example a TAR file). + + +class ContainerIO(object): + + def __init__(self, file, offset, length): + """ + Create file object. + + :param file: Existing file. + :param offset: Start of region, in bytes. + :param length: Size of region, in bytes. + """ + self.fh = file + self.pos = 0 + self.offset = offset + self.length = length + self.fh.seek(offset) + + ## + # Always false. + + def isatty(self): + return 0 + + def seek(self, offset, mode=0): + """ + Move file pointer. + + :param offset: Offset in bytes. + :param mode: Starting position. Use 0 for beginning of region, 1 + for current offset, and 2 for end of region. You cannot move + the pointer outside the defined region. + """ + if mode == 1: + self.pos = self.pos + offset + elif mode == 2: + self.pos = self.length + offset + else: + self.pos = offset + # clamp + self.pos = max(0, min(self.pos, self.length)) + self.fh.seek(self.offset + self.pos) + + def tell(self): + """ + Get current file pointer. + + :returns: Offset from start of region, in bytes. + """ + return self.pos + + def read(self, n=0): + """ + Read data. + + :param n: Number of bytes to read. If omitted or zero, + read until end of region. + :returns: An 8-bit string. + """ + if n: + n = min(n, self.length - self.pos) + else: + n = self.length - self.pos + if not n: # EOF + return "" + self.pos = self.pos + n + return self.fh.read(n) + + def readline(self): + """ + Read a line of text. + + :returns: An 8-bit string. + """ + s = "" + while True: + c = self.read(1) + if not c: + break + s = s + c + if c == "\n": + break + return s + + def readlines(self): + """ + Read multiple lines of text. + + :returns: A list of 8-bit strings. + """ + l = [] + while True: + s = self.readline() + if not s: + break + l.append(s) + return l diff --git a/imagecrunch/PIL/CurImagePlugin.py b/imagecrunch/PIL/CurImagePlugin.py new file mode 100644 index 0000000..e4257cd --- /dev/null +++ b/imagecrunch/PIL/CurImagePlugin.py @@ -0,0 +1,86 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Cursor support for PIL +# +# notes: +# uses BmpImagePlugin.py to read the bitmap data. +# +# history: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +from . import Image, BmpImagePlugin +from ._binary import i8, i16le as i16, i32le as i32 + +__version__ = "0.1" + +# +# -------------------------------------------------------------------- + + +def _accept(prefix): + return prefix[:4] == b"\0\0\2\0" + + +## +# Image plugin for Windows Cursor files. + +class CurImageFile(BmpImagePlugin.BmpImageFile): + + format = "CUR" + format_description = "Windows Cursor" + + def _open(self): + + offset = self.fp.tell() + + # check magic + s = self.fp.read(6) + if not _accept(s): + raise SyntaxError("not a CUR file") + + # pick the largest cursor in the file + m = b"" + for i in range(i16(s[4:])): + s = self.fp.read(16) + if not m: + m = s + elif i8(s[0]) > i8(m[0]) and i8(s[1]) > i8(m[1]): + m = s + # print("width", i8(s[0])) + # print("height", i8(s[1])) + # print("colors", i8(s[2])) + # print("reserved", i8(s[3])) + # print("hotspot x", i16(s[4:])) + # print("hotspot y", i16(s[6:])) + # print("bytes", i32(s[8:])) + # print("offset", i32(s[12:])) + if not m: + raise TypeError("No cursors were found") + + # load as bitmap + self._bitmap(i32(m[12:]) + offset) + + # patch up the bitmap height + self.size = self.size[0], self.size[1]//2 + d, e, o, a = self.tile[0] + self.tile[0] = d, (0, 0)+self.size, o, a + + return + + +# +# -------------------------------------------------------------------- + +Image.register_open(CurImageFile.format, CurImageFile, _accept) + +Image.register_extension(CurImageFile.format, ".cur") diff --git a/imagecrunch/PIL/DcxImagePlugin.py b/imagecrunch/PIL/DcxImagePlugin.py new file mode 100644 index 0000000..2045927 --- /dev/null +++ b/imagecrunch/PIL/DcxImagePlugin.py @@ -0,0 +1,87 @@ +# +# The Python Imaging Library. +# $Id$ +# +# DCX file handling +# +# DCX is a container file format defined by Intel, commonly used +# for fax applications. Each DCX file consists of a directory +# (a list of file offsets) followed by a set of (usually 1-bit) +# PCX files. +# +# History: +# 1995-09-09 fl Created +# 1996-03-20 fl Properly derived from PcxImageFile. +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2002-07-30 fl Fixed file handling +# +# Copyright (c) 1997-98 by Secret Labs AB. +# Copyright (c) 1995-96 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._binary import i32le as i32 +from .PcxImagePlugin import PcxImageFile + +__version__ = "0.2" + +MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? + + +def _accept(prefix): + return len(prefix) >= 4 and i32(prefix) == MAGIC + + +## +# Image plugin for the Intel DCX format. + +class DcxImageFile(PcxImageFile): + + format = "DCX" + format_description = "Intel DCX" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # Header + s = self.fp.read(4) + if i32(s) != MAGIC: + raise SyntaxError("not a DCX file") + + # Component directory + self._offset = [] + for i in range(1024): + offset = i32(self.fp.read(4)) + if not offset: + break + self._offset.append(offset) + + self.__fp = self.fp + self.frame = None + self.seek(0) + + @property + def n_frames(self): + return len(self._offset) + + @property + def is_animated(self): + return len(self._offset) > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + self.frame = frame + self.fp = self.__fp + self.fp.seek(self._offset[frame]) + PcxImageFile._open(self) + + def tell(self): + return self.frame + + +Image.register_open(DcxImageFile.format, DcxImageFile, _accept) + +Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/imagecrunch/PIL/DdsImagePlugin.py b/imagecrunch/PIL/DdsImagePlugin.py new file mode 100644 index 0000000..e755f94 --- /dev/null +++ b/imagecrunch/PIL/DdsImagePlugin.py @@ -0,0 +1,172 @@ +""" +A Pillow loader for .dds files (S3TC-compressed aka DXTC) +Jerome Leclanche + +Documentation: + https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ +""" + +import struct +from io import BytesIO +from . import Image, ImageFile + + +# Magic ("DDS ") +DDS_MAGIC = 0x20534444 + +# DDS flags +DDSD_CAPS = 0x1 +DDSD_HEIGHT = 0x2 +DDSD_WIDTH = 0x4 +DDSD_PITCH = 0x8 +DDSD_PIXELFORMAT = 0x1000 +DDSD_MIPMAPCOUNT = 0x20000 +DDSD_LINEARSIZE = 0x80000 +DDSD_DEPTH = 0x800000 + +# DDS caps +DDSCAPS_COMPLEX = 0x8 +DDSCAPS_TEXTURE = 0x1000 +DDSCAPS_MIPMAP = 0x400000 + +DDSCAPS2_CUBEMAP = 0x200 +DDSCAPS2_CUBEMAP_POSITIVEX = 0x400 +DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800 +DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000 +DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000 +DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000 +DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000 +DDSCAPS2_VOLUME = 0x200000 + +# Pixel Format +DDPF_ALPHAPIXELS = 0x1 +DDPF_ALPHA = 0x2 +DDPF_FOURCC = 0x4 +DDPF_PALETTEINDEXED8 = 0x20 +DDPF_RGB = 0x40 +DDPF_LUMINANCE = 0x20000 + + +# dds.h + +DDS_FOURCC = DDPF_FOURCC +DDS_RGB = DDPF_RGB +DDS_RGBA = DDPF_RGB | DDPF_ALPHAPIXELS +DDS_LUMINANCE = DDPF_LUMINANCE +DDS_LUMINANCEA = DDPF_LUMINANCE | DDPF_ALPHAPIXELS +DDS_ALPHA = DDPF_ALPHA +DDS_PAL8 = DDPF_PALETTEINDEXED8 + +DDS_HEADER_FLAGS_TEXTURE = (DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | + DDSD_PIXELFORMAT) +DDS_HEADER_FLAGS_MIPMAP = DDSD_MIPMAPCOUNT +DDS_HEADER_FLAGS_VOLUME = DDSD_DEPTH +DDS_HEADER_FLAGS_PITCH = DDSD_PITCH +DDS_HEADER_FLAGS_LINEARSIZE = DDSD_LINEARSIZE + +DDS_HEIGHT = DDSD_HEIGHT +DDS_WIDTH = DDSD_WIDTH + +DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS_TEXTURE +DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS_COMPLEX | DDSCAPS_MIPMAP +DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS_COMPLEX + +DDS_CUBEMAP_POSITIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX +DDS_CUBEMAP_NEGATIVEX = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX +DDS_CUBEMAP_POSITIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY +DDS_CUBEMAP_NEGATIVEY = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY +DDS_CUBEMAP_POSITIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ +DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ + + +# DXT1 +DXT1_FOURCC = 0x31545844 + +# DXT3 +DXT3_FOURCC = 0x33545844 + +# DXT5 +DXT5_FOURCC = 0x35545844 + + +# dxgiformat.h + +DXGI_FORMAT_BC7_TYPELESS = 97 +DXGI_FORMAT_BC7_UNORM = 98 +DXGI_FORMAT_BC7_UNORM_SRGB = 99 + + +class DdsImageFile(ImageFile.ImageFile): + format = "DDS" + format_description = "DirectDraw Surface" + + def _open(self): + magic, header_size = struct.unpack(" 0: + s = fp.read(min(lengthfile, 100*1024)) + if not s: + break + lengthfile -= len(s) + f.write(s) + + # Build ghostscript command + command = ["gs", + "-q", # quiet mode + "-g%dx%d" % size, # set output geometry (pixels) + "-r%fx%f" % res, # set input DPI (dots per inch) + "-dBATCH", # exit after processing + "-dNOPAUSE", # don't pause between pages, + "-dSAFER", # safe mode + "-sDEVICE=ppmraw", # ppm driver + "-sOutputFile=%s" % outfile, # output file + "-c", "%d %d translate" % (-bbox[0], -bbox[1]), + # adjust for image origin + "-f", infile, # input file + "-c", "showpage", # showpage (see: https://bugs.ghostscript.com/show_bug.cgi?id=698272) + ] + + if gs_windows_binary is not None: + if not gs_windows_binary: + raise WindowsError('Unable to locate Ghostscript on paths') + command[0] = gs_windows_binary + + # push data through ghostscript + try: + with open(os.devnull, 'w+b') as devnull: + subprocess.check_call(command, stdin=devnull, stdout=devnull) + im = Image.open(outfile) + im.load() + finally: + try: + os.unlink(outfile) + if infile_temp: + os.unlink(infile_temp) + except OSError: + pass + + return im.im.copy() + + +class PSFile(object): + """ + Wrapper for bytesio object that treats either CR or LF as end of line. + """ + def __init__(self, fp): + self.fp = fp + self.char = None + + def seek(self, offset, whence=0): + self.char = None + self.fp.seek(offset, whence) + + def readline(self): + s = self.char or b"" + self.char = None + + c = self.fp.read(1) + while c not in b"\r\n": + s = s + c + c = self.fp.read(1) + + self.char = self.fp.read(1) + # line endings can be 1 or 2 of \r \n, in either order + if self.char in b"\r\n": + self.char = None + + return s.decode('latin-1') + + +def _accept(prefix): + return prefix[:4] == b"%!PS" or \ + (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5) + +## +# Image plugin for Encapsulated Postscript. This plugin supports only +# a few variants of this format. + + +class EpsImageFile(ImageFile.ImageFile): + """EPS File Parser for the Python Imaging Library""" + + format = "EPS" + format_description = "Encapsulated Postscript" + + mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} + + def _open(self): + (length, offset) = self._find_offset(self.fp) + + # Rewrap the open file pointer in something that will + # convert line endings and decode to latin-1. + try: + if py3: + # Python3, can use bare open command. + fp = open(self.fp.name, "Ur", encoding='latin-1') + else: + # Python2, no encoding conversion necessary + fp = open(self.fp.name, "Ur") + except: + # Expect this for bytesio/stringio + fp = PSFile(self.fp) + + # go to offset - start of "%!PS" + fp.seek(offset) + + box = None + + self.mode = "RGB" + self.size = 1, 1 # FIXME: huh? + + # + # Load EPS header + + s_raw = fp.readline() + s = s_raw.strip('\r\n') + + while s_raw: + if s: + if len(s) > 255: + raise SyntaxError("not an EPS file") + + try: + m = split.match(s) + except re.error as v: + raise SyntaxError("not an EPS file") + + if m: + k, v = m.group(1, 2) + self.info[k] = v + if k == "BoundingBox": + try: + # Note: The DSC spec says that BoundingBox + # fields should be integers, but some drivers + # put floating point values there anyway. + box = [int(float(i)) for i in v.split()] + self.size = box[2] - box[0], box[3] - box[1] + self.tile = [("eps", (0, 0) + self.size, offset, + (length, box))] + except: + pass + + else: + m = field.match(s) + if m: + k = m.group(1) + + if k == "EndComments": + break + if k[:8] == "PS-Adobe": + self.info[k[:8]] = k[9:] + else: + self.info[k] = "" + elif s[0] == '%': + # handle non-DSC Postscript comments that some + # tools mistakenly put in the Comments section + pass + else: + raise IOError("bad EPS header") + + s_raw = fp.readline() + s = s_raw.strip('\r\n') + + if s and s[:1] != "%": + break + + # + # Scan for an "ImageData" descriptor + + while s[:1] == "%": + + if len(s) > 255: + raise SyntaxError("not an EPS file") + + if s[:11] == "%ImageData:": + # Encoded bitmapped image. + x, y, bi, mo = s[11:].split(None, 7)[:4] + + if int(bi) != 8: + break + try: + self.mode = self.mode_map[int(mo)] + except ValueError: + break + + self.size = int(x), int(y) + return + + s = fp.readline().strip('\r\n') + if not s: + break + + if not box: + raise IOError("cannot determine EPS bounding box") + + def _find_offset(self, fp): + + s = fp.read(160) + + if s[:4] == b"%!PS": + # for HEAD without binary preview + fp.seek(0, 2) + length = fp.tell() + offset = 0 + elif i32(s[0:4]) == 0xC6D3D0C5: + # FIX for: Some EPS file not handled correctly / issue #302 + # EPS can contain binary data + # or start directly with latin coding + # more info see: + # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf + offset = i32(s[4:8]) + length = i32(s[8:12]) + else: + raise SyntaxError("not an EPS file") + + return (length, offset) + + def load(self, scale=1): + # Load EPS via Ghostscript + if not self.tile: + return + self.im = Ghostscript(self.tile, self.size, self.fp, scale) + self.mode = self.im.mode + self.size = self.im.size + self.tile = [] + + def load_seek(self, *args, **kwargs): + # we can't incrementally load, so force ImageFile.parser to + # use our custom load method by defining this method. + pass + + +# +# -------------------------------------------------------------------- + +def _save(im, fp, filename, eps=1): + """EPS Writer for the Python Imaging Library.""" + + # + # make sure image data is available + im.load() + + # + # determine postscript image mode + if im.mode == "L": + operator = (8, 1, "image") + elif im.mode == "RGB": + operator = (8, 3, "false 3 colorimage") + elif im.mode == "CMYK": + operator = (8, 4, "false 4 colorimage") + else: + raise ValueError("image mode is not supported") + + class NoCloseStream(object): + def __init__(self, fp): + self.fp = fp + + def __getattr__(self, name): + return getattr(self.fp, name) + + def close(self): + pass + + base_fp = fp + if fp != sys.stdout: + fp = NoCloseStream(fp) + if sys.version_info.major > 2: + fp = io.TextIOWrapper(fp, encoding='latin-1') + + if eps: + # + # write EPS header + fp.write("%!PS-Adobe-3.0 EPSF-3.0\n") + fp.write("%%Creator: PIL 0.1 EpsEncode\n") + # fp.write("%%CreationDate: %s"...) + fp.write("%%%%BoundingBox: 0 0 %d %d\n" % im.size) + fp.write("%%Pages: 1\n") + fp.write("%%EndComments\n") + fp.write("%%Page: 1 1\n") + fp.write("%%ImageData: %d %d " % im.size) + fp.write("%d %d 0 1 1 \"%s\"\n" % operator) + + # + # image header + fp.write("gsave\n") + fp.write("10 dict begin\n") + fp.write("/buf %d string def\n" % (im.size[0] * operator[1])) + fp.write("%d %d scale\n" % im.size) + fp.write("%d %d 8\n" % im.size) # <= bits + fp.write("[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) + fp.write("{ currentfile buf readhexstring pop } bind\n") + fp.write(operator[2] + "\n") + if hasattr(fp, "flush"): + fp.flush() + + ImageFile._save(im, base_fp, [("eps", (0, 0)+im.size, 0, None)]) + + fp.write("\n%%%%EndBinary\n") + fp.write("grestore end\n") + if hasattr(fp, "flush"): + fp.flush() + +# +# -------------------------------------------------------------------- + + +Image.register_open(EpsImageFile.format, EpsImageFile, _accept) + +Image.register_save(EpsImageFile.format, _save) + +Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) + +Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/imagecrunch/PIL/ExifTags.py b/imagecrunch/PIL/ExifTags.py new file mode 100644 index 0000000..a8ad26b --- /dev/null +++ b/imagecrunch/PIL/ExifTags.py @@ -0,0 +1,315 @@ +# +# The Python Imaging Library. +# $Id$ +# +# EXIF tags +# +# Copyright (c) 2003 by Secret Labs AB +# +# See the README file for information on usage and redistribution. +# + +## +# This module provides constants and clear-text names for various +# well-known EXIF tags. +## + +## +# Maps EXIF tags to tag names. + +TAGS = { + + # possibly incomplete + 0x000b: "ProcessingSoftware", + 0x00fe: "NewSubfileType", + 0x00ff: "SubfileType", + 0x0100: "ImageWidth", + 0x0101: "ImageLength", + 0x0102: "BitsPerSample", + 0x0103: "Compression", + 0x0106: "PhotometricInterpretation", + 0x0107: "Thresholding", + 0x0108: "CellWidth", + 0x0109: "CellLength", + 0x010a: "FillOrder", + 0x010d: "DocumentName", + 0x010e: "ImageDescription", + 0x010f: "Make", + 0x0110: "Model", + 0x0111: "StripOffsets", + 0x0112: "Orientation", + 0x0115: "SamplesPerPixel", + 0x0116: "RowsPerStrip", + 0x0117: "StripByteCounts", + 0x0118: "MinSampleValue", + 0x0119: "MaxSampleValue", + 0x011a: "XResolution", + 0x011b: "YResolution", + 0x011c: "PlanarConfiguration", + 0x011d: "PageName", + 0x0120: "FreeOffsets", + 0x0121: "FreeByteCounts", + 0x0122: "GrayResponseUnit", + 0x0123: "GrayResponseCurve", + 0x0124: "T4Options", + 0x0125: "T6Options", + 0x0128: "ResolutionUnit", + 0x0129: "PageNumber", + 0x012d: "TransferFunction", + 0x0131: "Software", + 0x0132: "DateTime", + 0x013b: "Artist", + 0x013c: "HostComputer", + 0x013d: "Predictor", + 0x013e: "WhitePoint", + 0x013f: "PrimaryChromaticities", + 0x0140: "ColorMap", + 0x0141: "HalftoneHints", + 0x0142: "TileWidth", + 0x0143: "TileLength", + 0x0144: "TileOffsets", + 0x0145: "TileByteCounts", + 0x014a: "SubIFDs", + 0x014c: "InkSet", + 0x014d: "InkNames", + 0x014e: "NumberOfInks", + 0x0150: "DotRange", + 0x0151: "TargetPrinter", + 0x0152: "ExtraSamples", + 0x0153: "SampleFormat", + 0x0154: "SMinSampleValue", + 0x0155: "SMaxSampleValue", + 0x0156: "TransferRange", + 0x0157: "ClipPath", + 0x0158: "XClipPathUnits", + 0x0159: "YClipPathUnits", + 0x015a: "Indexed", + 0x015b: "JPEGTables", + 0x015f: "OPIProxy", + 0x0200: "JPEGProc", + 0x0201: "JpegIFOffset", + 0x0202: "JpegIFByteCount", + 0x0203: "JpegRestartInterval", + 0x0205: "JpegLosslessPredictors", + 0x0206: "JpegPointTransforms", + 0x0207: "JpegQTables", + 0x0208: "JpegDCTables", + 0x0209: "JpegACTables", + 0x0211: "YCbCrCoefficients", + 0x0212: "YCbCrSubSampling", + 0x0213: "YCbCrPositioning", + 0x0214: "ReferenceBlackWhite", + 0x02bc: "XMLPacket", + 0x1000: "RelatedImageFileFormat", + 0x1001: "RelatedImageWidth", + 0x1002: "RelatedImageLength", + 0x4746: "Rating", + 0x4749: "RatingPercent", + 0x800d: "ImageID", + 0x828d: "CFARepeatPatternDim", + 0x828e: "CFAPattern", + 0x828f: "BatteryLevel", + 0x8298: "Copyright", + 0x829a: "ExposureTime", + 0x829d: "FNumber", + 0x83bb: "IPTCNAA", + 0x8649: "ImageResources", + 0x8769: "ExifOffset", + 0x8773: "InterColorProfile", + 0x8822: "ExposureProgram", + 0x8824: "SpectralSensitivity", + 0x8825: "GPSInfo", + 0x8827: "ISOSpeedRatings", + 0x8828: "OECF", + 0x8829: "Interlace", + 0x882a: "TimeZoneOffset", + 0x882b: "SelfTimerMode", + 0x9000: "ExifVersion", + 0x9003: "DateTimeOriginal", + 0x9004: "DateTimeDigitized", + 0x9101: "ComponentsConfiguration", + 0x9102: "CompressedBitsPerPixel", + 0x9201: "ShutterSpeedValue", + 0x9202: "ApertureValue", + 0x9203: "BrightnessValue", + 0x9204: "ExposureBiasValue", + 0x9205: "MaxApertureValue", + 0x9206: "SubjectDistance", + 0x9207: "MeteringMode", + 0x9208: "LightSource", + 0x9209: "Flash", + 0x920a: "FocalLength", + 0x920b: "FlashEnergy", + 0x920c: "SpatialFrequencyResponse", + 0x920d: "Noise", + 0x9211: "ImageNumber", + 0x9212: "SecurityClassification", + 0x9213: "ImageHistory", + 0x9214: "SubjectLocation", + 0x9215: "ExposureIndex", + 0x9216: "TIFF/EPStandardID", + 0x927c: "MakerNote", + 0x9286: "UserComment", + 0x9290: "SubsecTime", + 0x9291: "SubsecTimeOriginal", + 0x9292: "SubsecTimeDigitized", + 0x9c9b: "XPTitle", + 0x9c9c: "XPComment", + 0x9c9d: "XPAuthor", + 0x9c9e: "XPKeywords", + 0x9c9f: "XPSubject", + 0xa000: "FlashPixVersion", + 0xa001: "ColorSpace", + 0xa002: "ExifImageWidth", + 0xa003: "ExifImageHeight", + 0xa004: "RelatedSoundFile", + 0xa005: "ExifInteroperabilityOffset", + 0xa20b: "FlashEnergy", + 0xa20c: "SpatialFrequencyResponse", + 0xa20e: "FocalPlaneXResolution", + 0xa20f: "FocalPlaneYResolution", + 0xa210: "FocalPlaneResolutionUnit", + 0xa214: "SubjectLocation", + 0xa215: "ExposureIndex", + 0xa217: "SensingMethod", + 0xa300: "FileSource", + 0xa301: "SceneType", + 0xa302: "CFAPattern", + 0xa401: "CustomRendered", + 0xa402: "ExposureMode", + 0xa403: "WhiteBalance", + 0xa404: "DigitalZoomRatio", + 0xa405: "FocalLengthIn35mmFilm", + 0xa406: "SceneCaptureType", + 0xa407: "GainControl", + 0xa408: "Contrast", + 0xa409: "Saturation", + 0xa40a: "Sharpness", + 0xa40b: "DeviceSettingDescription", + 0xa40c: "SubjectDistanceRange", + 0xa420: "ImageUniqueID", + 0xa430: "CameraOwnerName", + 0xa431: "BodySerialNumber", + 0xa432: "LensSpecification", + 0xa433: "LensMake", + 0xa434: "LensModel", + 0xa435: "LensSerialNumber", + 0xa500: "Gamma", + 0xc4a5: "PrintImageMatching", + 0xc612: "DNGVersion", + 0xc613: "DNGBackwardVersion", + 0xc614: "UniqueCameraModel", + 0xc615: "LocalizedCameraModel", + 0xc616: "CFAPlaneColor", + 0xc617: "CFALayout", + 0xc618: "LinearizationTable", + 0xc619: "BlackLevelRepeatDim", + 0xc61a: "BlackLevel", + 0xc61b: "BlackLevelDeltaH", + 0xc61c: "BlackLevelDeltaV", + 0xc61d: "WhiteLevel", + 0xc61e: "DefaultScale", + 0xc61f: "DefaultCropOrigin", + 0xc620: "DefaultCropSize", + 0xc621: "ColorMatrix1", + 0xc622: "ColorMatrix2", + 0xc623: "CameraCalibration1", + 0xc624: "CameraCalibration2", + 0xc625: "ReductionMatrix1", + 0xc626: "ReductionMatrix2", + 0xc627: "AnalogBalance", + 0xc628: "AsShotNeutral", + 0xc629: "AsShotWhiteXY", + 0xc62a: "BaselineExposure", + 0xc62b: "BaselineNoise", + 0xc62c: "BaselineSharpness", + 0xc62d: "BayerGreenSplit", + 0xc62e: "LinearResponseLimit", + 0xc62f: "CameraSerialNumber", + 0xc630: "LensInfo", + 0xc631: "ChromaBlurRadius", + 0xc632: "AntiAliasStrength", + 0xc633: "ShadowScale", + 0xc634: "DNGPrivateData", + 0xc635: "MakerNoteSafety", + 0xc65a: "CalibrationIlluminant1", + 0xc65b: "CalibrationIlluminant2", + 0xc65c: "BestQualityScale", + 0xc65d: "RawDataUniqueID", + 0xc68b: "OriginalRawFileName", + 0xc68c: "OriginalRawFileData", + 0xc68d: "ActiveArea", + 0xc68e: "MaskedAreas", + 0xc68f: "AsShotICCProfile", + 0xc690: "AsShotPreProfileMatrix", + 0xc691: "CurrentICCProfile", + 0xc692: "CurrentPreProfileMatrix", + 0xc6bf: "ColorimetricReference", + 0xc6f3: "CameraCalibrationSignature", + 0xc6f4: "ProfileCalibrationSignature", + 0xc6f6: "AsShotProfileName", + 0xc6f7: "NoiseReductionApplied", + 0xc6f8: "ProfileName", + 0xc6f9: "ProfileHueSatMapDims", + 0xc6fa: "ProfileHueSatMapData1", + 0xc6fb: "ProfileHueSatMapData2", + 0xc6fc: "ProfileToneCurve", + 0xc6fd: "ProfileEmbedPolicy", + 0xc6fe: "ProfileCopyright", + 0xc714: "ForwardMatrix1", + 0xc715: "ForwardMatrix2", + 0xc716: "PreviewApplicationName", + 0xc717: "PreviewApplicationVersion", + 0xc718: "PreviewSettingsName", + 0xc719: "PreviewSettingsDigest", + 0xc71a: "PreviewColorSpace", + 0xc71b: "PreviewDateTime", + 0xc71c: "RawImageDigest", + 0xc71d: "OriginalRawFileDigest", + 0xc71e: "SubTileBlockSize", + 0xc71f: "RowInterleaveFactor", + 0xc725: "ProfileLookTableDims", + 0xc726: "ProfileLookTableData", + 0xc740: "OpcodeList1", + 0xc741: "OpcodeList2", + 0xc74e: "OpcodeList3", + 0xc761: "NoiseProfile" +} + +## +# Maps EXIF GPS tags to tag names. + +GPSTAGS = { + 0: "GPSVersionID", + 1: "GPSLatitudeRef", + 2: "GPSLatitude", + 3: "GPSLongitudeRef", + 4: "GPSLongitude", + 5: "GPSAltitudeRef", + 6: "GPSAltitude", + 7: "GPSTimeStamp", + 8: "GPSSatellites", + 9: "GPSStatus", + 10: "GPSMeasureMode", + 11: "GPSDOP", + 12: "GPSSpeedRef", + 13: "GPSSpeed", + 14: "GPSTrackRef", + 15: "GPSTrack", + 16: "GPSImgDirectionRef", + 17: "GPSImgDirection", + 18: "GPSMapDatum", + 19: "GPSDestLatitudeRef", + 20: "GPSDestLatitude", + 21: "GPSDestLongitudeRef", + 22: "GPSDestLongitude", + 23: "GPSDestBearingRef", + 24: "GPSDestBearing", + 25: "GPSDestDistanceRef", + 26: "GPSDestDistance", + 27: "GPSProcessingMethod", + 28: "GPSAreaInformation", + 29: "GPSDateStamp", + 30: "GPSDifferential", + 31: "GPSHPositioningError", +} diff --git a/imagecrunch/PIL/FitsStubImagePlugin.py b/imagecrunch/PIL/FitsStubImagePlugin.py new file mode 100644 index 0000000..be926ca --- /dev/null +++ b/imagecrunch/PIL/FitsStubImagePlugin.py @@ -0,0 +1,75 @@ +# +# The Python Imaging Library +# $Id$ +# +# FITS stub adapter +# +# Copyright (c) 1998-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific FITS image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix): + return prefix[:6] == b"SIMPLE" + + +class FITSStubImageFile(ImageFile.StubImageFile): + + format = "FITS" + format_description = "FITS" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(6)): + raise SyntaxError("Not a FITS file") + + # FIXME: add more sanity checks here; mandatory header items + # include SIMPLE, BITPIX, NAXIS, etc. + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self.size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise IOError("FITS save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(FITSStubImageFile.format, FITSStubImageFile, _accept) +Image.register_save(FITSStubImageFile.format, _save) + +Image.register_extensions(FITSStubImageFile.format, [".fit", ".fits"]) diff --git a/imagecrunch/PIL/FliImagePlugin.py b/imagecrunch/PIL/FliImagePlugin.py new file mode 100644 index 0000000..2c190b6 --- /dev/null +++ b/imagecrunch/PIL/FliImagePlugin.py @@ -0,0 +1,163 @@ +# +# The Python Imaging Library. +# $Id$ +# +# FLI/FLC file handling. +# +# History: +# 95-09-01 fl Created +# 97-01-03 fl Fixed parser, setup decoder tile +# 98-07-15 fl Renamed offset attribute to avoid name clash +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, i32le as i32, o8 + +__version__ = "0.2" + + +# +# decoder + +def _accept(prefix): + return len(prefix) >= 6 and i16(prefix[4:6]) in [0xAF11, 0xAF12] + + +## +# Image plugin for the FLI/FLC animation format. Use the seek +# method to load individual frames. + +class FliImageFile(ImageFile.ImageFile): + + format = "FLI" + format_description = "Autodesk FLI/FLC Animation" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # HEAD + s = self.fp.read(128) + magic = i16(s[4:6]) + if not (magic in [0xAF11, 0xAF12] and + i16(s[14:16]) in [0, 3] and # flags + s[20:22] == b"\x00\x00"): # reserved + raise SyntaxError("not an FLI/FLC file") + + # frames + self.__framecount = i16(s[6:8]) + + # image characteristics + self.mode = "P" + self.size = i16(s[8:10]), i16(s[10:12]) + + # animation speed + duration = i32(s[16:20]) + if magic == 0xAF11: + duration = (duration * 1000) // 70 + self.info["duration"] = duration + + # look for palette + palette = [(a, a, a) for a in range(256)] + + s = self.fp.read(16) + + self.__offset = 128 + + if i16(s[4:6]) == 0xF100: + # prefix chunk; ignore it + self.__offset = self.__offset + i32(s) + s = self.fp.read(16) + + if i16(s[4:6]) == 0xF1FA: + # look for palette chunk + s = self.fp.read(6) + if i16(s[4:6]) == 11: + self._palette(palette, 2) + elif i16(s[4:6]) == 4: + self._palette(palette, 0) + + palette = [o8(r)+o8(g)+o8(b) for (r, g, b) in palette] + self.palette = ImagePalette.raw("RGB", b"".join(palette)) + + # set things up to decode first frame + self.__frame = -1 + self.__fp = self.fp + self.__rewind = self.fp.tell() + self.seek(0) + + def _palette(self, palette, shift): + # load palette + + i = 0 + for e in range(i16(self.fp.read(2))): + s = self.fp.read(2) + i = i + i8(s[0]) + n = i8(s[1]) + if n == 0: + n = 256 + s = self.fp.read(n * 3) + for n in range(0, len(s), 3): + r = i8(s[n]) << shift + g = i8(s[n+1]) << shift + b = i8(s[n+2]) << shift + palette[i] = (r, g, b) + i += 1 + + @property + def n_frames(self): + return self.__framecount + + @property + def is_animated(self): + return self.__framecount > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0) + + for f in range(self.__frame + 1, frame + 1): + self._seek(f) + + def _seek(self, frame): + if frame == 0: + self.__frame = -1 + self.__fp.seek(self.__rewind) + self.__offset = 128 + + if frame != self.__frame + 1: + raise ValueError("cannot seek to frame %d" % frame) + self.__frame = frame + + # move to next frame + self.fp = self.__fp + self.fp.seek(self.__offset) + + s = self.fp.read(4) + if not s: + raise EOFError + + framesize = i32(s) + + self.decodermaxblock = framesize + self.tile = [("fli", (0, 0)+self.size, self.__offset, None)] + + self.__offset += framesize + + def tell(self): + return self.__frame + + +# +# registry + +Image.register_open(FliImageFile.format, FliImageFile, _accept) + +Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/imagecrunch/PIL/FontFile.py b/imagecrunch/PIL/FontFile.py new file mode 100644 index 0000000..46e49bc --- /dev/null +++ b/imagecrunch/PIL/FontFile.py @@ -0,0 +1,114 @@ +# +# The Python Imaging Library +# $Id$ +# +# base class for raster font file parsers +# +# history: +# 1997-06-05 fl created +# 1997-08-19 fl restrict image width +# +# Copyright (c) 1997-1998 by Secret Labs AB +# Copyright (c) 1997-1998 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +import os +from . import Image, _binary + +WIDTH = 800 + + +def puti16(fp, values): + # write network order (big-endian) 16-bit sequence + for v in values: + if v < 0: + v += 65536 + fp.write(_binary.o16be(v)) + + +## +# Base class for raster font file handlers. + +class FontFile(object): + + bitmap = None + + def __init__(self): + + self.info = {} + self.glyph = [None] * 256 + + def __getitem__(self, ix): + return self.glyph[ix] + + def compile(self): + "Create metrics and bitmap" + + if self.bitmap: + return + + # create bitmap large enough to hold all data + h = w = maxwidth = 0 + lines = 1 + for glyph in self: + if glyph: + d, dst, src, im = glyph + h = max(h, src[3] - src[1]) + w = w + (src[2] - src[0]) + if w > WIDTH: + lines += 1 + w = (src[2] - src[0]) + maxwidth = max(maxwidth, w) + + xsize = maxwidth + ysize = lines * h + + if xsize == 0 and ysize == 0: + return "" + + self.ysize = h + + # paste glyphs into bitmap + self.bitmap = Image.new("1", (xsize, ysize)) + self.metrics = [None] * 256 + x = y = 0 + for i in range(256): + glyph = self[i] + if glyph: + d, dst, src, im = glyph + xx = src[2] - src[0] + # yy = src[3] - src[1] + x0, y0 = x, y + x = x + xx + if x > WIDTH: + x, y = 0, y + h + x0, y0 = x, y + x = xx + s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 + self.bitmap.paste(im.crop(src), s) + # print(chr(i), dst, s) + self.metrics[i] = d, dst, s + + def save(self, filename): + "Save font" + + self.compile() + + # font data + self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") + + # font metrics + with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: + fp.write(b"PILfont\n") + fp.write((";;;;;;%d;\n" % self.ysize).encode('ascii')) # HACK!!! + fp.write(b"DATA\n") + for id in range(256): + m = self.metrics[id] + if not m: + puti16(fp, [0] * 10) + else: + puti16(fp, m[0] + m[1] + m[2]) diff --git a/imagecrunch/PIL/FpxImagePlugin.py b/imagecrunch/PIL/FpxImagePlugin.py new file mode 100644 index 0000000..d7bba42 --- /dev/null +++ b/imagecrunch/PIL/FpxImagePlugin.py @@ -0,0 +1,229 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library. +# $Id$ +# +# FlashPix support for PIL +# +# History: +# 97-01-25 fl Created (reads uncompressed RGB images only) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +from . import Image, ImageFile +from ._binary import i32le as i32, i8 + +import olefile + +__version__ = "0.1" + +# we map from colour field tuples to (mode, rawmode) descriptors +MODES = { + # opacity + (0x00007ffe): ("A", "L"), + # monochrome + (0x00010000,): ("L", "L"), + (0x00018000, 0x00017ffe): ("RGBA", "LA"), + # photo YCC + (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), + (0x00028000, 0x00028001, 0x00028002, 0x00027ffe): ("RGBA", "YCCA;P"), + # standard RGB (NIFRGB) + (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), + (0x00038000, 0x00038001, 0x00038002, 0x00037ffe): ("RGBA", "RGBA"), +} + + +# +# -------------------------------------------------------------------- + +def _accept(prefix): + return prefix[:8] == olefile.MAGIC + + +## +# Image plugin for the FlashPix images. + +class FpxImageFile(ImageFile.ImageFile): + + format = "FPX" + format_description = "FlashPix" + + def _open(self): + # + # read the OLE directory and see if this is a likely + # to be a FlashPix file + + try: + self.ole = olefile.OleFileIO(self.fp) + except IOError: + raise SyntaxError("not an FPX file; invalid OLE file") + + if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": + raise SyntaxError("not an FPX file; bad root CLSID") + + self._open_index(1) + + def _open_index(self, index=1): + # + # get the Image Contents Property Set + + prop = self.ole.getproperties([ + "Data Object Store %06d" % index, + "\005Image Contents" + ]) + + # size (highest resolution) + + self.size = prop[0x1000002], prop[0x1000003] + + size = max(self.size) + i = 1 + while size > 64: + size = size / 2 + i += 1 + self.maxid = i - 1 + + # mode. instead of using a single field for this, flashpix + # requires you to specify the mode for each channel in each + # resolution subimage, and leaves it to the decoder to make + # sure that they all match. for now, we'll cheat and assume + # that this is always the case. + + id = self.maxid << 16 + + s = prop[0x2000002 | id] + + colors = [] + for i in range(i32(s, 4)): + # note: for now, we ignore the "uncalibrated" flag + colors.append(i32(s, 8+i*4) & 0x7fffffff) + + self.mode, self.rawmode = MODES[tuple(colors)] + + # load JPEG tables, if any + self.jpeg = {} + for i in range(256): + id = 0x3000001 | (i << 16) + if id in prop: + self.jpeg[i] = prop[id] + + # print(len(self.jpeg), "tables loaded") + + self._open_subimage(1, self.maxid) + + def _open_subimage(self, index=1, subimage=0): + # + # setup tile descriptors for a given subimage + + stream = [ + "Data Object Store %06d" % index, + "Resolution %04d" % subimage, + "Subimage 0000 Header" + ] + + fp = self.ole.openstream(stream) + + # skip prefix + fp.read(28) + + # header stream + s = fp.read(36) + + size = i32(s, 4), i32(s, 8) + # tilecount = i32(s, 12) + tilesize = i32(s, 16), i32(s, 20) + # channels = i32(s, 24) + offset = i32(s, 28) + length = i32(s, 32) + + # print(size, self.mode, self.rawmode) + + if size != self.size: + raise IOError("subimage mismatch") + + # get tile descriptors + fp.seek(28 + offset) + s = fp.read(i32(s, 12) * length) + + x = y = 0 + xsize, ysize = size + xtile, ytile = tilesize + self.tile = [] + + for i in range(0, len(s), length): + + compression = i32(s, i+8) + + if compression == 0: + self.tile.append(("raw", (x, y, x+xtile, y+ytile), + i32(s, i) + 28, (self.rawmode))) + + elif compression == 1: + + # FIXME: the fill decoder is not implemented + self.tile.append(("fill", (x, y, x+xtile, y+ytile), + i32(s, i) + 28, (self.rawmode, s[12:16]))) + + elif compression == 2: + + internal_color_conversion = i8(s[14]) + jpeg_tables = i8(s[15]) + rawmode = self.rawmode + + if internal_color_conversion: + # The image is stored as usual (usually YCbCr). + if rawmode == "RGBA": + # For "RGBA", data is stored as YCbCrA based on + # negative RGB. The following trick works around + # this problem : + jpegmode, rawmode = "YCbCrK", "CMYK" + else: + jpegmode = None # let the decoder decide + + else: + # The image is stored as defined by rawmode + jpegmode = rawmode + + self.tile.append(("jpeg", (x, y, x+xtile, y+ytile), + i32(s, i) + 28, (rawmode, jpegmode))) + + # FIXME: jpeg tables are tile dependent; the prefix + # data must be placed in the tile descriptor itself! + + if jpeg_tables: + self.tile_prefix = self.jpeg[jpeg_tables] + + else: + raise IOError("unknown/invalid compression") + + x = x + xtile + if x >= xsize: + x, y = 0, y + ytile + if y >= ysize: + break # isn't really required + + self.stream = stream + self.fp = None + + def load(self): + + if not self.fp: + self.fp = self.ole.openstream(self.stream[:2] + + ["Subimage 0000 Data"]) + + return ImageFile.ImageFile.load(self) + +# +# -------------------------------------------------------------------- + + +Image.register_open(FpxImageFile.format, FpxImageFile, _accept) + +Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/imagecrunch/PIL/FtexImagePlugin.py b/imagecrunch/PIL/FtexImagePlugin.py new file mode 100644 index 0000000..9b98090 --- /dev/null +++ b/imagecrunch/PIL/FtexImagePlugin.py @@ -0,0 +1,94 @@ +""" +A Pillow loader for .ftc and .ftu files (FTEX) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 + +The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a +packed custom format called FTEX. This file format uses file extensions FTC and FTU. +* FTC files are compressed textures (using standard texture compression). +* FTU files are not compressed. +Texture File Format +The FTC and FTU texture files both use the same format. This +has the following structure: +{header} +{format_directory} +{data} +Where: +{header} = { u32:magic, u32:version, u32:width, u32:height, u32:mipmap_count, u32:format_count } + +* The "magic" number is "FTEX". +* "width" and "height" are the dimensions of the texture. +* "mipmap_count" is the number of mipmaps in the texture. +* "format_count" is the number of texture formats (different versions of the same texture) in this file. + +{format_directory} = format_count * { u32:format, u32:where } + +The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB uncompressed textures. +The texture data for a format starts at the position "where" in the file. + +Each set of texture data in the file has the following structure: +{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } +* "mipmap_size" is the number of bytes in that mip level. For compressed textures this is the +size of the texture data compressed with DXT1. For 24 bit uncompressed textures, this is 3 * width * height. +Following this are the image bytes for that mipmap level. + +Note: All data is stored in little-Endian (Intel) byte order. +""" + +import struct +from io import BytesIO +from . import Image, ImageFile + + +MAGIC = b"FTEX" +FORMAT_DXT1 = 0 +FORMAT_UNCOMPRESSED = 1 + + +class FtexImageFile(ImageFile.ImageFile): + format = "FTEX" + format_description = "Texture File Format (IW2:EOC)" + + def _open(self): + magic = struct.unpack("= 8 and i32(prefix[:4]) >= 20 and i32(prefix[4:8]) in (1, 2) + + +## +# Image plugin for the GIMP brush format. + +class GbrImageFile(ImageFile.ImageFile): + + format = "GBR" + format_description = "GIMP brush file" + + def _open(self): + header_size = i32(self.fp.read(4)) + version = i32(self.fp.read(4)) + if header_size < 20: + raise SyntaxError("not a GIMP brush") + if version not in (1, 2): + raise SyntaxError("Unsupported GIMP brush version: %s" % version) + + width = i32(self.fp.read(4)) + height = i32(self.fp.read(4)) + color_depth = i32(self.fp.read(4)) + if width <= 0 or height <= 0: + raise SyntaxError("not a GIMP brush") + if color_depth not in (1, 4): + raise SyntaxError("Unsupported GIMP brush color depth: %s" % color_depth) + + if version == 1: + comment_length = header_size-20 + else: + comment_length = header_size-28 + magic_number = self.fp.read(4) + if magic_number != b'GIMP': + raise SyntaxError("not a GIMP brush, bad magic number") + self.info['spacing'] = i32(self.fp.read(4)) + + comment = self.fp.read(comment_length)[:-1] + + if color_depth == 1: + self.mode = "L" + else: + self.mode = 'RGBA' + + self.size = width, height + + self.info["comment"] = comment + + # Image might not be small + Image._decompression_bomb_check(self.size) + + # Data is an uncompressed block of w * h * bytes/pixel + self._data_size = width * height * color_depth + + def load(self): + self.im = Image.core.new(self.mode, self.size) + self.frombytes(self.fp.read(self._data_size)) + +# +# registry + + +Image.register_open(GbrImageFile.format, GbrImageFile, _accept) +Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/imagecrunch/PIL/GdImageFile.py b/imagecrunch/PIL/GdImageFile.py new file mode 100644 index 0000000..2ca1e82 --- /dev/null +++ b/imagecrunch/PIL/GdImageFile.py @@ -0,0 +1,83 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GD file handling +# +# History: +# 1996-04-12 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +# NOTE: This format cannot be automatically recognized, so the +# class is not registered for use with Image.open(). To open a +# gd file, use the GdImageFile.open() function instead. + +# THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This +# implementation is provided for convenience and demonstrational +# purposes only. + + +from . import ImageFile, ImagePalette +from ._binary import i8, i16be as i16, i32be as i32 + +__version__ = "0.1" + + +## +# Image plugin for the GD uncompressed format. Note that this format +# is not supported by the standard Image.open function. To use +# this plugin, you have to import the GdImageFile module and +# use the GdImageFile.open function. + +class GdImageFile(ImageFile.ImageFile): + + format = "GD" + format_description = "GD uncompressed images" + + def _open(self): + + # Header + s = self.fp.read(1037) + + if not i16(s[:2]) in [65534, 65535]: + raise SyntaxError("Not a valid GD 2.x .gd file") + + self.mode = "L" # FIXME: "P" + self.size = i16(s[2:4]), i16(s[4:6]) + + trueColor = i8(s[6]) + trueColorOffset = 2 if trueColor else 0 + + # transparency index + tindex = i32(s[7+trueColorOffset:7+trueColorOffset+4]) + if tindex < 256: + self.info["transparency"] = tindex + + self.palette = ImagePalette.raw("XBGR", s[7+trueColorOffset+4:7+trueColorOffset+4+256*4]) + + self.tile = [("raw", (0, 0)+self.size, 7+trueColorOffset+4+256*4, ("L", 0, 1))] + + +def open(fp, mode="r"): + """ + Load texture from a GD image file. + + :param filename: GD file name, or an opened file handle. + :param mode: Optional mode. In this version, if the mode argument + is given, it must be "r". + :returns: An image instance. + :raises IOError: If the image could not be read. + """ + if mode != "r": + raise ValueError("bad mode") + + try: + return GdImageFile(fp) + except SyntaxError: + raise IOError("cannot identify this image file") diff --git a/imagecrunch/PIL/GifImagePlugin.py b/imagecrunch/PIL/GifImagePlugin.py new file mode 100644 index 0000000..1bfbb5f --- /dev/null +++ b/imagecrunch/PIL/GifImagePlugin.py @@ -0,0 +1,814 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GIF file handling +# +# History: +# 1995-09-01 fl Created +# 1996-12-14 fl Added interlace support +# 1996-12-30 fl Added animation support +# 1997-01-05 fl Added write support, fixed local colour map bug +# 1997-02-23 fl Make sure to load raster data in getdata() +# 1997-07-05 fl Support external decoder (0.4) +# 1998-07-09 fl Handle all modes when saving (0.5) +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) +# 2001-04-17 fl Added palette optimization (0.7) +# 2002-06-06 fl Added transparency support for save (0.8) +# 2004-02-24 fl Disable interlacing for small images +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile, ImagePalette, ImageChops, ImageSequence +from ._binary import i8, i16le as i16, o8, o16le as o16 + +import itertools + +__version__ = "0.9" + + +# -------------------------------------------------------------------- +# Identify/read GIF files + +def _accept(prefix): + return prefix[:6] in [b"GIF87a", b"GIF89a"] + + +## +# Image plugin for GIF images. This plugin supports both GIF87 and +# GIF89 images. + +class GifImageFile(ImageFile.ImageFile): + + format = "GIF" + format_description = "Compuserve GIF" + _close_exclusive_fp_after_loading = False + + global_palette = None + + def data(self): + s = self.fp.read(1) + if s and i8(s): + return self.fp.read(i8(s)) + return None + + def _open(self): + + # Screen + s = self.fp.read(13) + if s[:6] not in [b"GIF87a", b"GIF89a"]: + raise SyntaxError("not a GIF file") + + self.info["version"] = s[:6] + self.size = i16(s[6:]), i16(s[8:]) + self.tile = [] + flags = i8(s[10]) + bits = (flags & 7) + 1 + + if flags & 128: + # get global palette + self.info["background"] = i8(s[11]) + # check if palette contains colour indices + p = self.fp.read(3 << bits) + for i in range(0, len(p), 3): + if not (i//3 == i8(p[i]) == i8(p[i+1]) == i8(p[i+2])): + p = ImagePalette.raw("RGB", p) + self.global_palette = self.palette = p + break + + self.__fp = self.fp # FIXME: hack + self.__rewind = self.fp.tell() + self._n_frames = None + self._is_animated = None + self._seek(0) # get ready to read first frame + + @property + def n_frames(self): + if self._n_frames is None: + current = self.tell() + try: + while True: + self.seek(self.tell() + 1) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames + + @property + def is_animated(self): + if self._is_animated is None: + if self._n_frames is not None: + self._is_animated = self._n_frames != 1 + else: + current = self.tell() + + try: + self.seek(1) + self._is_animated = True + except EOFError: + self._is_animated = False + + self.seek(current) + return self._is_animated + + def seek(self, frame): + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0) + + last_frame = self.__frame + for f in range(self.__frame + 1, frame + 1): + try: + self._seek(f) + except EOFError: + self.seek(last_frame) + raise EOFError("no more images in GIF file") + + def _seek(self, frame): + + if frame == 0: + # rewind + self.__offset = 0 + self.dispose = None + self.dispose_extent = [0, 0, 0, 0] # x0, y0, x1, y1 + self.__frame = -1 + self.__fp.seek(self.__rewind) + self._prev_im = None + self.disposal_method = 0 + else: + # ensure that the previous frame was loaded + if not self.im: + self.load() + + if frame != self.__frame + 1: + raise ValueError("cannot seek to frame %d" % frame) + self.__frame = frame + + self.tile = [] + + self.fp = self.__fp + if self.__offset: + # backup to last frame + self.fp.seek(self.__offset) + while self.data(): + pass + self.__offset = 0 + + if self.dispose: + self.im.paste(self.dispose, self.dispose_extent) + + from copy import copy + self.palette = copy(self.global_palette) + + while True: + + s = self.fp.read(1) + if not s or s == b";": + break + + elif s == b"!": + # + # extensions + # + s = self.fp.read(1) + block = self.data() + if i8(s) == 249: + # + # graphic control extension + # + flags = i8(block[0]) + if flags & 1: + self.info["transparency"] = i8(block[3]) + self.info["duration"] = i16(block[1:3]) * 10 + + # disposal method - find the value of bits 4 - 6 + dispose_bits = 0b00011100 & flags + dispose_bits = dispose_bits >> 2 + if dispose_bits: + # only set the dispose if it is not + # unspecified. I'm not sure if this is + # correct, but it seems to prevent the last + # frame from looking odd for some animations + self.disposal_method = dispose_bits + elif i8(s) == 254: + # + # comment extension + # + self.info["comment"] = block + elif i8(s) == 255: + # + # application extension + # + self.info["extension"] = block, self.fp.tell() + if block[:11] == b"NETSCAPE2.0": + block = self.data() + if len(block) >= 3 and i8(block[0]) == 1: + self.info["loop"] = i16(block[1:3]) + while self.data(): + pass + + elif s == b",": + # + # local image + # + s = self.fp.read(9) + + # extent + x0, y0 = i16(s[0:]), i16(s[2:]) + x1, y1 = x0 + i16(s[4:]), y0 + i16(s[6:]) + self.dispose_extent = x0, y0, x1, y1 + flags = i8(s[8]) + + interlace = (flags & 64) != 0 + + if flags & 128: + bits = (flags & 7) + 1 + self.palette =\ + ImagePalette.raw("RGB", self.fp.read(3 << bits)) + + # image data + bits = i8(self.fp.read(1)) + self.__offset = self.fp.tell() + self.tile = [("gif", + (x0, y0, x1, y1), + self.__offset, + (bits, interlace))] + break + + else: + pass + # raise IOError, "illegal GIF tag `%x`" % i8(s) + + try: + if self.disposal_method < 2: + # do not dispose or none specified + self.dispose = None + elif self.disposal_method == 2: + # replace with background colour + self.dispose = Image.core.fill("P", self.size, + self.info["background"]) + else: + # replace with previous contents + if self.im: + self.dispose = self.im.copy() + + # only dispose the extent in this frame + if self.dispose: + self.dispose = self._crop(self.dispose, self.dispose_extent) + except (AttributeError, KeyError): + pass + + if not self.tile: + # self.__fp = None + raise EOFError + + self.mode = "L" + if self.palette: + self.mode = "P" + + def tell(self): + return self.__frame + + def load_end(self): + ImageFile.ImageFile.load_end(self) + + # if the disposal method is 'do not dispose', transparent + # pixels should show the content of the previous frame + if self._prev_im and self.disposal_method == 1: + # we do this by pasting the updated area onto the previous + # frame which we then use as the current image content + updated = self._crop(self.im, self.dispose_extent) + self._prev_im.paste(updated, self.dispose_extent, + updated.convert('RGBA')) + self.im = self._prev_im + self._prev_im = self.im.copy() + +# -------------------------------------------------------------------- +# Write GIF files + + +RAWMODE = { + "1": "L", + "L": "L", + "P": "P" +} + + +def _normalize_mode(im, initial_call=False): + """ + Takes an image (or frame), returns an image in a mode that is appropriate + for saving in a Gif. + + It may return the original image, or it may return an image converted to + palette or 'L' mode. + + UNDONE: What is the point of mucking with the initial call palette, for + an image that shouldn't have a palette, or it would be a mode 'P' and + get returned in the RAWMODE clause. + + :param im: Image object + :param initial_call: Default false, set to true for a single frame. + :returns: Image object + """ + if im.mode in RAWMODE: + im.load() + return im + if Image.getmodebase(im.mode) == "RGB": + if initial_call: + palette_size = 256 + if im.palette: + palette_size = len(im.palette.getdata()[1]) // 3 + return im.convert("P", palette=Image.ADAPTIVE, colors=palette_size) + else: + return im.convert("P") + return im.convert("L") + + +def _normalize_palette(im, palette, info): + """ + Normalizes the palette for image. + - Sets the palette to the incoming palette, if provided. + - Ensures that there's a palette for L mode images + - Optimizes the palette if necessary/desired. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: Image object + """ + source_palette = None + if palette: + # a bytes palette + if isinstance(palette, (bytes, bytearray, list)): + source_palette = bytearray(palette[:768]) + if isinstance(palette, ImagePalette.ImagePalette): + source_palette = bytearray(itertools.chain.from_iterable( + zip(palette.palette[:256], + palette.palette[256:512], + palette.palette[512:768]))) + + if im.mode == "P": + if not source_palette: + source_palette = im.im.getpalette("RGB")[:768] + else: # L-mode + if not source_palette: + source_palette = bytearray(i//3 for i in range(768)) + im.palette = ImagePalette.ImagePalette("RGB", + palette=source_palette) + + used_palette_colors = _get_optimize(im, info) + if used_palette_colors is not None: + return im.remap_palette(used_palette_colors, source_palette) + + im.palette.palette = source_palette + return im + + +def _write_single_frame(im, fp, palette): + im_out = _normalize_mode(im, True) + im_out = _normalize_palette(im_out, palette, im.encoderinfo) + + for s in _get_global_header(im_out, im.encoderinfo): + fp.write(s) + + # local image header + flags = 0 + if get_interlace(im): + flags = flags | 64 + _write_local_header(fp, im, (0, 0), flags) + + im_out.encoderconfig = (8, get_interlace(im)) + ImageFile._save(im_out, fp, [("gif", (0, 0)+im.size, 0, + RAWMODE[im_out.mode])]) + + fp.write(b"\0") # end of image data + + +def _write_multiple_frames(im, fp, palette): + + duration = im.encoderinfo.get("duration", None) + disposal = im.encoderinfo.get('disposal', None) + + im_frames = [] + frame_count = 0 + for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): + for im_frame in ImageSequence.Iterator(imSequence): + # a copy is required here since seek can still mutate the image + im_frame = _normalize_mode(im_frame.copy()) + im_frame = _normalize_palette(im_frame, palette, im.encoderinfo) + + encoderinfo = im.encoderinfo.copy() + if isinstance(duration, (list, tuple)): + encoderinfo['duration'] = duration[frame_count] + if isinstance(disposal, (list, tuple)): + encoderinfo["disposal"] = disposal[frame_count] + frame_count += 1 + + if im_frames: + # delta frame + previous = im_frames[-1] + if _get_palette_bytes(im_frame) == _get_palette_bytes(previous['im']): + delta = ImageChops.subtract_modulo(im_frame, + previous['im']) + else: + delta = ImageChops.subtract_modulo(im_frame.convert('RGB'), + previous['im'].convert('RGB')) + bbox = delta.getbbox() + if not bbox: + # This frame is identical to the previous frame + if duration: + previous['encoderinfo']['duration'] += encoderinfo['duration'] + continue + else: + bbox = None + im_frames.append({ + 'im': im_frame, + 'bbox': bbox, + 'encoderinfo': encoderinfo + }) + + if len(im_frames) > 1: + for frame_data in im_frames: + im_frame = frame_data['im'] + if not frame_data['bbox']: + # global header + for s in _get_global_header(im_frame, + frame_data['encoderinfo']): + fp.write(s) + offset = (0, 0) + else: + # compress difference + frame_data['encoderinfo']['include_color_table'] = True + + im_frame = im_frame.crop(frame_data['bbox']) + offset = frame_data['bbox'][:2] + _write_frame_data(fp, im_frame, offset, frame_data['encoderinfo']) + return True + + +def _save_all(im, fp, filename): + _save(im, fp, filename, save_all=True) + + +def _save(im, fp, filename, save_all=False): + for k, v in im.info.items(): + im.encoderinfo.setdefault(k, v) + # header + try: + palette = im.encoderinfo["palette"] + except KeyError: + palette = None + im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True) + + if not save_all or not _write_multiple_frames(im, fp, palette): + _write_single_frame(im, fp, palette) + + fp.write(b";") # end of file + + if hasattr(fp, "flush"): + fp.flush() + + +def get_interlace(im): + interlace = im.encoderinfo.get("interlace", 1) + + # workaround for @PIL153 + if min(im.size) < 16: + interlace = 0 + + return interlace + + +def _write_local_header(fp, im, offset, flags): + transparent_color_exists = False + try: + transparency = im.encoderinfo["transparency"] + except KeyError: + pass + else: + transparency = int(transparency) + # optimize the block away if transparent color is not used + transparent_color_exists = True + + used_palette_colors = _get_optimize(im, im.encoderinfo) + if used_palette_colors is not None: + # adjust the transparency index after optimize + try: + transparency = used_palette_colors.index(transparency) + except ValueError: + transparent_color_exists = False + + if "duration" in im.encoderinfo: + duration = int(im.encoderinfo["duration"] / 10) + else: + duration = 0 + + disposal = int(im.encoderinfo.get('disposal', 0)) + + if transparent_color_exists or duration != 0 or disposal: + packed_flag = 1 if transparent_color_exists else 0 + packed_flag |= disposal << 2 + if not transparent_color_exists: + transparency = 0 + + fp.write(b"!" + + o8(249) + # extension intro + o8(4) + # length + o8(packed_flag) + # packed fields + o16(duration) + # duration + o8(transparency) + # transparency index + o8(0)) + + if "comment" in im.encoderinfo and 1 <= len(im.encoderinfo["comment"]) <= 255: + fp.write(b"!" + + o8(254) + # extension intro + o8(len(im.encoderinfo["comment"])) + + im.encoderinfo["comment"] + + o8(0)) + if "loop" in im.encoderinfo: + number_of_loops = im.encoderinfo["loop"] + fp.write(b"!" + + o8(255) + # extension intro + o8(11) + + b"NETSCAPE2.0" + + o8(3) + + o8(1) + + o16(number_of_loops) + # number of loops + o8(0)) + include_color_table = im.encoderinfo.get('include_color_table') + if include_color_table: + palette = im.encoderinfo.get("palette", None) + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + if color_table_size: + flags = flags | 128 # local color table flag + flags = flags | color_table_size + + fp.write(b"," + + o16(offset[0]) + # offset + o16(offset[1]) + + o16(im.size[0]) + # size + o16(im.size[1]) + + o8(flags)) # flags + if include_color_table and color_table_size: + fp.write(_get_header_palette(palette_bytes)) + fp.write(o8(8)) # bits + + +def _save_netpbm(im, fp, filename): + + # Unused by default. + # To use, uncomment the register_save call at the end of the file. + # + # If you need real GIF compression and/or RGB quantization, you + # can use the external NETPBM/PBMPLUS utilities. See comments + # below for information on how to enable this. + + import os + from subprocess import Popen, check_call, PIPE, CalledProcessError + file = im._dump() + + with open(filename, 'wb') as f: + if im.mode != "RGB": + with open(os.devnull, 'wb') as devnull: + check_call(["ppmtogif", file], stdout=f, stderr=devnull) + else: + # Pipe ppmquant output into ppmtogif + # "ppmquant 256 %s | ppmtogif > %s" % (file, filename) + quant_cmd = ["ppmquant", "256", file] + togif_cmd = ["ppmtogif"] + with open(os.devnull, 'wb') as devnull: + quant_proc = Popen(quant_cmd, stdout=PIPE, stderr=devnull) + togif_proc = Popen(togif_cmd, stdin=quant_proc.stdout, + stdout=f, stderr=devnull) + + # Allow ppmquant to receive SIGPIPE if ppmtogif exits + quant_proc.stdout.close() + + retcode = quant_proc.wait() + if retcode: + raise CalledProcessError(retcode, quant_cmd) + + retcode = togif_proc.wait() + if retcode: + raise CalledProcessError(retcode, togif_cmd) + + try: + os.unlink(file) + except OSError: + pass + + +# Force optimization so that we can test performance against +# cases where it took lots of memory and time previously. +_FORCE_OPTIMIZE = False + + +def _get_optimize(im, info): + """ + Palette optimization is a potentially expensive operation. + + This function determines if the palette should be optimized using + some heuristics, then returns the list of palette entries in use. + + :param im: Image object + :param info: encoderinfo + :returns: list of indexes of palette entries in use, or None + """ + if im.mode in ("P", "L") and info and info.get("optimize", 0): + # Potentially expensive operation. + + # The palette saves 3 bytes per color not used, but palette + # lengths are restricted to 3*(2**N) bytes. Max saving would + # be 768 -> 6 bytes if we went all the way down to 2 colors. + # * If we're over 128 colors, we can't save any space. + # * If there aren't any holes, it's not worth collapsing. + # * If we have a 'large' image, the palette is in the noise. + + # create the new palette if not every color is used + optimise = _FORCE_OPTIMIZE or im.mode == 'L' + if optimise or im.width * im.height < 512 * 512: + # check which colors are used + used_palette_colors = [] + for i, count in enumerate(im.histogram()): + if count: + used_palette_colors.append(i) + + if optimise or (len(used_palette_colors) <= 128 and + max(used_palette_colors) > len(used_palette_colors)): + return used_palette_colors + + +def _get_color_table_size(palette_bytes): + # calculate the palette size for the header + import math + color_table_size = int(math.ceil(math.log(len(palette_bytes)//3, 2)))-1 + if color_table_size < 0: + color_table_size = 0 + return color_table_size + + +def _get_header_palette(palette_bytes): + """ + Returns the palette, null padded to the next power of 2 (*3) bytes + suitable for direct inclusion in the GIF header + + :param palette_bytes: Unpadded palette bytes, in RGBRGB form + :returns: Null padded palette + """ + color_table_size = _get_color_table_size(palette_bytes) + + # add the missing amount of bytes + # the palette has to be 2< 0: + palette_bytes += o8(0) * 3 * actual_target_size_diff + return palette_bytes + + +def _get_palette_bytes(im): + """ + Gets the palette for inclusion in the gif header + + :param im: Image object + :returns: Bytes, len<=768 suitable for inclusion in gif header + """ + return im.palette.palette + + +def _get_global_header(im, info): + """Return a list of strings representing a GIF header""" + + # Header Block + # http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp + + version = b"87a" + for extensionKey in ["transparency", "duration", "loop", "comment"]: + if info and extensionKey in info: + if ((extensionKey == "duration" and info[extensionKey] == 0) or + (extensionKey == "comment" and not (1 <= len(info[extensionKey]) <= 255))): + continue + version = b"89a" + break + else: + if im.info.get("version") == b"89a": + version = b"89a" + + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + + background = info["background"] if "background" in info else 0 + + return [ + b"GIF"+version + # signature + version + o16(im.size[0]) + # canvas width + o16(im.size[1]), # canvas height + + # Logical Screen Descriptor + # size of global color table + global color table flag + o8(color_table_size + 128), # packed fields + # background + reserved/aspect + o8(background) + o8(0), + + # Global Color Table + _get_header_palette(palette_bytes) + ] + + +def _write_frame_data(fp, im_frame, offset, params): + try: + im_frame.encoderinfo = params + + # local image header + _write_local_header(fp, im_frame, offset, 0) + + ImageFile._save(im_frame, fp, [("gif", (0, 0)+im_frame.size, 0, + RAWMODE[im_frame.mode])]) + + fp.write(b"\0") # end of image data + finally: + del im_frame.encoderinfo + +# -------------------------------------------------------------------- +# Legacy GIF utilities + + +def getheader(im, palette=None, info=None): + """ + Legacy Method to get Gif data from image. + + Warning:: May modify image data. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: tuple of(list of header items, optimized palette) + + """ + used_palette_colors = _get_optimize(im, info) + + if info is None: + info = {} + + if "background" not in info and "background" in im.info: + info["background"] = im.info["background"] + + im_mod = _normalize_palette(im, palette, info) + im.palette = im_mod.palette + im.im = im_mod.im + header = _get_global_header(im, info) + + return header, used_palette_colors + + +# To specify duration, add the time in milliseconds to getdata(), +# e.g. getdata(im_frame, duration=1000) +def getdata(im, offset=(0, 0), **params): + """ + Legacy Method + + Return a list of strings representing this image. + The first string is a local image header, the rest contains + encoded image data. + + :param im: Image object + :param offset: Tuple of (x, y) pixels. Defaults to (0,0) + :param \\**params: E.g. duration or other encoder info parameters + :returns: List of Bytes containing gif encoded frame data + + """ + class Collector(object): + data = [] + + def write(self, data): + self.data.append(data) + + im.load() # make sure raster data is available + + fp = Collector() + + _write_frame_data(fp, im, offset, params) + + return fp.data + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GifImageFile.format, GifImageFile, _accept) +Image.register_save(GifImageFile.format, _save) +Image.register_save_all(GifImageFile.format, _save_all) +Image.register_extension(GifImageFile.format, ".gif") +Image.register_mime(GifImageFile.format, "image/gif") + +# +# Uncomment the following line if you wish to use NETPBM/PBMPLUS +# instead of the built-in "uncompressed" GIF encoder + +# Image.register_save(GifImageFile.format, _save_netpbm) diff --git a/imagecrunch/PIL/GimpGradientFile.py b/imagecrunch/PIL/GimpGradientFile.py new file mode 100644 index 0000000..10593da --- /dev/null +++ b/imagecrunch/PIL/GimpGradientFile.py @@ -0,0 +1,138 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read (and render) GIMP gradient files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +from math import pi, log, sin, sqrt +from ._binary import o8 + +# -------------------------------------------------------------------- +# Stuff to translate curve segments to palette values (derived from +# the corresponding code in GIMP, written by Federico Mena Quintero. +# See the GIMP distribution for more information.) +# + +EPSILON = 1e-10 + + +def linear(middle, pos): + if pos <= middle: + if middle < EPSILON: + return 0.0 + else: + return 0.5 * pos / middle + else: + pos = pos - middle + middle = 1.0 - middle + if middle < EPSILON: + return 1.0 + else: + return 0.5 + 0.5 * pos / middle + + +def curved(middle, pos): + return pos ** (log(0.5) / log(max(middle, EPSILON))) + + +def sine(middle, pos): + return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 + + +def sphere_increasing(middle, pos): + return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) + + +def sphere_decreasing(middle, pos): + return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) + + +SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] + + +class GradientFile(object): + + gradient = None + + def getpalette(self, entries=256): + + palette = [] + + ix = 0 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + for i in range(entries): + + x = i / float(entries-1) + + while x1 < x: + ix += 1 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + w = x1 - x0 + + if w < EPSILON: + scale = segment(0.5, 0.5) + else: + scale = segment((xm - x0) / w, (x - x0) / w) + + # expand to RGBA + r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) + g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) + b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) + a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) + + # add to palette + palette.append(r + g + b + a) + + return b"".join(palette), "RGBA" + + +## +# File handler for GIMP's gradient format. + +class GimpGradientFile(GradientFile): + + def __init__(self, fp): + + if fp.readline()[:13] != b"GIMP Gradient": + raise SyntaxError("not a GIMP gradient file") + + line = fp.readline() + + # GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files do + if line.startswith(b"Name: "): + line = fp.readline().strip() + + count = int(line) + + gradient = [] + + for i in range(count): + + s = fp.readline().split() + w = [float(x) for x in s[:11]] + + x0, x1 = w[0], w[2] + xm = w[1] + rgb0 = w[3:7] + rgb1 = w[7:11] + + segment = SEGMENTS[int(s[11])] + cspace = int(s[12]) + + if cspace != 0: + raise IOError("cannot handle HSV colour space") + + gradient.append((x0, x1, xm, rgb0, rgb1, segment)) + + self.gradient = gradient diff --git a/imagecrunch/PIL/GimpPaletteFile.py b/imagecrunch/PIL/GimpPaletteFile.py new file mode 100644 index 0000000..6eef6a2 --- /dev/null +++ b/imagecrunch/PIL/GimpPaletteFile.py @@ -0,0 +1,62 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read GIMP palette files +# +# History: +# 1997-08-23 fl Created +# 2004-09-07 fl Support GIMP 2.0 palette files. +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1997-2004. +# +# See the README file for information on usage and redistribution. +# + +import re +from ._binary import o8 + + +## +# File handler for GIMP's palette format. + +class GimpPaletteFile(object): + + rawmode = "RGB" + + def __init__(self, fp): + + self.palette = [o8(i)*3 for i in range(256)] + + if fp.readline()[:12] != b"GIMP Palette": + raise SyntaxError("not a GIMP palette file") + + i = 0 + + while i <= 255: + + s = fp.readline() + + if not s: + break + # skip fields and comment lines + if re.match(br"\w+:|#", s): + continue + if len(s) > 100: + raise SyntaxError("bad palette file") + + v = tuple(map(int, s.split()[:3])) + if len(v) != 3: + raise ValueError("bad palette entry") + + if 0 <= i <= 255: + self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) + + i += 1 + + self.palette = b"".join(self.palette) + + def getpalette(self): + + return self.palette, self.rawmode diff --git a/imagecrunch/PIL/GribStubImagePlugin.py b/imagecrunch/PIL/GribStubImagePlugin.py new file mode 100644 index 0000000..33c8291 --- /dev/null +++ b/imagecrunch/PIL/GribStubImagePlugin.py @@ -0,0 +1,73 @@ +# +# The Python Imaging Library +# $Id$ +# +# GRIB stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile +from ._binary import i8 + +_handler = None + + +def register_handler(handler): + """ + Install application-specific GRIB image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + +def _accept(prefix): + return prefix[0:4] == b"GRIB" and i8(prefix[7]) == 1 + + +class GribStubImageFile(ImageFile.StubImageFile): + + format = "GRIB" + format_description = "GRIB" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(8)): + raise SyntaxError("Not a GRIB file") + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self.size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise IOError("GRIB save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) +Image.register_save(GribStubImageFile.format, _save) + +Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/imagecrunch/PIL/Hdf5StubImagePlugin.py b/imagecrunch/PIL/Hdf5StubImagePlugin.py new file mode 100644 index 0000000..de4d5bb --- /dev/null +++ b/imagecrunch/PIL/Hdf5StubImagePlugin.py @@ -0,0 +1,72 @@ +# +# The Python Imaging Library +# $Id$ +# +# HDF5 stub adapter +# +# Copyright (c) 2000-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler): + """ + Install application-specific HDF5 image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + +def _accept(prefix): + return prefix[:8] == b"\x89HDF\r\n\x1a\n" + + +class HDF5StubImageFile(ImageFile.StubImageFile): + + format = "HDF5" + format_description = "HDF5" + + def _open(self): + + offset = self.fp.tell() + + if not _accept(self.fp.read(8)): + raise SyntaxError("Not an HDF file") + + self.fp.seek(offset) + + # make something up + self.mode = "F" + self.size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr("_handler", "save"): + raise IOError("HDF5 save handler not installed") + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) +Image.register_save(HDF5StubImageFile.format, _save) + +Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/imagecrunch/PIL/IcnsImagePlugin.py b/imagecrunch/PIL/IcnsImagePlugin.py new file mode 100644 index 0000000..dc93f6a --- /dev/null +++ b/imagecrunch/PIL/IcnsImagePlugin.py @@ -0,0 +1,374 @@ +# +# The Python Imaging Library. +# $Id$ +# +# macOS icns file decoder, based on icns.py by Bob Ippolito. +# +# history: +# 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. +# +# Copyright (c) 2004 by Bob Ippolito. +# Copyright (c) 2004 by Secret Labs. +# Copyright (c) 2004 by Fredrik Lundh. +# Copyright (c) 2014 by Alastair Houghton. +# +# See the README file for information on usage and redistribution. +# + +from PIL import Image, ImageFile, PngImagePlugin +from PIL._binary import i8 +import io +import os +import shutil +import struct +import sys +import tempfile + +enable_jpeg2k = hasattr(Image.core, 'jp2klib_version') +if enable_jpeg2k: + from PIL import Jpeg2KImagePlugin + +HEADERSIZE = 8 + + +def nextheader(fobj): + return struct.unpack('>4sI', fobj.read(HEADERSIZE)) + + +def read_32t(fobj, start_length, size): + # The 128x128 icon seems to have an extra header for some reason. + (start, length) = start_length + fobj.seek(start) + sig = fobj.read(4) + if sig != b'\x00\x00\x00\x00': + raise SyntaxError('Unknown signature, expecting 0x00000000') + return read_32(fobj, (start + 4, length - 4), size) + + +def read_32(fobj, start_length, size): + """ + Read a 32bit RGB icon resource. Seems to be either uncompressed or + an RLE packbits-like scheme. + """ + (start, length) = start_length + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + if length == sizesq * 3: + # uncompressed ("RGBRGBGB") + indata = fobj.read(length) + im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) + else: + # decode image + im = Image.new("RGB", pixel_size, None) + for band_ix in range(3): + data = [] + bytesleft = sizesq + while bytesleft > 0: + byte = fobj.read(1) + if not byte: + break + byte = i8(byte) + if byte & 0x80: + blocksize = byte - 125 + byte = fobj.read(1) + for i in range(blocksize): + data.append(byte) + else: + blocksize = byte + 1 + data.append(fobj.read(blocksize)) + bytesleft -= blocksize + if bytesleft <= 0: + break + if bytesleft != 0: + raise SyntaxError( + "Error reading channel [%r left]" % bytesleft + ) + band = Image.frombuffer( + "L", pixel_size, b"".join(data), "raw", "L", 0, 1 + ) + im.im.putband(band.im, band_ix) + return {"RGB": im} + + +def read_mk(fobj, start_length, size): + # Alpha masks seem to be uncompressed + start = start_length[0] + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + band = Image.frombuffer( + "L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1 + ) + return {"A": band} + + +def read_png_or_jpeg2000(fobj, start_length, size): + (start, length) = start_length + fobj.seek(start) + sig = fobj.read(12) + if sig[:8] == b'\x89PNG\x0d\x0a\x1a\x0a': + fobj.seek(start) + im = PngImagePlugin.PngImageFile(fobj) + return {"RGBA": im} + elif sig[:4] == b'\xff\x4f\xff\x51' \ + or sig[:4] == b'\x0d\x0a\x87\x0a' \ + or sig == b'\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a': + if not enable_jpeg2k: + raise ValueError('Unsupported icon subimage format (rebuild PIL ' + 'with JPEG 2000 support to fix this)') + # j2k, jpc or j2c + fobj.seek(start) + jp2kstream = fobj.read(length) + f = io.BytesIO(jp2kstream) + im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) + if im.mode != 'RGBA': + im = im.convert('RGBA') + return {"RGBA": im} + else: + raise ValueError('Unsupported icon subimage format') + + +class IcnsFile(object): + + SIZES = { + (512, 512, 2): [ + (b'ic10', read_png_or_jpeg2000), + ], + (512, 512, 1): [ + (b'ic09', read_png_or_jpeg2000), + ], + (256, 256, 2): [ + (b'ic14', read_png_or_jpeg2000), + ], + (256, 256, 1): [ + (b'ic08', read_png_or_jpeg2000), + ], + (128, 128, 2): [ + (b'ic13', read_png_or_jpeg2000), + ], + (128, 128, 1): [ + (b'ic07', read_png_or_jpeg2000), + (b'it32', read_32t), + (b't8mk', read_mk), + ], + (64, 64, 1): [ + (b'icp6', read_png_or_jpeg2000), + ], + (32, 32, 2): [ + (b'ic12', read_png_or_jpeg2000), + ], + (48, 48, 1): [ + (b'ih32', read_32), + (b'h8mk', read_mk), + ], + (32, 32, 1): [ + (b'icp5', read_png_or_jpeg2000), + (b'il32', read_32), + (b'l8mk', read_mk), + ], + (16, 16, 2): [ + (b'ic11', read_png_or_jpeg2000), + ], + (16, 16, 1): [ + (b'icp4', read_png_or_jpeg2000), + (b'is32', read_32), + (b's8mk', read_mk), + ], + } + + def __init__(self, fobj): + """ + fobj is a file-like object as an icns resource + """ + # signature : (start, length) + self.dct = dct = {} + self.fobj = fobj + sig, filesize = nextheader(fobj) + if sig != b'icns': + raise SyntaxError('not an icns file') + i = HEADERSIZE + while i < filesize: + sig, blocksize = nextheader(fobj) + if blocksize <= 0: + raise SyntaxError('invalid block header') + i += HEADERSIZE + blocksize -= HEADERSIZE + dct[sig] = (i, blocksize) + fobj.seek(blocksize, 1) + i += blocksize + + def itersizes(self): + sizes = [] + for size, fmts in self.SIZES.items(): + for (fmt, reader) in fmts: + if fmt in self.dct: + sizes.append(size) + break + return sizes + + def bestsize(self): + sizes = self.itersizes() + if not sizes: + raise SyntaxError("No 32bit icon resources found") + return max(sizes) + + def dataforsize(self, size): + """ + Get an icon resource as {channel: array}. Note that + the arrays are bottom-up like windows bitmaps and will likely + need to be flipped or transposed in some way. + """ + dct = {} + for code, reader in self.SIZES[size]: + desc = self.dct.get(code) + if desc is not None: + dct.update(reader(self.fobj, desc, size)) + return dct + + def getimage(self, size=None): + if size is None: + size = self.bestsize() + if len(size) == 2: + size = (size[0], size[1], 1) + channels = self.dataforsize(size) + + im = channels.get('RGBA', None) + if im: + return im + + im = channels.get("RGB").copy() + try: + im.putalpha(channels["A"]) + except KeyError: + pass + return im + + +## +# Image plugin for Mac OS icons. + +class IcnsImageFile(ImageFile.ImageFile): + """ + PIL image support for Mac OS .icns files. + Chooses the best resolution, but will possibly load + a different size image if you mutate the size attribute + before calling 'load'. + + The info dictionary has a key 'sizes' that is a list + of sizes that the icns file has. + """ + + format = "ICNS" + format_description = "Mac OS icns resource" + + def _open(self): + self.icns = IcnsFile(self.fp) + self.mode = 'RGBA' + self.best_size = self.icns.bestsize() + self.size = (self.best_size[0] * self.best_size[2], + self.best_size[1] * self.best_size[2]) + self.info['sizes'] = self.icns.itersizes() + # Just use this to see if it's loaded or not yet. + self.tile = ('',) + + def load(self): + if len(self.size) == 3: + self.best_size = self.size + self.size = (self.best_size[0] * self.best_size[2], + self.best_size[1] * self.best_size[2]) + + Image.Image.load(self) + if not self.tile: + return + self.load_prepare() + # This is likely NOT the best way to do it, but whatever. + im = self.icns.getimage(self.best_size) + + # If this is a PNG or JPEG 2000, it won't be loaded yet + im.load() + + self.im = im.im + self.mode = im.mode + self.size = im.size + self.fp = None + self.icns = None + self.tile = () + self.load_end() + + +def _save(im, fp, filename): + """ + Saves the image as a series of PNG files, + that are then converted to a .icns file + using the macOS command line utility 'iconutil'. + + macOS only. + """ + if hasattr(fp, "flush"): + fp.flush() + + # create the temporary set of pngs + iconset = tempfile.mkdtemp('.iconset') + provided_images = {im.width: im + for im in im.encoderinfo.get("append_images", [])} + last_w = None + for w in [16, 32, 128, 256, 512]: + prefix = 'icon_{}x{}'.format(w, w) + + first_path = os.path.join(iconset, prefix+'.png') + if last_w == w: + shutil.copyfile(second_path, first_path) + else: + im_w = provided_images.get(w, im.resize((w, w), Image.LANCZOS)) + im_w.save(first_path) + + second_path = os.path.join(iconset, prefix+'@2x.png') + im_w2 = provided_images.get(w*2, im.resize((w*2, w*2), Image.LANCZOS)) + im_w2.save(second_path) + last_w = w*2 + + # iconutil -c icns -o {} {} + from subprocess import Popen, PIPE, CalledProcessError + + convert_cmd = ["iconutil", "-c", "icns", "-o", filename, iconset] + with open(os.devnull, 'wb') as devnull: + convert_proc = Popen(convert_cmd, stdout=PIPE, stderr=devnull) + + convert_proc.stdout.close() + + retcode = convert_proc.wait() + + # remove the temporary files + shutil.rmtree(iconset) + + if retcode: + raise CalledProcessError(retcode, convert_cmd) + + +Image.register_open(IcnsImageFile.format, IcnsImageFile, + lambda x: x[:4] == b'icns') +Image.register_extension(IcnsImageFile.format, '.icns') + +if sys.platform == 'darwin': + Image.register_save(IcnsImageFile.format, _save) + + Image.register_mime(IcnsImageFile.format, "image/icns") + + +if __name__ == '__main__': + + if len(sys.argv) < 2: + print("Syntax: python IcnsImagePlugin.py [file]") + sys.exit() + + imf = IcnsImageFile(open(sys.argv[1], 'rb')) + for size in imf.info['sizes']: + imf.size = size + imf.load() + im = imf.im + im.save('out-%s-%s-%s.png' % size) + im = Image.open(sys.argv[1]) + im.save("out.png") + if sys.platform == 'windows': + os.startfile("out.png") diff --git a/imagecrunch/PIL/IcoImagePlugin.py b/imagecrunch/PIL/IcoImagePlugin.py new file mode 100644 index 0000000..428fdd4 --- /dev/null +++ b/imagecrunch/PIL/IcoImagePlugin.py @@ -0,0 +1,284 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Icon support for PIL +# +# History: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis +# . +# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki +# +# Icon format references: +# * https://en.wikipedia.org/wiki/ICO_(file_format) +# * https://msdn.microsoft.com/en-us/library/ms997538.aspx + + +import struct +from io import BytesIO + +from . import Image, ImageFile, BmpImagePlugin, PngImagePlugin +from ._binary import i8, i16le as i16, i32le as i32 +from math import log, ceil + +__version__ = "0.1" + +# +# -------------------------------------------------------------------- + +_MAGIC = b"\0\0\1\0" + + +def _save(im, fp, filename): + fp.write(_MAGIC) # (2+2) + sizes = im.encoderinfo.get("sizes", + [(16, 16), (24, 24), (32, 32), (48, 48), + (64, 64), (128, 128), (256, 256)]) + width, height = im.size + sizes = filter(lambda x: False if (x[0] > width or x[1] > height or + x[0] > 256 or x[1] > 256) else True, + sizes) + sizes = list(sizes) + fp.write(struct.pack("=8bpp) + 'reserved': i8(s[3]), + 'planes': i16(s[4:]), + 'bpp': i16(s[6:]), + 'size': i32(s[8:]), + 'offset': i32(s[12:]) + } + + # See Wikipedia + for j in ('width', 'height'): + if not icon_header[j]: + icon_header[j] = 256 + + # See Wikipedia notes about color depth. + # We need this just to differ images with equal sizes + icon_header['color_depth'] = (icon_header['bpp'] or + (icon_header['nb_color'] != 0 and + ceil(log(icon_header['nb_color'], + 2))) or 256) + + icon_header['dim'] = (icon_header['width'], icon_header['height']) + icon_header['square'] = (icon_header['width'] * + icon_header['height']) + + self.entry.append(icon_header) + + self.entry = sorted(self.entry, key=lambda x: x['color_depth']) + # ICO images are usually squares + # self.entry = sorted(self.entry, key=lambda x: x['width']) + self.entry = sorted(self.entry, key=lambda x: x['square']) + self.entry.reverse() + + def sizes(self): + """ + Get a list of all available icon sizes and color depths. + """ + return {(h['width'], h['height']) for h in self.entry} + + def getimage(self, size, bpp=False): + """ + Get an image from the icon + """ + for (i, h) in enumerate(self.entry): + if size == h['dim'] and (bpp is False or bpp == h['color_depth']): + return self.frame(i) + return self.frame(0) + + def frame(self, idx): + """ + Get an image from frame idx + """ + + header = self.entry[idx] + + self.buf.seek(header['offset']) + data = self.buf.read(8) + self.buf.seek(header['offset']) + + if data[:8] == PngImagePlugin._MAGIC: + # png frame + im = PngImagePlugin.PngImageFile(self.buf) + else: + # XOR + AND mask bmp frame + im = BmpImagePlugin.DibImageFile(self.buf) + + # change tile dimension to only encompass XOR image + im.size = (im.size[0], int(im.size[1] / 2)) + d, e, o, a = im.tile[0] + im.tile[0] = d, (0, 0) + im.size, o, a + + # figure out where AND mask image starts + mode = a[0] + bpp = 8 + for k, v in BmpImagePlugin.BIT2MODE.items(): + if mode == v[1]: + bpp = k + break + + if 32 == bpp: + # 32-bit color depth icon image allows semitransparent areas + # PIL's DIB format ignores transparency bits, recover them. + # The DIB is packed in BGRX byte order where X is the alpha + # channel. + + # Back up to start of bmp data + self.buf.seek(o) + # extract every 4th byte (eg. 3,7,11,15,...) + alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] + + # convert to an 8bpp grayscale image + mask = Image.frombuffer( + 'L', # 8bpp + im.size, # (w, h) + alpha_bytes, # source chars + 'raw', # raw decoder + ('L', 0, -1) # 8bpp inverted, unpadded, reversed + ) + else: + # get AND image from end of bitmap + w = im.size[0] + if (w % 32) > 0: + # bitmap row data is aligned to word boundaries + w += 32 - (im.size[0] % 32) + + # the total mask data is + # padded row size * height / bits per char + + and_mask_offset = o + int(im.size[0] * im.size[1] * + (bpp / 8.0)) + total_bytes = int((w * im.size[1]) / 8) + + self.buf.seek(and_mask_offset) + mask_data = self.buf.read(total_bytes) + + # convert raw data to image + mask = Image.frombuffer( + '1', # 1 bpp + im.size, # (w, h) + mask_data, # source chars + 'raw', # raw decoder + ('1;I', int(w/8), -1) # 1bpp inverted, padded, reversed + ) + + # now we have two images, im is XOR image and mask is AND image + + # apply mask image as alpha channel + im = im.convert('RGBA') + im.putalpha(mask) + + return im + + +## +# Image plugin for Windows Icon files. + +class IcoImageFile(ImageFile.ImageFile): + """ + PIL read-only image support for Microsoft Windows .ico files. + + By default the largest resolution image in the file will be loaded. This + can be changed by altering the 'size' attribute before calling 'load'. + + The info dictionary has a key 'sizes' that is a list of the sizes available + in the icon file. + + Handles classic, XP and Vista icon formats. + + This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis + . + https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki + """ + format = "ICO" + format_description = "Windows Icon" + + def _open(self): + self.ico = IcoFile(self.fp) + self.info['sizes'] = self.ico.sizes() + self.size = self.ico.entry[0]['dim'] + self.load() + + def load(self): + im = self.ico.getimage(self.size) + # if tile is PNG, it won't really be loaded yet + im.load() + self.im = im.im + self.mode = im.mode + self.size = im.size + + def load_seek(self): + # Flag the ImageFile.Parser so that it + # just does all the decode at the end. + pass +# +# -------------------------------------------------------------------- + + +Image.register_open(IcoImageFile.format, IcoImageFile, _accept) +Image.register_save(IcoImageFile.format, _save) +Image.register_extension(IcoImageFile.format, ".ico") diff --git a/imagecrunch/PIL/ImImagePlugin.py b/imagecrunch/PIL/ImImagePlugin.py new file mode 100644 index 0000000..b87fa90 --- /dev/null +++ b/imagecrunch/PIL/ImImagePlugin.py @@ -0,0 +1,347 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IFUNC IM file handling for PIL +# +# history: +# 1995-09-01 fl Created. +# 1997-01-03 fl Save palette images +# 1997-01-08 fl Added sequence support +# 1997-01-23 fl Added P and RGB save support +# 1997-05-31 fl Read floating point images +# 1997-06-22 fl Save floating point images +# 1997-08-27 fl Read and save 1-bit images +# 1998-06-25 fl Added support for RGB+LUT images +# 1998-07-02 fl Added support for YCC images +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 1998-12-29 fl Added I;16 support +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# 2003-09-26 fl Added LA/PA support +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +import re +from . import Image, ImageFile, ImagePalette +from ._binary import i8 + +__version__ = "0.7" + + +# -------------------------------------------------------------------- +# Standard tags + +COMMENT = "Comment" +DATE = "Date" +EQUIPMENT = "Digitalization equipment" +FRAMES = "File size (no of images)" +LUT = "Lut" +NAME = "Name" +SCALE = "Scale (x,y)" +SIZE = "Image size (x*y)" +MODE = "Image type" + +TAGS = {COMMENT: 0, DATE: 0, EQUIPMENT: 0, FRAMES: 0, LUT: 0, NAME: 0, + SCALE: 0, SIZE: 0, MODE: 0} + +OPEN = { + # ifunc93/p3cfunc formats + "0 1 image": ("1", "1"), + "L 1 image": ("1", "1"), + "Greyscale image": ("L", "L"), + "Grayscale image": ("L", "L"), + "RGB image": ("RGB", "RGB;L"), + "RLB image": ("RGB", "RLB"), + "RYB image": ("RGB", "RLB"), + "B1 image": ("1", "1"), + "B2 image": ("P", "P;2"), + "B4 image": ("P", "P;4"), + "X 24 image": ("RGB", "RGB"), + "L 32 S image": ("I", "I;32"), + "L 32 F image": ("F", "F;32"), + # old p3cfunc formats + "RGB3 image": ("RGB", "RGB;T"), + "RYB3 image": ("RGB", "RYB;T"), + # extensions + "LA image": ("LA", "LA;L"), + "RGBA image": ("RGBA", "RGBA;L"), + "RGBX image": ("RGBX", "RGBX;L"), + "CMYK image": ("CMYK", "CMYK;L"), + "YCC image": ("YCbCr", "YCbCr;L"), +} + +# ifunc95 extensions +for i in ["8", "8S", "16", "16S", "32", "32F"]: + OPEN["L %s image" % i] = ("F", "F;%s" % i) + OPEN["L*%s image" % i] = ("F", "F;%s" % i) +for i in ["16", "16L", "16B"]: + OPEN["L %s image" % i] = ("I;%s" % i, "I;%s" % i) + OPEN["L*%s image" % i] = ("I;%s" % i, "I;%s" % i) +for i in ["32S"]: + OPEN["L %s image" % i] = ("I", "I;%s" % i) + OPEN["L*%s image" % i] = ("I", "I;%s" % i) +for i in range(2, 33): + OPEN["L*%s image" % i] = ("F", "F;%s" % i) + + +# -------------------------------------------------------------------- +# Read IM directory + +split = re.compile(br"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") + + +def number(s): + try: + return int(s) + except ValueError: + return float(s) + + +## +# Image plugin for the IFUNC IM file format. + +class ImImageFile(ImageFile.ImageFile): + + format = "IM" + format_description = "IFUNC Image Memory" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # Quick rejection: if there's not an LF among the first + # 100 bytes, this is (probably) not a text header. + + if b"\n" not in self.fp.read(100): + raise SyntaxError("not an IM file") + self.fp.seek(0) + + n = 0 + + # Default values + self.info[MODE] = "L" + self.info[SIZE] = (512, 512) + self.info[FRAMES] = 1 + + self.rawmode = "L" + + while True: + + s = self.fp.read(1) + + # Some versions of IFUNC uses \n\r instead of \r\n... + if s == b"\r": + continue + + if not s or s == b'\0' or s == b'\x1A': + break + + # FIXME: this may read whole file if not a text file + s = s + self.fp.readline() + + if len(s) > 100: + raise SyntaxError("not an IM file") + + if s[-2:] == b'\r\n': + s = s[:-2] + elif s[-1:] == b'\n': + s = s[:-1] + + try: + m = split.match(s) + except re.error as v: + raise SyntaxError("not an IM file") + + if m: + + k, v = m.group(1, 2) + + # Don't know if this is the correct encoding, + # but a decent guess (I guess) + k = k.decode('latin-1', 'replace') + v = v.decode('latin-1', 'replace') + + # Convert value as appropriate + if k in [FRAMES, SCALE, SIZE]: + v = v.replace("*", ",") + v = tuple(map(number, v.split(","))) + if len(v) == 1: + v = v[0] + elif k == MODE and v in OPEN: + v, self.rawmode = OPEN[v] + + # Add to dictionary. Note that COMMENT tags are + # combined into a list of strings. + if k == COMMENT: + if k in self.info: + self.info[k].append(v) + else: + self.info[k] = [v] + else: + self.info[k] = v + + if k in TAGS: + n += 1 + + else: + + raise SyntaxError("Syntax error in IM header: " + + s.decode('ascii', 'replace')) + + if not n: + raise SyntaxError("Not an IM file") + + # Basic attributes + self.size = self.info[SIZE] + self.mode = self.info[MODE] + + # Skip forward to start of image data + while s and s[0:1] != b'\x1A': + s = self.fp.read(1) + if not s: + raise SyntaxError("File truncated") + + if LUT in self.info: + # convert lookup table to palette or lut attribute + palette = self.fp.read(768) + greyscale = 1 # greyscale palette + linear = 1 # linear greyscale palette + for i in range(256): + if palette[i] == palette[i+256] == palette[i+512]: + if i8(palette[i]) != i: + linear = 0 + else: + greyscale = 0 + if self.mode == "L" or self.mode == "LA": + if greyscale: + if not linear: + self.lut = [i8(c) for c in palette[:256]] + else: + if self.mode == "L": + self.mode = self.rawmode = "P" + elif self.mode == "LA": + self.mode = self.rawmode = "PA" + self.palette = ImagePalette.raw("RGB;L", palette) + elif self.mode == "RGB": + if not greyscale or not linear: + self.lut = [i8(c) for c in palette] + + self.frame = 0 + + self.__offset = offs = self.fp.tell() + + self.__fp = self.fp # FIXME: hack + + if self.rawmode[:2] == "F;": + + # ifunc95 formats + try: + # use bit decoder (if necessary) + bits = int(self.rawmode[2:]) + if bits not in [8, 16, 32]: + self.tile = [("bit", (0, 0)+self.size, offs, + (bits, 8, 3, 0, -1))] + return + except ValueError: + pass + + if self.rawmode in ["RGB;T", "RYB;T"]: + # Old LabEye/3PC files. Would be very surprised if anyone + # ever stumbled upon such a file ;-) + size = self.size[0] * self.size[1] + self.tile = [("raw", (0, 0)+self.size, offs, ("G", 0, -1)), + ("raw", (0, 0)+self.size, offs+size, ("R", 0, -1)), + ("raw", (0, 0)+self.size, offs+2*size, ("B", 0, -1))] + else: + # LabEye/IFUNC files + self.tile = [("raw", (0, 0)+self.size, offs, + (self.rawmode, 0, -1))] + + @property + def n_frames(self): + return self.info[FRAMES] + + @property + def is_animated(self): + return self.info[FRAMES] > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + + self.frame = frame + + if self.mode == "1": + bits = 1 + else: + bits = 8 * len(self.mode) + + size = ((self.size[0] * bits + 7) // 8) * self.size[1] + offs = self.__offset + frame * size + + self.fp = self.__fp + + self.tile = [("raw", (0, 0)+self.size, offs, (self.rawmode, 0, -1))] + + def tell(self): + return self.frame + +# +# -------------------------------------------------------------------- +# Save IM files + + +SAVE = { + # mode: (im type, raw mode) + "1": ("0 1", "1"), + "L": ("Greyscale", "L"), + "LA": ("LA", "LA;L"), + "P": ("Greyscale", "P"), + "PA": ("LA", "PA;L"), + "I": ("L 32S", "I;32S"), + "I;16": ("L 16", "I;16"), + "I;16L": ("L 16L", "I;16L"), + "I;16B": ("L 16B", "I;16B"), + "F": ("L 32F", "F;32F"), + "RGB": ("RGB", "RGB;L"), + "RGBA": ("RGBA", "RGBA;L"), + "RGBX": ("RGBX", "RGBX;L"), + "CMYK": ("CMYK", "CMYK;L"), + "YCbCr": ("YCC", "YCbCr;L") +} + + +def _save(im, fp, filename): + + try: + image_type, rawmode = SAVE[im.mode] + except KeyError: + raise ValueError("Cannot save %s images as IM" % im.mode) + + frames = im.encoderinfo.get("frames", 1) + + fp.write(("Image type: %s image\r\n" % image_type).encode('ascii')) + if filename: + fp.write(("Name: %s\r\n" % filename).encode('ascii')) + fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode('ascii')) + fp.write(("File size (no of images): %d\r\n" % frames).encode('ascii')) + if im.mode == "P": + fp.write(b"Lut: 1\r\n") + fp.write(b"\000" * (511-fp.tell()) + b"\032") + if im.mode == "P": + fp.write(im.im.getpalette("RGB", "RGB;L")) # 768 bytes + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 0, (rawmode, 0, -1))]) + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(ImImageFile.format, ImImageFile) +Image.register_save(ImImageFile.format, _save) + +Image.register_extension(ImImageFile.format, ".im") diff --git a/imagecrunch/PIL/Image.py b/imagecrunch/PIL/Image.py new file mode 100644 index 0000000..c589526 --- /dev/null +++ b/imagecrunch/PIL/Image.py @@ -0,0 +1,2930 @@ +# +# The Python Imaging Library. +# $Id$ +# +# the Image class wrapper +# +# partial release history: +# 1995-09-09 fl Created +# 1996-03-11 fl PIL release 0.0 (proof of concept) +# 1996-04-30 fl PIL release 0.1b1 +# 1999-07-28 fl PIL release 1.0 final +# 2000-06-07 fl PIL release 1.1 +# 2000-10-20 fl PIL release 1.1.1 +# 2001-05-07 fl PIL release 1.1.2 +# 2002-03-15 fl PIL release 1.1.3 +# 2003-05-10 fl PIL release 1.1.4 +# 2005-03-28 fl PIL release 1.1.5 +# 2006-12-02 fl PIL release 1.1.6 +# 2009-11-15 fl PIL release 1.1.7 +# +# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-2009 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +# VERSION is deprecated and will be removed in Pillow 6.0.0. +# PILLOW_VERSION is deprecated and will be removed after that. +# Use __version__ instead. +from . import VERSION, PILLOW_VERSION, __version__, _plugins +from ._util import py3 + +import logging +import warnings +import math + +logger = logging.getLogger(__name__) + + +class DecompressionBombWarning(RuntimeWarning): + pass + + +class DecompressionBombError(Exception): + pass + + +class _imaging_not_installed(object): + # module placeholder + def __getattr__(self, id): + raise ImportError("The _imaging C module is not installed") + + +# Limit to around a quarter gigabyte for a 24 bit (3 bpp) image +MAX_IMAGE_PIXELS = int(1024 * 1024 * 1024 // 4 // 3) + + +try: + # If the _imaging C module is not present, Pillow will not load. + # Note that other modules should not refer to _imaging directly; + # import Image and use the Image.core variable instead. + # Also note that Image.core is not a publicly documented interface, + # and should be considered private and subject to change. + from . import _imaging as core + if __version__ != getattr(core, 'PILLOW_VERSION', None): + raise ImportError("The _imaging extension was built for another " + "version of Pillow or PIL:\n" + "Core version: %s\n" + "Pillow version: %s" % + (getattr(core, 'PILLOW_VERSION', None), + __version__)) + +except ImportError as v: + core = _imaging_not_installed() + # Explanations for ways that we know we might have an import error + if str(v).startswith("Module use of python"): + # The _imaging C module is present, but not compiled for + # the right version (windows only). Print a warning, if + # possible. + warnings.warn( + "The _imaging extension was built for another version " + "of Python.", + RuntimeWarning + ) + elif str(v).startswith("The _imaging extension"): + warnings.warn(str(v), RuntimeWarning) + elif "Symbol not found: _PyUnicodeUCS2_" in str(v): + # should match _PyUnicodeUCS2_FromString and + # _PyUnicodeUCS2_AsLatin1String + warnings.warn( + "The _imaging extension was built for Python with UCS2 support; " + "recompile Pillow or build Python --without-wide-unicode. ", + RuntimeWarning + ) + elif "Symbol not found: _PyUnicodeUCS4_" in str(v): + # should match _PyUnicodeUCS4_FromString and + # _PyUnicodeUCS4_AsLatin1String + warnings.warn( + "The _imaging extension was built for Python with UCS4 support; " + "recompile Pillow or build Python --with-wide-unicode. ", + RuntimeWarning + ) + # Fail here anyway. Don't let people run with a mostly broken Pillow. + # see docs/porting.rst + raise + +try: + import builtins +except ImportError: + import __builtin__ + builtins = __builtin__ + +from . import ImageMode +from ._binary import i8 +from ._util import isPath, isStringType, deferred_error + +import os +import sys +import io +import struct +import atexit + +# type stuff +import numbers +try: + # Python 3 + from collections.abc import Callable +except ImportError: + # Python 2.7 + from collections import Callable + + +# works everywhere, win for pypy, not cpython +USE_CFFI_ACCESS = hasattr(sys, 'pypy_version_info') +try: + import cffi + HAS_CFFI = True +except ImportError: + HAS_CFFI = False + +try: + from pathlib import Path + HAS_PATHLIB = True +except ImportError: + try: + from pathlib2 import Path + HAS_PATHLIB = True + except ImportError: + HAS_PATHLIB = False + + +def isImageType(t): + """ + Checks if an object is an image object. + + .. warning:: + + This function is for internal use only. + + :param t: object to check if it's an image + :returns: True if the object is an image + """ + return hasattr(t, "im") + + +# +# Constants (also defined in _imagingmodule.c!) + +NONE = 0 + +# transpose +FLIP_LEFT_RIGHT = 0 +FLIP_TOP_BOTTOM = 1 +ROTATE_90 = 2 +ROTATE_180 = 3 +ROTATE_270 = 4 +TRANSPOSE = 5 +TRANSVERSE = 6 + +# transforms +AFFINE = 0 +EXTENT = 1 +PERSPECTIVE = 2 +QUAD = 3 +MESH = 4 + +# resampling filters +NEAREST = NONE = 0 +BOX = 4 +BILINEAR = LINEAR = 2 +HAMMING = 5 +BICUBIC = CUBIC = 3 +LANCZOS = ANTIALIAS = 1 + +# dithers +NEAREST = NONE = 0 +ORDERED = 1 # Not yet implemented +RASTERIZE = 2 # Not yet implemented +FLOYDSTEINBERG = 3 # default + +# palettes/quantizers +WEB = 0 +ADAPTIVE = 1 + +MEDIANCUT = 0 +MAXCOVERAGE = 1 +FASTOCTREE = 2 +LIBIMAGEQUANT = 3 + +# categories +NORMAL = 0 +SEQUENCE = 1 +CONTAINER = 2 + +if hasattr(core, 'DEFAULT_STRATEGY'): + DEFAULT_STRATEGY = core.DEFAULT_STRATEGY + FILTERED = core.FILTERED + HUFFMAN_ONLY = core.HUFFMAN_ONLY + RLE = core.RLE + FIXED = core.FIXED + + +# -------------------------------------------------------------------- +# Registries + +ID = [] +OPEN = {} +MIME = {} +SAVE = {} +SAVE_ALL = {} +EXTENSION = {} +DECODERS = {} +ENCODERS = {} + +# -------------------------------------------------------------------- +# Modes supported by this version + +_MODEINFO = { + # NOTE: this table will be removed in future versions. use + # getmode* functions or ImageMode descriptors instead. + + # official modes + "1": ("L", "L", ("1",)), + "L": ("L", "L", ("L",)), + "I": ("L", "I", ("I",)), + "F": ("L", "F", ("F",)), + "P": ("RGB", "L", ("P",)), + "RGB": ("RGB", "L", ("R", "G", "B")), + "RGBX": ("RGB", "L", ("R", "G", "B", "X")), + "RGBA": ("RGB", "L", ("R", "G", "B", "A")), + "CMYK": ("RGB", "L", ("C", "M", "Y", "K")), + "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr")), + "LAB": ("RGB", "L", ("L", "A", "B")), + "HSV": ("RGB", "L", ("H", "S", "V")), + + # Experimental modes include I;16, I;16L, I;16B, RGBa, BGR;15, and + # BGR;24. Use these modes only if you know exactly what you're + # doing... + +} + +if sys.byteorder == 'little': + _ENDIAN = '<' +else: + _ENDIAN = '>' + +_MODE_CONV = { + # official modes + "1": ('|b1', None), # Bits need to be extended to bytes + "L": ('|u1', None), + "LA": ('|u1', 2), + "I": (_ENDIAN + 'i4', None), + "F": (_ENDIAN + 'f4', None), + "P": ('|u1', None), + "RGB": ('|u1', 3), + "RGBX": ('|u1', 4), + "RGBA": ('|u1', 4), + "CMYK": ('|u1', 4), + "YCbCr": ('|u1', 3), + "LAB": ('|u1', 3), # UNDONE - unsigned |u1i1i1 + "HSV": ('|u1', 3), + # I;16 == I;16L, and I;32 == I;32L + "I;16": ('u2', None), + "I;16L": ('i2', None), + "I;16LS": ('u4', None), + "I;32L": ('i4', None), + "I;32LS": ('= 1: + return + + try: + from . import BmpImagePlugin + except ImportError: + pass + try: + from . import GifImagePlugin + except ImportError: + pass + try: + from . import JpegImagePlugin + except ImportError: + pass + try: + from . import PpmImagePlugin + except ImportError: + pass + try: + from . import PngImagePlugin + except ImportError: + pass +# try: +# import TiffImagePlugin +# except ImportError: +# pass + + _initialized = 1 + + +def init(): + """ + Explicitly initializes the Python Imaging Library. This function + loads all available file format drivers. + """ + + global _initialized + if _initialized >= 2: + return 0 + + for plugin in _plugins: + try: + logger.debug("Importing %s", plugin) + __import__("PIL.%s" % plugin, globals(), locals(), []) + except ImportError as e: + logger.debug("Image: failed to import %s: %s", plugin, e) + + if OPEN or SAVE: + _initialized = 2 + return 1 + + +# -------------------------------------------------------------------- +# Codec factories (used by tobytes/frombytes and ImageFile.load) + +def _getdecoder(mode, decoder_name, args, extra=()): + + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + decoder = DECODERS[decoder_name] + return decoder(mode, *args + extra) + except KeyError: + pass + try: + # get decoder + decoder = getattr(core, decoder_name + "_decoder") + # print(decoder, mode, args + extra) + return decoder(mode, *args + extra) + except AttributeError: + raise IOError("decoder %s not available" % decoder_name) + + +def _getencoder(mode, encoder_name, args, extra=()): + + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + encoder = ENCODERS[encoder_name] + return encoder(mode, *args + extra) + except KeyError: + pass + try: + # get encoder + encoder = getattr(core, encoder_name + "_encoder") + # print(encoder, mode, args + extra) + return encoder(mode, *args + extra) + except AttributeError: + raise IOError("encoder %s not available" % encoder_name) + + +# -------------------------------------------------------------------- +# Simple expression analyzer + +def coerce_e(value): + return value if isinstance(value, _E) else _E(value) + + +class _E(object): + def __init__(self, data): + self.data = data + + def __add__(self, other): + return _E((self.data, "__add__", coerce_e(other).data)) + + def __mul__(self, other): + return _E((self.data, "__mul__", coerce_e(other).data)) + + +def _getscaleoffset(expr): + stub = ["stub"] + data = expr(_E(stub)).data + try: + (a, b, c) = data # simplified syntax + if (a is stub and b == "__mul__" and isinstance(c, numbers.Number)): + return c, 0.0 + if a is stub and b == "__add__" and isinstance(c, numbers.Number): + return 1.0, c + except TypeError: + pass + try: + ((a, b, c), d, e) = data # full syntax + if (a is stub and b == "__mul__" and isinstance(c, numbers.Number) and + d == "__add__" and isinstance(e, numbers.Number)): + return c, e + except TypeError: + pass + raise ValueError("illegal expression") + + +# -------------------------------------------------------------------- +# Implementation wrapper + +class Image(object): + """ + This class represents an image object. To create + :py:class:`~PIL.Image.Image` objects, use the appropriate factory + functions. There's hardly ever any reason to call the Image constructor + directly. + + * :py:func:`~PIL.Image.open` + * :py:func:`~PIL.Image.new` + * :py:func:`~PIL.Image.frombytes` + """ + format = None + format_description = None + _close_exclusive_fp_after_loading = True + + def __init__(self): + # FIXME: take "new" parameters / other image? + # FIXME: turn mode and size into delegating properties? + self.im = None + self.mode = "" + self.size = (0, 0) + self.palette = None + self.info = {} + self.category = NORMAL + self.readonly = 0 + self.pyaccess = None + + @property + def width(self): + return self.size[0] + + @property + def height(self): + return self.size[1] + + def _new(self, im): + new = Image() + new.im = im + new.mode = im.mode + new.size = im.size + if im.mode in ('P', 'PA'): + if self.palette: + new.palette = self.palette.copy() + else: + from . import ImagePalette + new.palette = ImagePalette.ImagePalette() + new.info = self.info.copy() + return new + + # Context Manager Support + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + """ + Closes the file pointer, if possible. + + This operation will destroy the image core and release its memory. + The image data will be unusable afterward. + + This function is only required to close images that have not + had their file read and closed by the + :py:meth:`~PIL.Image.Image.load` method. See + :ref:`file-handling` for more information. + """ + try: + self.fp.close() + self.fp = None + except Exception as msg: + logger.debug("Error closing: %s", msg) + + if getattr(self, 'map', None): + self.map = None + + # Instead of simply setting to None, we're setting up a + # deferred error that will better explain that the core image + # object is gone. + self.im = deferred_error(ValueError("Operation on closed image")) + + if sys.version_info.major >= 3: + def __del__(self): + if (hasattr(self, 'fp') and hasattr(self, '_exclusive_fp') + and self.fp and self._exclusive_fp): + self.fp.close() + self.fp = None + + def _copy(self): + self.load() + self.im = self.im.copy() + self.pyaccess = None + self.readonly = 0 + + def _ensure_mutable(self): + if self.readonly: + self._copy() + else: + self.load() + + def _dump(self, file=None, format=None, **options): + import tempfile + + suffix = '' + if format: + suffix = '.'+format + + if not file: + f, filename = tempfile.mkstemp(suffix) + os.close(f) + else: + filename = file + if not filename.endswith(suffix): + filename = filename + suffix + + self.load() + + if not format or format == "PPM": + self.im.save_ppm(filename) + else: + self.save(filename, format, **options) + + return filename + + def __eq__(self, other): + return (isinstance(other, Image) and + self.__class__.__name__ == other.__class__.__name__ and + self.mode == other.mode and + self.size == other.size and + self.info == other.info and + self.category == other.category and + self.readonly == other.readonly and + self.getpalette() == other.getpalette() and + self.tobytes() == other.tobytes()) + + def __ne__(self, other): + eq = (self == other) + return not eq + + def __repr__(self): + return "<%s.%s image mode=%s size=%dx%d at 0x%X>" % ( + self.__class__.__module__, self.__class__.__name__, + self.mode, self.size[0], self.size[1], + id(self) + ) + + def _repr_png_(self): + """ iPython display hook support + + :returns: png version of the image as bytes + """ + from io import BytesIO + b = BytesIO() + self.save(b, 'PNG') + return b.getvalue() + + @property + def __array_interface__(self): + # numpy array interface support + new = {} + shape, typestr = _conv_type_shape(self) + new['shape'] = shape + new['typestr'] = typestr + new['version'] = 3 + if self.mode == '1': + # Binary images need to be extended from bits to bytes + # See: https://github.com/python-pillow/Pillow/issues/350 + new['data'] = self.tobytes('raw', 'L') + else: + new['data'] = self.tobytes() + return new + + def __getstate__(self): + return [ + self.info, + self.mode, + self.size, + self.getpalette(), + self.tobytes()] + + def __setstate__(self, state): + Image.__init__(self) + self.tile = [] + info, mode, size, palette, data = state + self.info = info + self.mode = mode + self.size = size + self.im = core.new(mode, size) + if mode in ("L", "P") and palette: + self.putpalette(palette) + self.frombytes(data) + + def tobytes(self, encoder_name="raw", *args): + """ + Return image as a bytes object. + + .. warning:: + + This method returns the raw image data from the internal + storage. For compressed image data (e.g. PNG, JPEG) use + :meth:`~.save`, with a BytesIO parameter for in-memory + data. + + :param encoder_name: What encoder to use. The default is to + use the standard "raw" encoder. + :param args: Extra arguments to the encoder. + :rtype: A bytes object. + """ + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if encoder_name == "raw" and args == (): + args = self.mode + + self.load() + + # unpack data + e = _getencoder(self.mode, encoder_name, args) + e.setimage(self.im) + + bufsize = max(65536, self.size[0] * 4) # see RawEncode.c + + data = [] + while True: + l, s, d = e.encode(bufsize) + data.append(d) + if s: + break + if s < 0: + raise RuntimeError("encoder error %d in tobytes" % s) + + return b"".join(data) + + def tostring(self, *args, **kw): + raise NotImplementedError("tostring() has been removed. " + "Please call tobytes() instead.") + + def tobitmap(self, name="image"): + """ + Returns the image converted to an X11 bitmap. + + .. note:: This method only works for mode "1" images. + + :param name: The name prefix to use for the bitmap variables. + :returns: A string containing an X11 bitmap. + :raises ValueError: If the mode is not "1" + """ + + self.load() + if self.mode != "1": + raise ValueError("not a bitmap") + data = self.tobytes("xbm") + return b"".join([ + ("#define %s_width %d\n" % (name, self.size[0])).encode('ascii'), + ("#define %s_height %d\n" % (name, self.size[1])).encode('ascii'), + ("static char %s_bits[] = {\n" % name).encode('ascii'), data, b"};" + ]) + + def frombytes(self, data, decoder_name="raw", *args): + """ + Loads this image with pixel data from a bytes object. + + This method is similar to the :py:func:`~PIL.Image.frombytes` function, + but loads data into this image instead of creating a new image object. + """ + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + # default format + if decoder_name == "raw" and args == (): + args = self.mode + + # unpack data + d = _getdecoder(self.mode, decoder_name, args) + d.setimage(self.im) + s = d.decode(data) + + if s[0] >= 0: + raise ValueError("not enough image data") + if s[1] != 0: + raise ValueError("cannot decode image data") + + def fromstring(self, *args, **kw): + raise NotImplementedError("fromstring() has been removed. " + "Please call frombytes() instead.") + + def load(self): + """ + Allocates storage for the image and loads the pixel data. In + normal cases, you don't need to call this method, since the + Image class automatically loads an opened image when it is + accessed for the first time. + + This method will close the file associated with the image. See + :ref:`file-handling` for more information. + + :returns: An image access object. + :rtype: :ref:`PixelAccess` or :py:class:`PIL.PyAccess` + """ + if self.im and self.palette and self.palette.dirty: + # realize palette + self.im.putpalette(*self.palette.getdata()) + self.palette.dirty = 0 + self.palette.mode = "RGB" + self.palette.rawmode = None + if "transparency" in self.info: + if isinstance(self.info["transparency"], int): + self.im.putpalettealpha(self.info["transparency"], 0) + else: + self.im.putpalettealphas(self.info["transparency"]) + self.palette.mode = "RGBA" + + if self.im: + if HAS_CFFI and USE_CFFI_ACCESS: + if self.pyaccess: + return self.pyaccess + from . import PyAccess + self.pyaccess = PyAccess.new(self, self.readonly) + if self.pyaccess: + return self.pyaccess + return self.im.pixel_access(self.readonly) + + def verify(self): + """ + Verifies the contents of a file. For data read from a file, this + method attempts to determine if the file is broken, without + actually decoding the image data. If this method finds any + problems, it raises suitable exceptions. If you need to load + the image after using this method, you must reopen the image + file. + """ + pass + + def convert(self, mode=None, matrix=None, dither=None, + palette=WEB, colors=256): + """ + Returns a converted copy of this image. For the "P" mode, this + method translates pixels through the palette. If mode is + omitted, a mode is chosen so that all information in the image + and the palette can be represented without a palette. + + The current version supports all possible conversions between + "L", "RGB" and "CMYK." The **matrix** argument only supports "L" + and "RGB". + + When translating a color image to black and white (mode "L"), + the library uses the ITU-R 601-2 luma transform:: + + L = R * 299/1000 + G * 587/1000 + B * 114/1000 + + The default method of converting a greyscale ("L") or "RGB" + image into a bilevel (mode "1") image uses Floyd-Steinberg + dither to approximate the original image luminosity levels. If + dither is NONE, all non-zero values are set to 255 (white). To + use other thresholds, use the :py:meth:`~PIL.Image.Image.point` + method. + + :param mode: The requested mode. See: :ref:`concept-modes`. + :param matrix: An optional conversion matrix. If given, this + should be 4- or 12-tuple containing floating point values. + :param dither: Dithering method, used when converting from + mode "RGB" to "P" or from "RGB" or "L" to "1". + Available methods are NONE or FLOYDSTEINBERG (default). + :param palette: Palette to use when converting from mode "RGB" + to "P". Available palettes are WEB or ADAPTIVE. + :param colors: Number of colors to use for the ADAPTIVE palette. + Defaults to 256. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + self.load() + + if not mode and self.mode == "P": + # determine default mode + if self.palette: + mode = self.palette.mode + else: + mode = "RGB" + if not mode or (mode == self.mode and not matrix): + return self.copy() + + if matrix: + # matrix conversion + if mode not in ("L", "RGB"): + raise ValueError("illegal conversion") + im = self.im.convert_matrix(mode, matrix) + return self._new(im) + + if mode == "P" and self.mode == "RGBA": + return self.quantize(colors) + + trns = None + delete_trns = False + # transparency handling + if "transparency" in self.info and \ + self.info['transparency'] is not None: + if self.mode in ('L', 'RGB') and mode == 'RGBA': + # Use transparent conversion to promote from transparent + # color to an alpha channel. + new_im = self._new(self.im.convert_transparent( + mode, self.info['transparency'])) + del(new_im.info['transparency']) + return new_im + elif self.mode in ('L', 'RGB', 'P') and mode in ('L', 'RGB', 'P'): + t = self.info['transparency'] + if isinstance(t, bytes): + # Dragons. This can't be represented by a single color + warnings.warn('Palette images with Transparency ' + + ' expressed in bytes should be converted ' + + 'to RGBA images') + delete_trns = True + else: + # get the new transparency color. + # use existing conversions + trns_im = Image()._new(core.new(self.mode, (1, 1))) + if self.mode == 'P': + trns_im.putpalette(self.palette) + if isinstance(t, tuple): + try: + t = trns_im.palette.getcolor(t) + except: + raise ValueError("Couldn't allocate a palette " + "color for transparency") + trns_im.putpixel((0, 0), t) + + if mode in ('L', 'RGB'): + trns_im = trns_im.convert(mode) + else: + # can't just retrieve the palette number, got to do it + # after quantization. + trns_im = trns_im.convert('RGB') + trns = trns_im.getpixel((0, 0)) + + elif self.mode == 'P' and mode == 'RGBA': + t = self.info['transparency'] + delete_trns = True + + if isinstance(t, bytes): + self.im.putpalettealphas(t) + elif isinstance(t, int): + self.im.putpalettealpha(t, 0) + else: + raise ValueError("Transparency for P mode should" + + " be bytes or int") + + if mode == "P" and palette == ADAPTIVE: + im = self.im.quantize(colors) + new = self._new(im) + from . import ImagePalette + new.palette = ImagePalette.raw("RGB", new.im.getpalette("RGB")) + if delete_trns: + # This could possibly happen if we requantize to fewer colors. + # The transparency would be totally off in that case. + del(new.info['transparency']) + if trns is not None: + try: + new.info['transparency'] = new.palette.getcolor(trns) + except: + # if we can't make a transparent color, don't leave the old + # transparency hanging around to mess us up. + del(new.info['transparency']) + warnings.warn("Couldn't allocate palette entry " + + "for transparency") + return new + + # colorspace conversion + if dither is None: + dither = FLOYDSTEINBERG + + try: + im = self.im.convert(mode, dither) + except ValueError: + try: + # normalize source image and try again + im = self.im.convert(getmodebase(self.mode)) + im = im.convert(mode, dither) + except KeyError: + raise ValueError("illegal conversion") + + new_im = self._new(im) + if delete_trns: + # crash fail if we leave a bytes transparency in an rgb/l mode. + del(new_im.info['transparency']) + if trns is not None: + if new_im.mode == 'P': + try: + new_im.info['transparency'] = new_im.palette.getcolor(trns) + except: + del(new_im.info['transparency']) + warnings.warn("Couldn't allocate palette entry " + + "for transparency") + else: + new_im.info['transparency'] = trns + return new_im + + def quantize(self, colors=256, method=None, kmeans=0, palette=None): + """ + Convert the image to 'P' mode with the specified number + of colors. + + :param colors: The desired number of colors, <= 256 + :param method: 0 = median cut + 1 = maximum coverage + 2 = fast octree + 3 = libimagequant + :param kmeans: Integer + :param palette: Quantize to the palette of given :py:class:`PIL.Image.Image`. + :returns: A new image + + """ + + self.load() + + if method is None: + # defaults: + method = 0 + if self.mode == 'RGBA': + method = 2 + + if self.mode == 'RGBA' and method not in (2, 3): + # Caller specified an invalid mode. + raise ValueError( + 'Fast Octree (method == 2) and libimagequant (method == 3) ' + + 'are the only valid methods for quantizing RGBA images') + + if palette: + # use palette from reference image + palette.load() + if palette.mode != "P": + raise ValueError("bad mode for palette image") + if self.mode != "RGB" and self.mode != "L": + raise ValueError( + "only RGB or L mode images can be quantized to a palette" + ) + im = self.im.convert("P", 1, palette.im) + return self._new(im) + + return self._new(self.im.quantize(colors, method, kmeans)) + + def copy(self): + """ + Copies this image. Use this method if you wish to paste things + into an image, but still retain the original. + + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + self.load() + return self._new(self.im.copy()) + + __copy__ = copy + + def crop(self, box=None): + """ + Returns a rectangular region from this image. The box is a + 4-tuple defining the left, upper, right, and lower pixel + coordinate. See :ref:`coordinate-system`. + + Note: Prior to Pillow 3.4.0, this was a lazy operation. + + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if box is None: + return self.copy() + + self.load() + return self._new(self._crop(self.im, box)) + + def _crop(self, im, box): + """ + Returns a rectangular region from the core image object im. + + This is equivalent to calling im.crop((x0, y0, x1, y1)), but + includes additional sanity checks. + + :param im: a core image object + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :returns: A core image object. + """ + + x0, y0, x1, y1 = map(int, map(round, box)) + + if x1 < x0: + x1 = x0 + if y1 < y0: + y1 = y0 + + _decompression_bomb_check((x1, y1)) + + return im.crop((x0, y0, x1, y1)) + + def draft(self, mode, size): + """ + Configures the image file loader so it returns a version of the + image that as closely as possible matches the given mode and + size. For example, you can use this method to convert a color + JPEG to greyscale while loading it, or to extract a 128x192 + version from a PCD file. + + Note that this method modifies the :py:class:`~PIL.Image.Image` object + in place. If the image has already been loaded, this method has no + effect. + + Note: This method is not implemented for most images. It is + currently implemented only for JPEG and PCD images. + + :param mode: The requested mode. + :param size: The requested size. + """ + pass + + def _expand(self, xmargin, ymargin=None): + if ymargin is None: + ymargin = xmargin + self.load() + return self._new(self.im.expand(xmargin, ymargin, 0)) + + def filter(self, filter): + """ + Filters this image using the given filter. For a list of + available filters, see the :py:mod:`~PIL.ImageFilter` module. + + :param filter: Filter kernel. + :returns: An :py:class:`~PIL.Image.Image` object. """ + + from . import ImageFilter + + self.load() + + if isinstance(filter, Callable): + filter = filter() + if not hasattr(filter, "filter"): + raise TypeError("filter argument should be ImageFilter.Filter " + + "instance or class") + + multiband = isinstance(filter, ImageFilter.MultibandFilter) + if self.im.bands == 1 or multiband: + return self._new(filter.filter(self.im)) + + ims = [] + for c in range(self.im.bands): + ims.append(self._new(filter.filter(self.im.getband(c)))) + return merge(self.mode, ims) + + def getbands(self): + """ + Returns a tuple containing the name of each band in this image. + For example, **getbands** on an RGB image returns ("R", "G", "B"). + + :returns: A tuple containing band names. + :rtype: tuple + """ + return ImageMode.getmode(self.mode).bands + + def getbbox(self): + """ + Calculates the bounding box of the non-zero regions in the + image. + + :returns: The bounding box is returned as a 4-tuple defining the + left, upper, right, and lower pixel coordinate. See + :ref:`coordinate-system`. If the image is completely empty, this + method returns None. + + """ + + self.load() + return self.im.getbbox() + + def getcolors(self, maxcolors=256): + """ + Returns a list of colors used in this image. + + :param maxcolors: Maximum number of colors. If this number is + exceeded, this method returns None. The default limit is + 256 colors. + :returns: An unsorted list of (count, pixel) values. + """ + + self.load() + if self.mode in ("1", "L", "P"): + h = self.im.histogram() + out = [] + for i in range(256): + if h[i]: + out.append((h[i], i)) + if len(out) > maxcolors: + return None + return out + return self.im.getcolors(maxcolors) + + def getdata(self, band=None): + """ + Returns the contents of this image as a sequence object + containing pixel values. The sequence object is flattened, so + that values for line one follow directly after the values of + line zero, and so on. + + Note that the sequence object returned by this method is an + internal PIL data type, which only supports certain sequence + operations. To convert it to an ordinary sequence (e.g. for + printing), use **list(im.getdata())**. + + :param band: What band to return. The default is to return + all bands. To return a single band, pass in the index + value (e.g. 0 to get the "R" band from an "RGB" image). + :returns: A sequence-like object. + """ + + self.load() + if band is not None: + return self.im.getband(band) + return self.im # could be abused + + def getextrema(self): + """ + Gets the the minimum and maximum pixel values for each band in + the image. + + :returns: For a single-band image, a 2-tuple containing the + minimum and maximum pixel value. For a multi-band image, + a tuple containing one 2-tuple for each band. + """ + + self.load() + if self.im.bands > 1: + extrema = [] + for i in range(self.im.bands): + extrema.append(self.im.getband(i).getextrema()) + return tuple(extrema) + return self.im.getextrema() + + def getim(self): + """ + Returns a capsule that points to the internal image memory. + + :returns: A capsule object. + """ + + self.load() + return self.im.ptr + + def getpalette(self): + """ + Returns the image palette as a list. + + :returns: A list of color values [r, g, b, ...], or None if the + image has no palette. + """ + + self.load() + try: + if py3: + return list(self.im.getpalette()) + else: + return [i8(c) for c in self.im.getpalette()] + except ValueError: + return None # no palette + + def getpixel(self, xy): + """ + Returns the pixel value at a given position. + + :param xy: The coordinate, given as (x, y). See + :ref:`coordinate-system`. + :returns: The pixel value. If the image is a multi-layer image, + this method returns a tuple. + """ + + self.load() + if self.pyaccess: + return self.pyaccess.getpixel(xy) + return self.im.getpixel(xy) + + def getprojection(self): + """ + Get projection to x and y axes + + :returns: Two sequences, indicating where there are non-zero + pixels along the X-axis and the Y-axis, respectively. + """ + + self.load() + x, y = self.im.getprojection() + return [i8(c) for c in x], [i8(c) for c in y] + + def histogram(self, mask=None, extrema=None): + """ + Returns a histogram for the image. The histogram is returned as + a list of pixel counts, one for each pixel value in the source + image. If the image has more than one band, the histograms for + all bands are concatenated (for example, the histogram for an + "RGB" image contains 768 values). + + A bilevel image (mode "1") is treated as a greyscale ("L") image + by this method. + + If a mask is provided, the method returns a histogram for those + parts of the image where the mask image is non-zero. The mask + image must have the same size as the image, and be either a + bi-level image (mode "1") or a greyscale image ("L"). + + :param mask: An optional mask. + :returns: A list containing pixel counts. + """ + self.load() + if mask: + mask.load() + return self.im.histogram((0, 0), mask.im) + if self.mode in ("I", "F"): + if extrema is None: + extrema = self.getextrema() + return self.im.histogram(extrema) + return self.im.histogram() + + def offset(self, xoffset, yoffset=None): + raise NotImplementedError("offset() has been removed. " + "Please call ImageChops.offset() instead.") + + def paste(self, im, box=None, mask=None): + """ + Pastes another image into this image. The box argument is either + a 2-tuple giving the upper left corner, a 4-tuple defining the + left, upper, right, and lower pixel coordinate, or None (same as + (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size + of the pasted image must match the size of the region. + + If the modes don't match, the pasted image is converted to the mode of + this image (see the :py:meth:`~PIL.Image.Image.convert` method for + details). + + Instead of an image, the source can be a integer or tuple + containing pixel values. The method then fills the region + with the given color. When creating RGB images, you can + also use color strings as supported by the ImageColor module. + + If a mask is given, this method updates only the regions + indicated by the mask. You can use either "1", "L" or "RGBA" + images (in the latter case, the alpha band is used as mask). + Where the mask is 255, the given image is copied as is. Where + the mask is 0, the current value is preserved. Intermediate + values will mix the two images together, including their alpha + channels if they have them. + + See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to + combine images with respect to their alpha channels. + + :param im: Source image or pixel value (integer or tuple). + :param box: An optional 4-tuple giving the region to paste into. + If a 2-tuple is used instead, it's treated as the upper left + corner. If omitted or None, the source is pasted into the + upper left corner. + + If an image is given as the second argument and there is no + third, the box defaults to (0, 0), and the second argument + is interpreted as a mask image. + :param mask: An optional mask image. + """ + + if isImageType(box) and mask is None: + # abbreviated paste(im, mask) syntax + mask = box + box = None + + if box is None: + box = (0, 0) + + if len(box) == 2: + # upper left corner given; get size from image or mask + if isImageType(im): + size = im.size + elif isImageType(mask): + size = mask.size + else: + # FIXME: use self.size here? + raise ValueError( + "cannot determine region size; use 4-item box" + ) + box += (box[0]+size[0], box[1]+size[1]) + + if isStringType(im): + from . import ImageColor + im = ImageColor.getcolor(im, self.mode) + + elif isImageType(im): + im.load() + if self.mode != im.mode: + if self.mode != "RGB" or im.mode not in ("RGBA", "RGBa"): + # should use an adapter for this! + im = im.convert(self.mode) + im = im.im + + self._ensure_mutable() + + if mask: + mask.load() + self.im.paste(im, box, mask.im) + else: + self.im.paste(im, box) + + def alpha_composite(self, im, dest=(0, 0), source=(0, 0)): + """ 'In-place' analog of Image.alpha_composite. Composites an image + onto this image. + + :param im: image to composite over this one + :param dest: Optional 2 tuple (left, top) specifying the upper + left corner in this (destination) image. + :param source: Optional 2 (left, top) tuple for the upper left + corner in the overlay source image, or 4 tuple (left, top, right, + bottom) for the bounds of the source rectangle + + Performance Note: Not currently implemented in-place in the core layer. + """ + + if not isinstance(source, (list, tuple)): + raise ValueError("Source must be a tuple") + if not isinstance(dest, (list, tuple)): + raise ValueError("Destination must be a tuple") + if not len(source) in (2, 4): + raise ValueError("Source must be a 2 or 4-tuple") + if not len(dest) == 2: + raise ValueError("Destination must be a 2-tuple") + if min(source) < 0: + raise ValueError("Source must be non-negative") + if min(dest) < 0: + raise ValueError("Destination must be non-negative") + + if len(source) == 2: + source = source + im.size + + # over image, crop if it's not the whole thing. + if source == (0, 0) + im.size: + overlay = im + else: + overlay = im.crop(source) + + # target for the paste + box = dest + (dest[0] + overlay.width, dest[1] + overlay.height) + + # destination image. don't copy if we're using the whole image. + if box == (0, 0) + self.size: + background = self + else: + background = self.crop(box) + + result = alpha_composite(background, overlay) + self.paste(result, box) + + def point(self, lut, mode=None): + """ + Maps this image through a lookup table or function. + + :param lut: A lookup table, containing 256 (or 65536 if + self.mode=="I" and mode == "L") values per band in the + image. A function can be used instead, it should take a + single argument. The function is called once for each + possible pixel value, and the resulting table is applied to + all bands of the image. + :param mode: Output mode (default is same as input). In the + current version, this can only be used if the source image + has mode "L" or "P", and the output has mode "1" or the + source image mode is "I" and the output mode is "L". + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + self.load() + + if isinstance(lut, ImagePointHandler): + return lut.point(self) + + if callable(lut): + # if it isn't a list, it should be a function + if self.mode in ("I", "I;16", "F"): + # check if the function can be used with point_transform + # UNDONE wiredfool -- I think this prevents us from ever doing + # a gamma function point transform on > 8bit images. + scale, offset = _getscaleoffset(lut) + return self._new(self.im.point_transform(scale, offset)) + # for other modes, convert the function to a table + lut = [lut(i) for i in range(256)] * self.im.bands + + if self.mode == "F": + # FIXME: _imaging returns a confusing error message for this case + raise ValueError("point operation not supported for this mode") + + return self._new(self.im.point(lut, mode)) + + def putalpha(self, alpha): + """ + Adds or replaces the alpha layer in this image. If the image + does not have an alpha layer, it's converted to "LA" or "RGBA". + The new layer must be either "L" or "1". + + :param alpha: The new alpha layer. This can either be an "L" or "1" + image having the same size as this image, or an integer or + other color value. + """ + + self._ensure_mutable() + + if self.mode not in ("LA", "RGBA"): + # attempt to promote self to a matching alpha mode + try: + mode = getmodebase(self.mode) + "A" + try: + self.im.setmode(mode) + except (AttributeError, ValueError): + # do things the hard way + im = self.im.convert(mode) + if im.mode not in ("LA", "RGBA"): + raise ValueError # sanity check + self.im = im + self.pyaccess = None + self.mode = self.im.mode + except (KeyError, ValueError): + raise ValueError("illegal image mode") + + if self.mode == "LA": + band = 1 + else: + band = 3 + + if isImageType(alpha): + # alpha layer + if alpha.mode not in ("1", "L"): + raise ValueError("illegal image mode") + alpha.load() + if alpha.mode == "1": + alpha = alpha.convert("L") + else: + # constant alpha + try: + self.im.fillband(band, alpha) + except (AttributeError, ValueError): + # do things the hard way + alpha = new("L", self.size, alpha) + else: + return + + self.im.putband(alpha.im, band) + + def putdata(self, data, scale=1.0, offset=0.0): + """ + Copies pixel data to this image. This method copies data from a + sequence object into the image, starting at the upper left + corner (0, 0), and continuing until either the image or the + sequence ends. The scale and offset values are used to adjust + the sequence values: **pixel = value*scale + offset**. + + :param data: A sequence object. + :param scale: An optional scale value. The default is 1.0. + :param offset: An optional offset value. The default is 0.0. + """ + + self._ensure_mutable() + + self.im.putdata(data, scale, offset) + + def putpalette(self, data, rawmode="RGB"): + """ + Attaches a palette to this image. The image must be a "P" or + "L" image, and the palette sequence must contain 768 integer + values, where each group of three values represent the red, + green, and blue values for the corresponding pixel + index. Instead of an integer sequence, you can use an 8-bit + string. + + :param data: A palette sequence (either a list or a string). + :param rawmode: The raw mode of the palette. + """ + from . import ImagePalette + + if self.mode not in ("L", "P"): + raise ValueError("illegal image mode") + self.load() + if isinstance(data, ImagePalette.ImagePalette): + palette = ImagePalette.raw(data.rawmode, data.palette) + else: + if not isinstance(data, bytes): + if py3: + data = bytes(data) + else: + data = "".join(chr(x) for x in data) + palette = ImagePalette.raw(rawmode, data) + self.mode = "P" + self.palette = palette + self.palette.mode = "RGB" + self.load() # install new palette + + def putpixel(self, xy, value): + """ + Modifies the pixel at the given position. The color is given as + a single numerical value for single-band images, and a tuple for + multi-band images. + + Note that this method is relatively slow. For more extensive changes, + use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` + module instead. + + See: + + * :py:meth:`~PIL.Image.Image.paste` + * :py:meth:`~PIL.Image.Image.putdata` + * :py:mod:`~PIL.ImageDraw` + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :param value: The pixel value. + """ + + if self.readonly: + self._copy() + self.load() + + if self.pyaccess: + return self.pyaccess.putpixel(xy, value) + return self.im.putpixel(xy, value) + + def remap_palette(self, dest_map, source_palette=None): + """ + Rewrites the image to reorder the palette. + + :param dest_map: A list of indexes into the original palette. + e.g. [1,0] would swap a two item palette, and list(range(255)) + is the identity transform. + :param source_palette: Bytes or None. + :returns: An :py:class:`~PIL.Image.Image` object. + + """ + from . import ImagePalette + + if self.mode not in ("L", "P"): + raise ValueError("illegal image mode") + + if source_palette is None: + if self.mode == "P": + real_source_palette = self.im.getpalette("RGB")[:768] + else: # L-mode + real_source_palette = bytearray(i//3 for i in range(768)) + else: + real_source_palette = source_palette + + palette_bytes = b"" + new_positions = [0]*256 + + # pick only the used colors from the palette + for i, oldPosition in enumerate(dest_map): + palette_bytes += real_source_palette[oldPosition*3:oldPosition*3+3] + new_positions[oldPosition] = i + + # replace the palette color id of all pixel with the new id + + # Palette images are [0..255], mapped through a 1 or 3 + # byte/color map. We need to remap the whole image + # from palette 1 to palette 2. New_positions is + # an array of indexes into palette 1. Palette 2 is + # palette 1 with any holes removed. + + # We're going to leverage the convert mechanism to use the + # C code to remap the image from palette 1 to palette 2, + # by forcing the source image into 'L' mode and adding a + # mapping 'L' mode palette, then converting back to 'L' + # sans palette thus converting the image bytes, then + # assigning the optimized RGB palette. + + # perf reference, 9500x4000 gif, w/~135 colors + # 14 sec prepatch, 1 sec postpatch with optimization forced. + + mapping_palette = bytearray(new_positions) + + m_im = self.copy() + m_im.mode = 'P' + + m_im.palette = ImagePalette.ImagePalette("RGB", + palette=mapping_palette*3, + size=768) + # possibly set palette dirty, then + # m_im.putpalette(mapping_palette, 'L') # converts to 'P' + # or just force it. + # UNDONE -- this is part of the general issue with palettes + m_im.im.putpalette(*m_im.palette.getdata()) + + m_im = m_im.convert('L') + + # Internally, we require 768 bytes for a palette. + new_palette_bytes = (palette_bytes + + (768 - len(palette_bytes)) * b'\x00') + m_im.putpalette(new_palette_bytes) + m_im.palette = ImagePalette.ImagePalette("RGB", + palette=palette_bytes, + size=len(palette_bytes)) + + return m_im + + def resize(self, size, resample=NEAREST, box=None): + """ + Returns a resized copy of this image. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param resample: An optional resampling filter. This can be + one of :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BOX`, + :py:attr:`PIL.Image.BILINEAR`, :py:attr:`PIL.Image.HAMMING`, + :py:attr:`PIL.Image.BICUBIC` or :py:attr:`PIL.Image.LANCZOS`. + If omitted, or if the image has mode "1" or "P", it is + set :py:attr:`PIL.Image.NEAREST`. + See: :ref:`concept-filters`. + :param box: An optional 4-tuple of floats giving the region + of the source image which should be scaled. + The values should be within (0, 0, width, height) rectangle. + If omitted or None, the entire source is used. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if resample not in ( + NEAREST, BILINEAR, BICUBIC, LANCZOS, BOX, HAMMING, + ): + raise ValueError("unknown resampling filter") + + size = tuple(size) + + if box is None: + box = (0, 0) + self.size + else: + box = tuple(box) + + if self.size == size and box == (0, 0) + self.size: + return self.copy() + + if self.mode in ("1", "P"): + resample = NEAREST + + if self.mode == 'LA': + return self.convert('La').resize(size, resample, box).convert('LA') + + if self.mode == 'RGBA': + return self.convert('RGBa').resize(size, resample, box).convert('RGBA') + + self.load() + + return self._new(self.im.resize(size, resample, box)) + + def rotate(self, angle, resample=NEAREST, expand=0, center=None, + translate=None, fillcolor=None): + """ + Returns a rotated copy of this image. This method returns a + copy of this image, rotated the given number of degrees counter + clockwise around its centre. + + :param angle: In degrees counter clockwise. + :param resample: An optional resampling filter. This can be + one of :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), + :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:attr:`PIL.Image.BICUBIC` + (cubic spline interpolation in a 4x4 environment). + If omitted, or if the image has mode "1" or "P", it is + set :py:attr:`PIL.Image.NEAREST`. See :ref:`concept-filters`. + :param expand: Optional expansion flag. If true, expands the output + image to make it large enough to hold the entire rotated image. + If false or omitted, make the output image the same size as the + input image. Note that the expand flag assumes rotation around + the center and no translation. + :param center: Optional center of rotation (a 2-tuple). Origin is + the upper left corner. Default is the center of the image. + :param translate: An optional post-rotate translation (a 2-tuple). + :param fillcolor: An optional color for area outside the rotated image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + angle = angle % 360.0 + + # Fast paths regardless of filter, as long as we're not + # translating or changing the center. + if not (center or translate): + if angle == 0: + return self.copy() + if angle == 180: + return self.transpose(ROTATE_180) + if angle == 90 and expand: + return self.transpose(ROTATE_90) + if angle == 270 and expand: + return self.transpose(ROTATE_270) + + # Calculate the affine matrix. Note that this is the reverse + # transformation (from destination image to source) because we + # want to interpolate the (discrete) destination pixel from + # the local area around the (floating) source pixel. + + # The matrix we actually want (note that it operates from the right): + # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) + # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) + # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) + + # The reverse matrix is thus: + # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) + # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) + # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) + + # In any case, the final translation may be updated at the end to + # compensate for the expand flag. + + w, h = self.size + + if translate is None: + post_trans = (0, 0) + else: + post_trans = translate + if center is None: + rotn_center = (w / 2.0, h / 2.0) # FIXME These should be rounded to ints? + else: + rotn_center = center + + angle = - math.radians(angle) + matrix = [ + round(math.cos(angle), 15), round(math.sin(angle), 15), 0.0, + round(-math.sin(angle), 15), round(math.cos(angle), 15), 0.0 + ] + + def transform(x, y, matrix): + (a, b, c, d, e, f) = matrix + return a*x + b*y + c, d*x + e*y + f + + matrix[2], matrix[5] = transform(-rotn_center[0] - post_trans[0], + -rotn_center[1] - post_trans[1], matrix) + matrix[2] += rotn_center[0] + matrix[5] += rotn_center[1] + + if expand: + # calculate output size + xx = [] + yy = [] + for x, y in ((0, 0), (w, 0), (w, h), (0, h)): + x, y = transform(x, y, matrix) + xx.append(x) + yy.append(y) + nw = int(math.ceil(max(xx)) - math.floor(min(xx))) + nh = int(math.ceil(max(yy)) - math.floor(min(yy))) + + # We multiply a translation matrix from the right. Because of its + # special form, this is the same as taking the image of the + # translation vector as new translation vector. + matrix[2], matrix[5] = transform(-(nw - w) / 2.0, + -(nh - h) / 2.0, + matrix) + w, h = nw, nh + + return self.transform((w, h), AFFINE, matrix, resample, fillcolor=fillcolor) + + def save(self, fp, format=None, **params): + """ + Saves this image under the given filename. If no format is + specified, the format to use is determined from the filename + extension, if possible. + + Keyword options can be used to provide additional instructions + to the writer. If a writer doesn't recognise an option, it is + silently ignored. The available options are described in the + :doc:`image format documentation + <../handbook/image-file-formats>` for each writer. + + You can use a file object instead of a filename. In this case, + you must always specify the format. The file object must + implement the ``seek``, ``tell``, and ``write`` + methods, and be opened in binary mode. + + :param fp: A filename (string), pathlib.Path object or file object. + :param format: Optional format override. If omitted, the + format to use is determined from the filename extension. + If a file object was used instead of a filename, this + parameter should always be used. + :param params: Extra parameters to the image writer. + :returns: None + :exception KeyError: If the output format could not be determined + from the file name. Use the format option to solve this. + :exception IOError: If the file could not be written. The file + may have been created, and may contain partial data. + """ + + filename = "" + open_fp = False + if isPath(fp): + filename = fp + open_fp = True + elif HAS_PATHLIB and isinstance(fp, Path): + filename = str(fp) + open_fp = True + if not filename and hasattr(fp, "name") and isPath(fp.name): + # only set the name for metadata purposes + filename = fp.name + + # may mutate self! + self.load() + + save_all = params.pop('save_all', False) + self.encoderinfo = params + self.encoderconfig = () + + preinit() + + ext = os.path.splitext(filename)[1].lower() + + if not format: + if ext not in EXTENSION: + init() + try: + format = EXTENSION[ext] + except KeyError: + raise ValueError('unknown file extension: {}'.format(ext)) + + if format.upper() not in SAVE: + init() + if save_all: + save_handler = SAVE_ALL[format.upper()] + else: + save_handler = SAVE[format.upper()] + + if open_fp: + if params.get('append', False): + fp = builtins.open(filename, "r+b") + else: + # Open also for reading ("+"), because TIFF save_all + # writer needs to go back and edit the written data. + fp = builtins.open(filename, "w+b") + + try: + save_handler(self, fp, filename) + finally: + # do what we can to clean up + if open_fp: + fp.close() + + def seek(self, frame): + """ + Seeks to the given frame in this sequence file. If you seek + beyond the end of the sequence, the method raises an + **EOFError** exception. When a sequence file is opened, the + library automatically seeks to frame 0. + + Note that in the current version of the library, most sequence + formats only allows you to seek to the next frame. + + See :py:meth:`~PIL.Image.Image.tell`. + + :param frame: Frame number, starting at 0. + :exception EOFError: If the call attempts to seek beyond the end + of the sequence. + """ + + # overridden by file handlers + if frame != 0: + raise EOFError + + def show(self, title=None, command=None): + """ + Displays this image. This method is mainly intended for + debugging purposes. + + On Unix platforms, this method saves the image to a temporary + PPM file, and calls either the **xv** utility or the **display** + utility, depending on which one can be found. + + On macOS, this method saves the image to a temporary BMP file, and + opens it with the native Preview application. + + On Windows, it saves the image to a temporary BMP file, and uses + the standard BMP display utility to show it (usually Paint). + + :param title: Optional title to use for the image window, + where possible. + :param command: command used to show the image + """ + + _show(self, title=title, command=command) + + def split(self): + """ + Split this image into individual bands. This method returns a + tuple of individual image bands from an image. For example, + splitting an "RGB" image creates three new images each + containing a copy of one of the original bands (red, green, + blue). + + If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` + method can be more convenient and faster. + + :returns: A tuple containing bands. + """ + + self.load() + if self.im.bands == 1: + ims = [self.copy()] + else: + ims = map(self._new, self.im.split()) + return tuple(ims) + + def getchannel(self, channel): + """ + Returns an image containing a single channel of the source image. + + :param channel: What channel to return. Could be index + (0 for "R" channel of "RGB") or channel name + ("A" for alpha channel of "RGBA"). + :returns: An image in "L" mode. + + .. versionadded:: 4.3.0 + """ + self.load() + + if isStringType(channel): + try: + channel = self.getbands().index(channel) + except ValueError: + raise ValueError( + 'The image has no channel "{}"'.format(channel)) + + return self._new(self.im.getband(channel)) + + def tell(self): + """ + Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. + + :returns: Frame number, starting with 0. + """ + return 0 + + def thumbnail(self, size, resample=BICUBIC): + """ + Make this image into a thumbnail. This method modifies the + image to contain a thumbnail version of itself, no larger than + the given size. This method calculates an appropriate thumbnail + size to preserve the aspect of the image, calls the + :py:meth:`~PIL.Image.Image.draft` method to configure the file reader + (where applicable), and finally resizes the image. + + Note that this function modifies the :py:class:`~PIL.Image.Image` + object in place. If you need to use the full resolution image as well, + apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original + image. + + :param size: Requested size. + :param resample: Optional resampling filter. This can be one + of :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BILINEAR`, + :py:attr:`PIL.Image.BICUBIC`, or :py:attr:`PIL.Image.LANCZOS`. + If omitted, it defaults to :py:attr:`PIL.Image.BICUBIC`. + (was :py:attr:`PIL.Image.NEAREST` prior to version 2.5.0) + :returns: None + """ + + # preserve aspect ratio + x, y = self.size + if x > size[0]: + y = int(max(y * size[0] / x, 1)) + x = int(size[0]) + if y > size[1]: + x = int(max(x * size[1] / y, 1)) + y = int(size[1]) + size = x, y + + if size == self.size: + return + + self.draft(None, size) + + im = self.resize(size, resample) + + self.im = im.im + self.mode = im.mode + self.size = size + + self.readonly = 0 + self.pyaccess = None + + # FIXME: the different transform methods need further explanation + # instead of bloating the method docs, add a separate chapter. + def transform(self, size, method, data=None, resample=NEAREST, + fill=1, fillcolor=None): + """ + Transforms this image. This method creates a new image with the + given size, and the same mode as the original, and copies data + to the new image using the given transform. + + :param size: The output size. + :param method: The transformation method. This is one of + :py:attr:`PIL.Image.EXTENT` (cut out a rectangular subregion), + :py:attr:`PIL.Image.AFFINE` (affine transform), + :py:attr:`PIL.Image.PERSPECTIVE` (perspective transform), + :py:attr:`PIL.Image.QUAD` (map a quadrilateral to a rectangle), or + :py:attr:`PIL.Image.MESH` (map a number of source quadrilaterals + in one operation). + + It may also be an :py:class:`~PIL.Image.ImageTransformHandler` + object:: + class Example(Image.ImageTransformHandler): + def transform(size, method, data, resample, fill=1): + # Return result + + It may also be an object with a :py:meth:`~method.getdata` method + that returns a tuple supplying new **method** and **data** values:: + class Example(object): + def getdata(self): + method = Image.EXTENT + data = (0, 0, 100, 100) + return method, data + :param data: Extra data to the transformation method. + :param resample: Optional resampling filter. It can be one of + :py:attr:`PIL.Image.NEAREST` (use nearest neighbour), + :py:attr:`PIL.Image.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:attr:`PIL.Image.BICUBIC` (cubic spline + interpolation in a 4x4 environment). If omitted, or if the image + has mode "1" or "P", it is set to :py:attr:`PIL.Image.NEAREST`. + :param fill: If **method** is an + :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of + the arguments passed to it. Otherwise, it is unused. + :param fillcolor: Optional fill color for the area outside the transform + in the output image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if self.mode == 'LA': + return self.convert('La').transform( + size, method, data, resample, fill, fillcolor).convert('LA') + + if self.mode == 'RGBA': + return self.convert('RGBa').transform( + size, method, data, resample, fill, fillcolor).convert('RGBA') + + if isinstance(method, ImageTransformHandler): + return method.transform(size, self, resample=resample, fill=fill) + + if hasattr(method, "getdata"): + # compatibility w. old-style transform objects + method, data = method.getdata() + + if data is None: + raise ValueError("missing method data") + + im = new(self.mode, size, fillcolor) + if method == MESH: + # list of quads + for box, quad in data: + im.__transformer(box, self, QUAD, quad, resample, + fillcolor is None) + else: + im.__transformer((0, 0)+size, self, method, data, + resample, fillcolor is None) + + return im + + def __transformer(self, box, image, method, data, + resample=NEAREST, fill=1): + w = box[2] - box[0] + h = box[3] - box[1] + + if method == AFFINE: + data = data[0:6] + + elif method == EXTENT: + # convert extent to an affine transform + x0, y0, x1, y1 = data + xs = float(x1 - x0) / w + ys = float(y1 - y0) / h + method = AFFINE + data = (xs, 0, x0, 0, ys, y0) + + elif method == PERSPECTIVE: + data = data[0:8] + + elif method == QUAD: + # quadrilateral warp. data specifies the four corners + # given as NW, SW, SE, and NE. + nw = data[0:2] + sw = data[2:4] + se = data[4:6] + ne = data[6:8] + x0, y0 = nw + As = 1.0 / w + At = 1.0 / h + data = (x0, (ne[0]-x0)*As, (sw[0]-x0)*At, + (se[0]-sw[0]-ne[0]+x0)*As*At, + y0, (ne[1]-y0)*As, (sw[1]-y0)*At, + (se[1]-sw[1]-ne[1]+y0)*As*At) + + else: + raise ValueError("unknown transformation method") + + if resample not in (NEAREST, BILINEAR, BICUBIC): + raise ValueError("unknown resampling filter") + + image.load() + + self.load() + + if image.mode in ("1", "P"): + resample = NEAREST + + self.im.transform2(box, image.im, method, data, resample, fill) + + def transpose(self, method): + """ + Transpose image (flip or rotate in 90 degree steps) + + :param method: One of :py:attr:`PIL.Image.FLIP_LEFT_RIGHT`, + :py:attr:`PIL.Image.FLIP_TOP_BOTTOM`, :py:attr:`PIL.Image.ROTATE_90`, + :py:attr:`PIL.Image.ROTATE_180`, :py:attr:`PIL.Image.ROTATE_270`, + :py:attr:`PIL.Image.TRANSPOSE` or :py:attr:`PIL.Image.TRANSVERSE`. + :returns: Returns a flipped or rotated copy of this image. + """ + + self.load() + return self._new(self.im.transpose(method)) + + def effect_spread(self, distance): + """ + Randomly spread pixels in an image. + + :param distance: Distance to spread pixels. + """ + self.load() + return self._new(self.im.effect_spread(distance)) + + def toqimage(self): + """Returns a QImage copy of this image""" + from . import ImageQt + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.toqimage(self) + + def toqpixmap(self): + """Returns a QPixmap copy of this image""" + from . import ImageQt + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.toqpixmap(self) + + +# -------------------------------------------------------------------- +# Abstract handlers. + +class ImagePointHandler(object): + # used as a mixin by point transforms (for use with im.point) + pass + + +class ImageTransformHandler(object): + # used as a mixin by geometry transforms (for use with im.transform) + pass + + +# -------------------------------------------------------------------- +# Factories + +# +# Debugging + +def _wedge(): + """Create greyscale wedge (for debugging only)""" + + return Image()._new(core.wedge("L")) + + +def _check_size(size): + """ + Common check to enforce type and sanity check on size tuples + + :param size: Should be a 2 tuple of (width, height) + :returns: True, or raises a ValueError + """ + + if not isinstance(size, (list, tuple)): + raise ValueError("Size must be a tuple") + if len(size) != 2: + raise ValueError("Size must be a tuple of length 2") + if size[0] < 0 or size[1] < 0: + raise ValueError("Width and height must be >= 0") + + return True + + +def new(mode, size, color=0): + """ + Creates a new image with the given mode and size. + + :param mode: The mode to use for the new image. See: + :ref:`concept-modes`. + :param size: A 2-tuple, containing (width, height) in pixels. + :param color: What color to use for the image. Default is black. + If given, this should be a single integer or floating point value + for single-band modes, and a tuple for multi-band modes (one value + per band). When creating RGB images, you can also use color + strings as supported by the ImageColor module. If the color is + None, the image is not initialised. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + _check_size(size) + + if color is None: + # don't initialize + return Image()._new(core.new(mode, size)) + + if isStringType(color): + # css3-style specifier + + from . import ImageColor + color = ImageColor.getcolor(color, mode) + + return Image()._new(core.fill(mode, size, color)) + + +def frombytes(mode, size, data, decoder_name="raw", *args): + """ + Creates a copy of an image memory from pixel data in a buffer. + + In its simplest form, this function takes three arguments + (mode, size, and unpacked pixel data). + + You can also use any pixel decoder supported by PIL. For more + information on available decoders, see the section + :ref:`Writing Your Own File Decoder `. + + Note that this function decodes pixel data only, not entire images. + If you have an entire image in a string, wrap it in a + :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load + it. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A byte buffer containing raw data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + _check_size(size) + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if decoder_name == "raw" and args == (): + args = mode + + im = new(mode, size) + im.frombytes(data, decoder_name, args) + return im + + +def fromstring(*args, **kw): + raise NotImplementedError("fromstring() has been removed. " + + "Please call frombytes() instead.") + + +def frombuffer(mode, size, data, decoder_name="raw", *args): + """ + Creates an image memory referencing pixel data in a byte buffer. + + This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data + in the byte buffer, where possible. This means that changes to the + original buffer object are reflected in this image). Not all modes can + share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". + + Note that this function decodes pixel data only, not entire images. + If you have an entire image file in a string, wrap it in a + **BytesIO** object, and use :py:func:`~PIL.Image.open` to load it. + + In the current version, the default parameters used for the "raw" decoder + differs from that used for :py:func:`~PIL.Image.frombytes`. This is a + bug, and will probably be fixed in a future release. The current release + issues a warning if you do this; to disable the warning, you should provide + the full set of parameters. See below for details. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A bytes or other buffer object containing raw + data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. For the + default encoder ("raw"), it's recommended that you provide the + full set of parameters:: + + frombuffer(mode, size, data, "raw", mode, 0, 1) + + :returns: An :py:class:`~PIL.Image.Image` object. + + .. versionadded:: 1.1.4 + """ + + _check_size(size) + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if decoder_name == "raw": + if args == (): + warnings.warn( + "the frombuffer defaults may change in a future release; " + "for portability, change the call to read:\n" + " frombuffer(mode, size, data, 'raw', mode, 0, 1)", + RuntimeWarning, stacklevel=2 + ) + args = mode, 0, -1 # may change to (mode, 0, 1) post-1.1.6 + if args[0] in _MAPMODES: + im = new(mode, (1, 1)) + im = im._new( + core.map_buffer(data, size, decoder_name, None, 0, args) + ) + im.readonly = 1 + return im + + return frombytes(mode, size, data, decoder_name, args) + + +def fromarray(obj, mode=None): + """ + Creates an image memory from an object exporting the array interface + (using the buffer protocol). + + If obj is not contiguous, then the tobytes method is called + and :py:func:`~PIL.Image.frombuffer` is used. + + :param obj: Object with array interface + :param mode: Mode to use (will be determined from type if None) + See: :ref:`concept-modes`. + :returns: An image object. + + .. versionadded:: 1.1.6 + """ + arr = obj.__array_interface__ + shape = arr['shape'] + ndim = len(shape) + strides = arr.get('strides', None) + if mode is None: + try: + typekey = (1, 1) + shape[2:], arr['typestr'] + mode, rawmode = _fromarray_typemap[typekey] + except KeyError: + # print(typekey) + raise TypeError("Cannot handle this data type") + else: + rawmode = mode + if mode in ["1", "L", "I", "P", "F"]: + ndmax = 2 + elif mode == "RGB": + ndmax = 3 + else: + ndmax = 4 + if ndim > ndmax: + raise ValueError("Too many dimensions: %d > %d." % (ndim, ndmax)) + + size = shape[1], shape[0] + if strides is not None: + if hasattr(obj, 'tobytes'): + obj = obj.tobytes() + else: + obj = obj.tostring() + + return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) + + +def fromqimage(im): + """Creates an image instance from a QImage image""" + from . import ImageQt + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.fromqimage(im) + + +def fromqpixmap(im): + """Creates an image instance from a QPixmap image""" + from . import ImageQt + if not ImageQt.qt_is_installed: + raise ImportError("Qt bindings are not installed") + return ImageQt.fromqpixmap(im) + + +_fromarray_typemap = { + # (shape, typestr) => mode, rawmode + # first two members of shape are set to one + ((1, 1), "|b1"): ("1", "1;8"), + ((1, 1), "|u1"): ("L", "L"), + ((1, 1), "|i1"): ("I", "I;8"), + ((1, 1), "u2"): ("I", "I;16B"), + ((1, 1), "i2"): ("I", "I;16BS"), + ((1, 1), "u4"): ("I", "I;32B"), + ((1, 1), "i4"): ("I", "I;32BS"), + ((1, 1), "f4"): ("F", "F;32BF"), + ((1, 1), "f8"): ("F", "F;64BF"), + ((1, 1, 2), "|u1"): ("LA", "LA"), + ((1, 1, 3), "|u1"): ("RGB", "RGB"), + ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), + } + +# shortcuts +_fromarray_typemap[((1, 1), _ENDIAN + "i4")] = ("I", "I") +_fromarray_typemap[((1, 1), _ENDIAN + "f4")] = ("F", "F") + + +def _decompression_bomb_check(size): + if MAX_IMAGE_PIXELS is None: + return + + pixels = size[0] * size[1] + + if pixels > 2 * MAX_IMAGE_PIXELS: + raise DecompressionBombError( + "Image size (%d pixels) exceeds limit of %d pixels, " + "could be decompression bomb DOS attack." % + (pixels, 2 * MAX_IMAGE_PIXELS)) + + if pixels > MAX_IMAGE_PIXELS: + warnings.warn( + "Image size (%d pixels) exceeds limit of %d pixels, " + "could be decompression bomb DOS attack." % + (pixels, MAX_IMAGE_PIXELS), + DecompressionBombWarning) + + +def open(fp, mode="r"): + """ + Opens and identifies the given image file. + + This is a lazy operation; this function identifies the file, but + the file remains open and the actual image data is not read from + the file until you try to process the data (or call the + :py:meth:`~PIL.Image.Image.load` method). See + :py:func:`~PIL.Image.new`. See :ref:`file-handling`. + + :param fp: A filename (string), pathlib.Path object or a file object. + The file object must implement :py:meth:`~file.read`, + :py:meth:`~file.seek`, and :py:meth:`~file.tell` methods, + and be opened in binary mode. + :param mode: The mode. If given, this argument must be "r". + :returns: An :py:class:`~PIL.Image.Image` object. + :exception IOError: If the file cannot be found, or the image cannot be + opened and identified. + """ + + if mode != "r": + raise ValueError("bad mode %r" % mode) + + exclusive_fp = False + filename = "" + if isPath(fp): + filename = fp + elif HAS_PATHLIB and isinstance(fp, Path): + filename = str(fp.resolve()) + + if filename: + fp = builtins.open(filename, "rb") + exclusive_fp = True + + try: + fp.seek(0) + except (AttributeError, io.UnsupportedOperation): + fp = io.BytesIO(fp.read()) + exclusive_fp = True + + prefix = fp.read(16) + + preinit() + + def _open_core(fp, filename, prefix): + for i in ID: + try: + factory, accept = OPEN[i] + if not accept or accept(prefix): + fp.seek(0) + im = factory(fp, filename) + _decompression_bomb_check(im.size) + return im + except (SyntaxError, IndexError, TypeError, struct.error): + # Leave disabled by default, spams the logs with image + # opening failures that are entirely expected. + # logger.debug("", exc_info=True) + continue + return None + + im = _open_core(fp, filename, prefix) + + if im is None: + if init(): + im = _open_core(fp, filename, prefix) + + if im: + im._exclusive_fp = exclusive_fp + return im + + if exclusive_fp: + fp.close() + raise IOError("cannot identify image file %r" + % (filename if filename else fp)) + +# +# Image processing. + + +def alpha_composite(im1, im2): + """ + Alpha composite im2 over im1. + + :param im1: The first image. Must have mode RGBA. + :param im2: The second image. Must have mode RGBA, and the same size as + the first image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.alpha_composite(im1.im, im2.im)) + + +def blend(im1, im2, alpha): + """ + Creates a new image by interpolating between two input images, using + a constant alpha.:: + + out = image1 * (1.0 - alpha) + image2 * alpha + + :param im1: The first image. + :param im2: The second image. Must have the same mode and size as + the first image. + :param alpha: The interpolation alpha factor. If alpha is 0.0, a + copy of the first image is returned. If alpha is 1.0, a copy of + the second image is returned. There are no restrictions on the + alpha value. If necessary, the result is clipped to fit into + the allowed output range. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.blend(im1.im, im2.im, alpha)) + + +def composite(image1, image2, mask): + """ + Create composite image by blending images using a transparency mask. + + :param image1: The first image. + :param image2: The second image. Must have the same mode and + size as the first image. + :param mask: A mask image. This image can have mode + "1", "L", or "RGBA", and must have the same size as the + other two images. + """ + + image = image2.copy() + image.paste(image1, None, mask) + return image + + +def eval(image, *args): + """ + Applies the function (which should take one argument) to each pixel + in the given image. If the image has more than one band, the same + function is applied to each band. Note that the function is + evaluated once for each possible pixel value, so you cannot use + random components or other generators. + + :param image: The input image. + :param function: A function object, taking one integer argument. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + return image.point(args[0]) + + +def merge(mode, bands): + """ + Merge a set of single band images into a new multiband image. + + :param mode: The mode to use for the output image. See: + :ref:`concept-modes`. + :param bands: A sequence containing one single-band image for + each band in the output image. All bands must have the + same size. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if getmodebands(mode) != len(bands) or "*" in mode: + raise ValueError("wrong number of bands") + for band in bands[1:]: + if band.mode != getmodetype(mode): + raise ValueError("mode mismatch") + if band.size != bands[0].size: + raise ValueError("size mismatch") + for band in bands: + band.load() + return bands[0]._new(core.merge(mode, *[b.im for b in bands])) + + +# -------------------------------------------------------------------- +# Plugin registry + +def register_open(id, factory, accept=None): + """ + Register an image file plugin. This function should not be used + in application code. + + :param id: An image format identifier. + :param factory: An image file factory method. + :param accept: An optional function that can be used to quickly + reject images having another format. + """ + id = id.upper() + ID.append(id) + OPEN[id] = factory, accept + + +def register_mime(id, mimetype): + """ + Registers an image MIME type. This function should not be used + in application code. + + :param id: An image format identifier. + :param mimetype: The image MIME type for this format. + """ + MIME[id.upper()] = mimetype + + +def register_save(id, driver): + """ + Registers an image save function. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE[id.upper()] = driver + + +def register_save_all(id, driver): + """ + Registers an image function to save all the frames + of a multiframe format. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE_ALL[id.upper()] = driver + + +def register_extension(id, extension): + """ + Registers an image extension. This function should not be + used in application code. + + :param id: An image format identifier. + :param extension: An extension used for this format. + """ + EXTENSION[extension.lower()] = id.upper() + + +def register_extensions(id, extensions): + """ + Registers image extensions. This function should not be + used in application code. + + :param id: An image format identifier. + :param extensions: A list of extensions used for this format. + """ + for extension in extensions: + register_extension(id, extension) + + +def registered_extensions(): + """ + Returns a dictionary containing all file extensions belonging + to registered plugins + """ + if not EXTENSION: + init() + return EXTENSION + + +def register_decoder(name, decoder): + """ + Registers an image decoder. This function should not be + used in application code. + + :param name: The name of the decoder + :param decoder: A callable(mode, args) that returns an + ImageFile.PyDecoder object + + .. versionadded:: 4.1.0 + """ + DECODERS[name] = decoder + + +def register_encoder(name, encoder): + """ + Registers an image encoder. This function should not be + used in application code. + + :param name: The name of the encoder + :param encoder: A callable(mode, args) that returns an + ImageFile.PyEncoder object + + .. versionadded:: 4.1.0 + """ + ENCODERS[name] = encoder + + +# -------------------------------------------------------------------- +# Simple display support. User code may override this. + +def _show(image, **options): + # override me, as necessary + _showxv(image, **options) + + +def _showxv(image, title=None, **options): + from . import ImageShow + ImageShow.show(image, title, **options) + + +# -------------------------------------------------------------------- +# Effects + +def effect_mandelbrot(size, extent, quality): + """ + Generate a Mandelbrot set covering the given extent. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param extent: The extent to cover, as a 4-tuple: + (x0, y0, x1, y2). + :param quality: Quality. + """ + return Image()._new(core.effect_mandelbrot(size, extent, quality)) + + +def effect_noise(size, sigma): + """ + Generate Gaussian noise centered around 128. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param sigma: Standard deviation of noise. + """ + return Image()._new(core.effect_noise(size, sigma)) + + +def linear_gradient(mode): + """ + Generate 256x256 linear gradient from black to white, top to bottom. + + :param mode: Input mode. + """ + return Image()._new(core.linear_gradient(mode)) + + +def radial_gradient(mode): + """ + Generate 256x256 radial gradient from black to white, centre to edge. + + :param mode: Input mode. + """ + return Image()._new(core.radial_gradient(mode)) + + +# -------------------------------------------------------------------- +# Resources + +def _apply_env_variables(env=None): + if env is None: + env = os.environ + + for var_name, setter in [ + ('PILLOW_ALIGNMENT', core.set_alignment), + ('PILLOW_BLOCK_SIZE', core.set_block_size), + ('PILLOW_BLOCKS_MAX', core.set_blocks_max), + ]: + if var_name not in env: + continue + + var = env[var_name].lower() + + units = 1 + for postfix, mul in [('k', 1024), ('m', 1024*1024)]: + if var.endswith(postfix): + units = mul + var = var[:-len(postfix)] + + try: + var = int(var) * units + except ValueError: + warnings.warn("{0} is not int".format(var_name)) + continue + + try: + setter(var) + except ValueError as e: + warnings.warn("{0}: {1}".format(var_name, e)) + + +_apply_env_variables() +atexit.register(core.clear_cache) diff --git a/imagecrunch/PIL/ImageChops.py b/imagecrunch/PIL/ImageChops.py new file mode 100644 index 0000000..8901673 --- /dev/null +++ b/imagecrunch/PIL/ImageChops.py @@ -0,0 +1,283 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard channel operations +# +# History: +# 1996-03-24 fl Created +# 1996-08-13 fl Added logical operations (for "1" images) +# 2000-10-12 fl Added offset method (from Image.py) +# +# Copyright (c) 1997-2000 by Secret Labs AB +# Copyright (c) 1996-2000 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +def constant(image, value): + """Fill a channel with a given grey level. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.new("L", image.size, value) + + +def duplicate(image): + """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return image.copy() + + +def invert(image): + """ + Invert an image (channel). + + .. code-block:: python + + out = MAX - image + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image.load() + return image._new(image.im.chop_invert()) + + +def lighter(image1, image2): + """ + Compares the two images, pixel by pixel, and returns a new image containing + the lighter values. + + .. code-block:: python + + out = max(image1, image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_lighter(image2.im)) + + +def darker(image1, image2): + """ + Compares the two images, pixel by pixel, and returns a new image + containing the darker values. + + .. code-block:: python + + out = min(image1, image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_darker(image2.im)) + + +def difference(image1, image2): + """ + Returns the absolute value of the pixel-by-pixel difference between the two + images. + + .. code-block:: python + + out = abs(image1 - image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_difference(image2.im)) + + +def multiply(image1, image2): + """ + Superimposes two images on top of each other. + + If you multiply an image with a solid black image, the result is black. If + you multiply with a solid white image, the image is unaffected. + + .. code-block:: python + + out = image1 * image2 / MAX + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_multiply(image2.im)) + + +def screen(image1, image2): + """ + Superimposes two inverted images on top of each other. + + .. code-block:: python + + out = MAX - ((MAX - image1) * (MAX - image2) / MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_screen(image2.im)) + + +def add(image1, image2, scale=1.0, offset=0): + """ + Adds two images, dividing the result by scale and adding the + offset. If omitted, scale defaults to 1.0, and offset to 0.0. + + .. code-block:: python + + out = ((image1 + image2) / scale + offset) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_add(image2.im, scale, offset)) + + +def subtract(image1, image2, scale=1.0, offset=0): + """ + Subtracts two images, dividing the result by scale and adding the + offset. If omitted, scale defaults to 1.0, and offset to 0.0. + + .. code-block:: python + + out = ((image1 - image2) / scale + offset) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) + + +def add_modulo(image1, image2): + """Add two images, without clipping the result. + + .. code-block:: python + + out = ((image1 + image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_add_modulo(image2.im)) + + +def subtract_modulo(image1, image2): + """Subtract two images, without clipping the result. + + .. code-block:: python + + out = ((image1 - image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_subtract_modulo(image2.im)) + + +def logical_and(image1, image2): + """Logical AND between two images. + + .. code-block:: python + + out = ((image1 and image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_and(image2.im)) + + +def logical_or(image1, image2): + """Logical OR between two images. + + .. code-block:: python + + out = ((image1 or image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_or(image2.im)) + + +def logical_xor(image1, image2): + """Logical XOR between two images. + + .. code-block:: python + + out = ((bool(image1) != bool(image2)) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_xor(image2.im)) + + +def blend(image1, image2, alpha): + """Blend images using constant transparency weight. Alias for + :py:meth:`PIL.Image.Image.blend`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.blend(image1, image2, alpha) + + +def composite(image1, image2, mask): + """Create composite using transparency mask. Alias for + :py:meth:`PIL.Image.Image.composite`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.composite(image1, image2, mask) + + +def offset(image, xoffset, yoffset=None): + """Returns a copy of the image where data has been offset by the given + distances. Data wraps around the edges. If **yoffset** is omitted, it + is assumed to be equal to **xoffset**. + + :param xoffset: The horizontal distance. + :param yoffset: The vertical distance. If omitted, both + distances are set to the same value. + :rtype: :py:class:`~PIL.Image.Image` + """ + + if yoffset is None: + yoffset = xoffset + image.load() + return image._new(image.im.offset(xoffset, yoffset)) diff --git a/imagecrunch/PIL/ImageCms.py b/imagecrunch/PIL/ImageCms.py new file mode 100644 index 0000000..d82e30e --- /dev/null +++ b/imagecrunch/PIL/ImageCms.py @@ -0,0 +1,955 @@ +# The Python Imaging Library. +# $Id$ + +# Optional color management support, based on Kevin Cazabon's PyCMS +# library. + +# History: + +# 2009-03-08 fl Added to PIL. + +# Copyright (C) 2002-2003 Kevin Cazabon +# Copyright (c) 2009 by Fredrik Lundh +# Copyright (c) 2013 by Eric Soroos + +# See the README file for information on usage and redistribution. See +# below for the original description. + +from __future__ import print_function +import sys + +from PIL import Image +try: + from PIL import _imagingcms +except ImportError as ex: + # Allow error import for doc purposes, but error out when accessing + # anything in core. + from _util import deferred_error + _imagingcms = deferred_error(ex) +from PIL._util import isStringType + +DESCRIPTION = """ +pyCMS + + a Python / PIL interface to the littleCMS ICC Color Management System + Copyright (C) 2002-2003 Kevin Cazabon + kevin@cazabon.com + http://www.cazabon.com + + pyCMS home page: http://www.cazabon.com/pyCMS + littleCMS home page: http://www.littlecms.com + (littleCMS is Copyright (C) 1998-2001 Marti Maria) + + Originally released under LGPL. Graciously donated to PIL in + March 2009, for distribution under the standard PIL license + + The pyCMS.py module provides a "clean" interface between Python/PIL and + pyCMSdll, taking care of some of the more complex handling of the direct + pyCMSdll functions, as well as error-checking and making sure that all + relevant data is kept together. + + While it is possible to call pyCMSdll functions directly, it's not highly + recommended. + + Version History: + + 1.0.0 pil Oct 2013 Port to LCMS 2. + + 0.1.0 pil mod March 10, 2009 + + Renamed display profile to proof profile. The proof + profile is the profile of the device that is being + simulated, not the profile of the device which is + actually used to display/print the final simulation + (that'd be the output profile) - also see LCMSAPI.txt + input colorspace -> using 'renderingIntent' -> proof + colorspace -> using 'proofRenderingIntent' -> output + colorspace + + Added LCMS FLAGS support. + Added FLAGS["SOFTPROOFING"] as default flag for + buildProofTransform (otherwise the proof profile/intent + would be ignored). + + 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms + + 0.0.2 alpha Jan 6, 2002 + + Added try/except statements around type() checks of + potential CObjects... Python won't let you use type() + on them, and raises a TypeError (stupid, if you ask + me!) + + Added buildProofTransformFromOpenProfiles() function. + Additional fixes in DLL, see DLL code for details. + + 0.0.1 alpha first public release, Dec. 26, 2002 + + Known to-do list with current version (of Python interface, not pyCMSdll): + + none + +""" + +VERSION = "1.0.0 pil" + +# --------------------------------------------------------------------. + +core = _imagingcms + +# +# intent/direction values + +INTENT_PERCEPTUAL = 0 +INTENT_RELATIVE_COLORIMETRIC = 1 +INTENT_SATURATION = 2 +INTENT_ABSOLUTE_COLORIMETRIC = 3 + +DIRECTION_INPUT = 0 +DIRECTION_OUTPUT = 1 +DIRECTION_PROOF = 2 + +# +# flags + +FLAGS = { + "MATRIXINPUT": 1, + "MATRIXOUTPUT": 2, + "MATRIXONLY": (1 | 2), + "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot + # Don't create prelinearization tables on precalculated transforms + # (internal use): + "NOPRELINEARIZATION": 16, + "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) + "NOTCACHE": 64, # Inhibit 1-pixel cache + "NOTPRECALC": 256, + "NULLTRANSFORM": 512, # Don't transform anyway + "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy + "LOWRESPRECALC": 2048, # Use less memory to minimize resources + "WHITEBLACKCOMPENSATION": 8192, + "BLACKPOINTCOMPENSATION": 8192, + "GAMUTCHECK": 4096, # Out of Gamut alarm + "SOFTPROOFING": 16384, # Do softproofing + "PRESERVEBLACK": 32768, # Black preservation + "NODEFAULTRESOURCEDEF": 16777216, # CRD special + "GRIDPOINTS": lambda n: ((n) & 0xFF) << 16 # Gridpoints +} + +_MAX_FLAG = 0 +for flag in FLAGS.values(): + if isinstance(flag, int): + _MAX_FLAG = _MAX_FLAG | flag + + +# --------------------------------------------------------------------. +# Experimental PIL-level API +# --------------------------------------------------------------------. + +## +# Profile. + +class ImageCmsProfile(object): + + def __init__(self, profile): + """ + :param profile: Either a string representing a filename, + a file like object containing a profile or a + low-level profile object + + """ + + if isStringType(profile): + self._set(core.profile_open(profile), profile) + elif hasattr(profile, "read"): + self._set(core.profile_frombytes(profile.read())) + elif isinstance(profile, _imagingcms.CmsProfile): + self._set(profile) + else: + raise TypeError("Invalid type for Profile") + + def _set(self, profile, filename=None): + self.profile = profile + self.filename = filename + if profile: + self.product_name = None # profile.product_name + self.product_info = None # profile.product_info + else: + self.product_name = None + self.product_info = None + + def tobytes(self): + """ + Returns the profile in a format suitable for embedding in + saved images. + + :returns: a bytes object containing the ICC profile. + """ + + return core.profile_tobytes(self.profile) + + +class ImageCmsTransform(Image.ImagePointHandler): + + """ + Transform. This can be used with the procedural API, or with the standard + Image.point() method. + + Will return the output profile in the output.info['icc_profile']. + """ + + def __init__(self, input, output, input_mode, output_mode, + intent=INTENT_PERCEPTUAL, proof=None, + proof_intent=INTENT_ABSOLUTE_COLORIMETRIC, flags=0): + if proof is None: + self.transform = core.buildTransform( + input.profile, output.profile, + input_mode, output_mode, + intent, + flags + ) + else: + self.transform = core.buildProofTransform( + input.profile, output.profile, proof.profile, + input_mode, output_mode, + intent, proof_intent, + flags + ) + # Note: inputMode and outputMode are for pyCMS compatibility only + self.input_mode = self.inputMode = input_mode + self.output_mode = self.outputMode = output_mode + + self.output_profile = output + + def point(self, im): + return self.apply(im) + + def apply(self, im, imOut=None): + im.load() + if imOut is None: + imOut = Image.new(self.output_mode, im.size, None) + self.transform.apply(im.im.id, imOut.im.id) + imOut.info['icc_profile'] = self.output_profile.tobytes() + return imOut + + def apply_in_place(self, im): + im.load() + if im.mode != self.output_mode: + raise ValueError("mode mismatch") # wrong output mode + self.transform.apply(im.im.id, im.im.id) + im.info['icc_profile'] = self.output_profile.tobytes() + return im + + +def get_display_profile(handle=None): + """ (experimental) Fetches the profile for the current display device. + :returns: None if the profile is not known. + """ + + if sys.platform == "win32": + from PIL import ImageWin + if isinstance(handle, ImageWin.HDC): + profile = core.get_display_profile_win32(handle, 1) + else: + profile = core.get_display_profile_win32(handle or 0) + else: + try: + get = _imagingcms.get_display_profile + except AttributeError: + return None + else: + profile = get() + return ImageCmsProfile(profile) + + +# --------------------------------------------------------------------. +# pyCMS compatible layer +# --------------------------------------------------------------------. + +class PyCMSError(Exception): + + """ (pyCMS) Exception class. + This is used for all errors in the pyCMS API. """ + pass + + +def profileToProfile( + im, inputProfile, outputProfile, renderingIntent=INTENT_PERCEPTUAL, + outputMode=None, inPlace=0, flags=0): + """ + (pyCMS) Applies an ICC transformation to a given image, mapping from + inputProfile to outputProfile. + + If the input or output profiles specified are not valid filenames, a + PyCMSError will be raised. If inPlace == TRUE and outputMode != im.mode, + a PyCMSError will be raised. If an error occurs during application of + the profiles, a PyCMSError will be raised. If outputMode is not a mode + supported by the outputProfile (or by pyCMS), a PyCMSError will be + raised. + + This function applies an ICC transformation to im from inputProfile's + color space to outputProfile's color space using the specified rendering + intent to decide how to handle out-of-gamut colors. + + OutputMode can be used to specify that a color mode conversion is to + be done using these profiles, but the specified profiles must be able + to handle that mode. I.e., if converting im from RGB to CMYK using + profiles, the input profile must handle RGB data, and the output + profile must handle CMYK data. + + :param im: An open PIL image object (i.e. Image.new(...) or + Image.open(...), etc.) + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this image, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this image, or a profile object + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :param outputMode: A valid PIL mode for the output image (i.e. "RGB", + "CMYK", etc.). Note: if rendering the image "inPlace", outputMode + MUST be the same mode as the input, or omitted completely. If + omitted, the outputMode will be the same as the mode of the input + image (im.mode) + :param inPlace: Boolean (1 = True, None or 0 = False). If True, the + original image is modified in-place, and None is returned. If False + (default), a new Image object is returned with the transform applied. + :param flags: Integer (0-...) specifying additional flags + :returns: Either None or a new PIL image object, depending on value of + inPlace + :exception PyCMSError: + """ + + if outputMode is None: + outputMode = im.mode + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + raise PyCMSError("renderingIntent must be an integer between 0 and 3") + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + raise PyCMSError( + "flags must be an integer between 0 and %s" + _MAX_FLAG) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + transform = ImageCmsTransform( + inputProfile, outputProfile, im.mode, outputMode, + renderingIntent, flags=flags + ) + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + return imOut + + +def getOpenProfile(profileFilename): + """ + (pyCMS) Opens an ICC profile file. + + The PyCMSProfile object can be passed back into pyCMS for use in creating + transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). + + If profileFilename is not a valid filename for an ICC profile, a PyCMSError + will be raised. + + :param profileFilename: String, as a valid filename path to the ICC profile + you wish to open, or a file-like object. + :returns: A CmsProfile class object. + :exception PyCMSError: + """ + + try: + return ImageCmsProfile(profileFilename) + except (IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def buildTransform( + inputProfile, outputProfile, inMode, outMode, + renderingIntent=INTENT_PERCEPTUAL, flags=0): + """ + (pyCMS) Builds an ICC transform mapping from the inputProfile to the + outputProfile. Use applyTransform to apply the transform to a given + image. + + If the input or output profiles specified are not valid filenames, a + PyCMSError will be raised. If an error occurs during creation of the + transform, a PyCMSError will be raised. + + If inMode or outMode are not a mode supported by the outputProfile (or + by pyCMS), a PyCMSError will be raised. + + This function builds and returns an ICC transform from the inputProfile + to the outputProfile using the renderingIntent to determine what to do + with out-of-gamut colors. It will ONLY work for converting images that + are in inMode to images that are in outMode color format (PIL mode, + i.e. "RGB", "RGBA", "CMYK", etc.). + + Building the transform is a fair part of the overhead in + ImageCms.profileToProfile(), so if you're planning on converting multiple + images using the same input/output settings, this can save you time. + Once you have a transform object, it can be used with + ImageCms.applyProfile() to convert images without the need to re-compute + the lookup table for the transform. + + The reason pyCMS returns a class object rather than a handle directly + to the transform is that it needs to keep track of the PIL input/output + modes that the transform is meant for. These attributes are stored in + the "inMode" and "outMode" attributes of the object (which can be + manually overridden if you really want to, but I don't know of any + time that would be of use, or would even work). + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + raise PyCMSError("renderingIntent must be an integer between 0 and 3") + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + raise PyCMSError( + "flags must be an integer between 0 and %s" + _MAX_FLAG) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + return ImageCmsTransform( + inputProfile, outputProfile, inMode, outMode, + renderingIntent, flags=flags) + except (IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def buildProofTransform( + inputProfile, outputProfile, proofProfile, inMode, outMode, + renderingIntent=INTENT_PERCEPTUAL, + proofRenderingIntent=INTENT_ABSOLUTE_COLORIMETRIC, + flags=FLAGS["SOFTPROOFING"]): + """ + (pyCMS) Builds an ICC transform mapping from the inputProfile to the + outputProfile, but tries to simulate the result that would be + obtained on the proofProfile device. + + If the input, output, or proof profiles specified are not valid + filenames, a PyCMSError will be raised. + + If an error occurs during creation of the transform, a PyCMSError will + be raised. + + If inMode or outMode are not a mode supported by the outputProfile + (or by pyCMS), a PyCMSError will be raised. + + This function builds and returns an ICC transform from the inputProfile + to the outputProfile, but tries to simulate the result that would be + obtained on the proofProfile device using renderingIntent and + proofRenderingIntent to determine what to do with out-of-gamut + colors. This is known as "soft-proofing". It will ONLY work for + converting images that are in inMode to images that are in outMode + color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). + + Usage of the resulting transform object is exactly the same as with + ImageCms.buildTransform(). + + Proof profiling is generally used when using an output device to get a + good idea of what the final printed/displayed image would look like on + the proofProfile device when it's quicker and easier to use the + output device for judging color. Generally, this means that the + output device is a monitor, or a dye-sub printer (etc.), and the simulated + device is something more expensive, complicated, or time consuming + (making it difficult to make a real print for color judgement purposes). + + Soft-proofing basically functions by adjusting the colors on the + output device to match the colors of the device being simulated. However, + when the simulated device has a much wider gamut than the output + device, you may obtain marginal results. + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + (monitor, usually) profile you wish to use for this transform, or a + profile object + :param proofProfile: String, as a valid filename path to the ICC proof + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the input->proof (simulated) transform + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :param proofRenderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for proof->output transform + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + raise PyCMSError("renderingIntent must be an integer between 0 and 3") + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + raise PyCMSError( + "flags must be an integer between 0 and %s" + _MAX_FLAG) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + if not isinstance(proofProfile, ImageCmsProfile): + proofProfile = ImageCmsProfile(proofProfile) + return ImageCmsTransform( + inputProfile, outputProfile, inMode, outMode, renderingIntent, + proofProfile, proofRenderingIntent, flags) + except (IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +buildTransformFromOpenProfiles = buildTransform +buildProofTransformFromOpenProfiles = buildProofTransform + + +def applyTransform(im, transform, inPlace=0): + """ + (pyCMS) Applies a transform to a given image. + + If im.mode != transform.inMode, a PyCMSError is raised. + + If inPlace == TRUE and transform.inMode != transform.outMode, a + PyCMSError is raised. + + If im.mode, transfer.inMode, or transfer.outMode is not supported by + pyCMSdll or the profiles you used for the transform, a PyCMSError is + raised. + + If an error occurs while the transform is being applied, a PyCMSError + is raised. + + This function applies a pre-calculated transform (from + ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) + to an image. The transform can be used for multiple images, saving + considerable calculation time if doing the same conversion multiple times. + + If you want to modify im in-place instead of receiving a new image as + the return value, set inPlace to TRUE. This can only be done if + transform.inMode and transform.outMode are the same, because we can't + change the mode in-place (the buffer sizes for some modes are + different). The default behavior is to return a new Image object of + the same dimensions in mode transform.outMode. + + :param im: A PIL Image object, and im.mode must be the same as the inMode + supported by the transform. + :param transform: A valid CmsTransform class object + :param inPlace: Bool (1 == True, 0 or None == False). If True, im is + modified in place and None is returned, if False, a new Image object + with the transform applied is returned (and im is not changed). The + default is False. + :returns: Either None, or a new PIL Image object, depending on the value of + inPlace. The profile will be returned in the image's + info['icc_profile']. + :exception PyCMSError: + """ + + try: + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (TypeError, ValueError) as v: + raise PyCMSError(v) + + return imOut + + +def createProfile(colorSpace, colorTemp=-1): + """ + (pyCMS) Creates a profile. + + If colorSpace not in ["LAB", "XYZ", "sRGB"], a PyCMSError is raised + + If using LAB and colorTemp != a positive integer, a PyCMSError is raised. + + If an error occurs while creating the profile, a PyCMSError is raised. + + Use this function to create common profiles on-the-fly instead of + having to supply a profile on disk and knowing the path to it. It + returns a normal CmsProfile object that can be passed to + ImageCms.buildTransformFromOpenProfiles() to create a transform to apply + to images. + + :param colorSpace: String, the color space of the profile you wish to + create. + Currently only "LAB", "XYZ", and "sRGB" are supported. + :param colorTemp: Positive integer for the white point for the profile, in + degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 + illuminant if omitted (5000k). colorTemp is ONLY applied to LAB + profiles, and is ignored for XYZ and sRGB. + :returns: A CmsProfile class object + :exception PyCMSError: + """ + + if colorSpace not in ["LAB", "XYZ", "sRGB"]: + raise PyCMSError( + "Color space not supported for on-the-fly profile creation (%s)" + % colorSpace) + + if colorSpace == "LAB": + try: + colorTemp = float(colorTemp) + except: + raise PyCMSError( + "Color temperature must be numeric, \"%s\" not valid" + % colorTemp) + + try: + return core.createProfile(colorSpace, colorTemp) + except (TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileName(profile): + """ + + (pyCMS) Gets the internal product name for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised If an error occurs while trying to obtain the + name tag, a PyCMSError is raised. + + Use this function to obtain the INTERNAL name of the profile (stored + in an ICC tag in the profile itself), usually the one used when the + profile was originally created. Sometimes this tag also contains + additional information supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal name of the profile as stored + in an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # do it in python, not c. + # // name was "%s - %s" (model, manufacturer) || Description , + # // but if the Model and Manufacturer were the same or the model + # // was long, Just the model, in 1.x + model = profile.profile.product_model + manufacturer = profile.profile.product_manufacturer + + if not (model or manufacturer): + return profile.profile.product_description + "\n" + if not manufacturer or len(model) > 30: + return model + "\n" + return "%s - %s\n" % (model, manufacturer) + + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileInfo(profile): + """ + (pyCMS) Gets the internal product information for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the info tag, a PyCMSError + is raised + + Use this function to obtain the information stored in the profile's + info tag. This often contains details about the profile, and how it + was created, as supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # add an extra newline to preserve pyCMS compatibility + # Python, not C. the white point bits weren't working well, + # so skipping. + # // info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint + description = profile.profile.product_description + cpright = profile.profile.product_copyright + arr = [] + for elt in (description, cpright): + if elt: + arr.append(elt) + return "\r\n\r\n".join(arr) + "\r\n\r\n" + + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileCopyright(profile): + """ + (pyCMS) Gets the copyright for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the copyright tag, a PyCMSError + is raised + + Use this function to obtain the information stored in the profile's + copyright tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.product_copyright + "\n" + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileManufacturer(profile): + """ + (pyCMS) Gets the manufacturer for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the manufacturer tag, a + PyCMSError is raised + + Use this function to obtain the information stored in the profile's + manufacturer tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.product_manufacturer + "\n" + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileModel(profile): + """ + (pyCMS) Gets the model for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the model tag, a PyCMSError + is raised + + Use this function to obtain the information stored in the profile's + model tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.product_model + "\n" + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getProfileDescription(profile): + """ + (pyCMS) Gets the description for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the description tag, a PyCMSError + is raised + + Use this function to obtain the information stored in the profile's + description tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in an + ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.product_description + "\n" + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def getDefaultIntent(profile): + """ + (pyCMS) Gets the default intent name for the given profile. + + If profile isn't a valid CmsProfile object or filename to a profile, + a PyCMSError is raised. + + If an error occurs while trying to obtain the default intent, a + PyCMSError is raised. + + Use this function to determine the default (and usually best optimized) + rendering intent for this profile. Most profiles support multiple + rendering intents, but are intended mostly for one type of conversion. + If you wish to use a different intent than returned, use + ImageCms.isIntentSupported() to verify it will work first. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: Integer 0-3 specifying the default rendering intent for this + profile. + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.rendering_intent + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def isIntentSupported(profile, intent, direction): + """ + (pyCMS) Checks if a given intent is supported. + + Use this function to verify that you can use your desired + renderingIntent with profile, and that profile can be used for the + input/output/proof profile as you desire. + + Some profiles are created specifically for one "direction", can cannot + be used for others. Some profiles can only be used for certain + rendering intents... so it's best to either verify this before trying + to create a transform with them (using this function), or catch the + potential PyCMSError that will occur if they don't support the modes + you select. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :param intent: Integer (0-3) specifying the rendering intent you wish to + use with this profile + + INTENT_PERCEPTUAL = 0 (DEFAULT) (ImageCms.INTENT_PERCEPTUAL) + INTENT_RELATIVE_COLORIMETRIC = 1 (ImageCms.INTENT_RELATIVE_COLORIMETRIC) + INTENT_SATURATION = 2 (ImageCms.INTENT_SATURATION) + INTENT_ABSOLUTE_COLORIMETRIC = 3 (ImageCms.INTENT_ABSOLUTE_COLORIMETRIC) + + see the pyCMS documentation for details on rendering intents and what + they do. + :param direction: Integer specifying if the profile is to be used for input, + output, or proof + + INPUT = 0 (or use ImageCms.DIRECTION_INPUT) + OUTPUT = 1 (or use ImageCms.DIRECTION_OUTPUT) + PROOF = 2 (or use ImageCms.DIRECTION_PROOF) + + :returns: 1 if the intent/direction are supported, -1 if they are not. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # FIXME: I get different results for the same data w. different + # compilers. Bug in LittleCMS or in the binding? + if profile.profile.is_intent_supported(intent, direction): + return 1 + else: + return -1 + except (AttributeError, IOError, TypeError, ValueError) as v: + raise PyCMSError(v) + + +def versions(): + """ + (pyCMS) Fetches versions. + """ + + return ( + VERSION, core.littlecms_version, + sys.version.split()[0], Image.VERSION + ) diff --git a/imagecrunch/PIL/ImageColor.py b/imagecrunch/PIL/ImageColor.py new file mode 100644 index 0000000..08c00fd --- /dev/null +++ b/imagecrunch/PIL/ImageColor.py @@ -0,0 +1,309 @@ +# +# The Python Imaging Library +# $Id$ +# +# map CSS3-style colour description strings to RGB +# +# History: +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-15 fl Added RGBA support +# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 +# 2004-07-19 fl Fixed gray/grey spelling issues +# 2009-03-05 fl Fixed rounding error in grayscale calculation +# +# Copyright (c) 2002-2004 by Secret Labs AB +# Copyright (c) 2002-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image +import re + + +def getrgb(color): + """ + Convert a color string to an RGB tuple. If the string cannot be parsed, + this function raises a :py:exc:`ValueError` exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :return: ``(red, green, blue[, alpha])`` + """ + color = color.lower() + + rgb = colormap.get(color, None) + if rgb: + if isinstance(rgb, tuple): + return rgb + colormap[color] = rgb = getrgb(rgb) + return rgb + + # check for known string formats + if re.match('#[a-f0-9]{3}$', color): + return ( + int(color[1]*2, 16), + int(color[2]*2, 16), + int(color[3]*2, 16), + ) + + if re.match('#[a-f0-9]{4}$', color): + return ( + int(color[1]*2, 16), + int(color[2]*2, 16), + int(color[3]*2, 16), + int(color[4]*2, 16), + ) + + if re.match('#[a-f0-9]{6}$', color): + return ( + int(color[1:3], 16), + int(color[3:5], 16), + int(color[5:7], 16), + ) + + if re.match('#[a-f0-9]{8}$', color): + return ( + int(color[1:3], 16), + int(color[3:5], 16), + int(color[5:7], 16), + int(color[7:9], 16), + ) + + m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) + if m: + return ( + int(m.group(1)), + int(m.group(2)), + int(m.group(3)) + ) + + m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) + if m: + return ( + int((int(m.group(1)) * 255) / 100.0 + 0.5), + int((int(m.group(2)) * 255) / 100.0 + 0.5), + int((int(m.group(3)) * 255) / 100.0 + 0.5) + ) + + m = re.match(r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color) + if m: + from colorsys import hls_to_rgb + rgb = hls_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(3)) / 100.0, + float(m.group(2)) / 100.0, + ) + return ( + int(rgb[0] * 255 + 0.5), + int(rgb[1] * 255 + 0.5), + int(rgb[2] * 255 + 0.5) + ) + + m = re.match(r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color) + if m: + from colorsys import hsv_to_rgb + rgb = hsv_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(2)) / 100.0, + float(m.group(3)) / 100.0, + ) + return ( + int(rgb[0] * 255 + 0.5), + int(rgb[1] * 255 + 0.5), + int(rgb[2] * 255 + 0.5) + ) + + m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", + color) + if m: + return ( + int(m.group(1)), + int(m.group(2)), + int(m.group(3)), + int(m.group(4)) + ) + raise ValueError("unknown color specifier: %r" % color) + + +def getcolor(color, mode): + """ + Same as :py:func:`~PIL.ImageColor.getrgb`, but converts the RGB value to a + greyscale value if the mode is not color or a palette image. If the string + cannot be parsed, this function raises a :py:exc:`ValueError` exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :return: ``(graylevel [, alpha]) or (red, green, blue[, alpha])`` + """ + # same as getrgb, but converts the result to the given mode + color, alpha = getrgb(color), 255 + if len(color) == 4: + color, alpha = color[0:3], color[3] + + if Image.getmodebase(mode) == "L": + r, g, b = color + color = (r*299 + g*587 + b*114)//1000 + if mode[-1] == 'A': + return (color, alpha) + else: + if mode[-1] == 'A': + return color + (alpha,) + return color + + +colormap = { + # X11 colour table from https://drafts.csswg.org/css-color-4/, with + # gray/grey spelling issues fixed. This is a superset of HTML 4.0 + # colour names used in CSS 1. + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgrey": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkslategrey": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dimgrey": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "grey": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgreen": "#90ee90", + "lightgray": "#d3d3d3", + "lightgrey": "#d3d3d3", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightslategrey": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370db", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#db7093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "rebeccapurple": "#663399", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "slategrey": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", +} diff --git a/imagecrunch/PIL/ImageDraw.py b/imagecrunch/PIL/ImageDraw.py new file mode 100644 index 0000000..5bc8902 --- /dev/null +++ b/imagecrunch/PIL/ImageDraw.py @@ -0,0 +1,387 @@ +# +# The Python Imaging Library +# $Id$ +# +# drawing interface operations +# +# History: +# 1996-04-13 fl Created (experimental) +# 1996-08-07 fl Filled polygons, ellipses. +# 1996-08-13 fl Added text support +# 1998-06-28 fl Handle I and F images +# 1998-12-29 fl Added arc; use arc primitive to draw ellipses +# 1999-01-10 fl Added shape stuff (experimental) +# 1999-02-06 fl Added bitmap support +# 1999-02-11 fl Changed all primitives to take options +# 1999-02-20 fl Fixed backwards compatibility +# 2000-10-12 fl Copy on write, when necessary +# 2001-02-18 fl Use default ink for bitmap/text also in fill mode +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing +# 2002-12-11 fl Refactored low-level drawing API (work in progress) +# 2004-08-26 fl Made Draw() a factory function, added getdraw() support +# 2004-09-04 fl Added width support to line primitive +# 2004-09-10 fl Added font mode handling +# 2006-06-19 fl Added font bearing support (getmask2) +# +# Copyright (c) 1997-2006 by Secret Labs AB +# Copyright (c) 1996-2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import numbers + +from . import Image, ImageColor +from ._util import isStringType + +""" +A simple 2D drawing interface for PIL images. +

+Application code should use the Draw factory, instead of +directly. +""" + + +class ImageDraw(object): + + def __init__(self, im, mode=None): + """ + Create a drawing instance. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + im.load() + if im.readonly: + im._copy() # make it writeable + blend = 0 + if mode is None: + mode = im.mode + if mode != im.mode: + if mode == "RGBA" and im.mode == "RGB": + blend = 1 + else: + raise ValueError("mode mismatch") + if mode == "P": + self.palette = im.palette + else: + self.palette = None + self.im = im.im + self.draw = Image.core.draw(self.im, blend) + self.mode = mode + if mode in ("I", "F"): + self.ink = self.draw.draw_ink(1, mode) + else: + self.ink = self.draw.draw_ink(-1, mode) + if mode in ("1", "P", "I", "F"): + # FIXME: fix Fill2 to properly support matte for I+F images + self.fontmode = "1" + else: + self.fontmode = "L" # aliasing is okay for other modes + self.fill = 0 + self.font = None + + def getfont(self): + """ + Get the current default font. + + :returns: An image font.""" + if not self.font: + # FIXME: should add a font repository + from . import ImageFont + self.font = ImageFont.load_default() + return self.font + + def _getink(self, ink, fill=None): + if ink is None and fill is None: + if self.fill: + fill = self.ink + else: + ink = self.ink + else: + if ink is not None: + if isStringType(ink): + ink = ImageColor.getcolor(ink, self.mode) + if self.palette and not isinstance(ink, numbers.Number): + ink = self.palette.getcolor(ink) + ink = self.draw.draw_ink(ink, self.mode) + if fill is not None: + if isStringType(fill): + fill = ImageColor.getcolor(fill, self.mode) + if self.palette and not isinstance(fill, numbers.Number): + fill = self.palette.getcolor(fill) + fill = self.draw.draw_ink(fill, self.mode) + return ink, fill + + def arc(self, xy, start, end, fill=None): + """Draw an arc.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_arc(xy, start, end, ink) + + def bitmap(self, xy, bitmap, fill=None): + """Draw a bitmap.""" + bitmap.load() + ink, fill = self._getink(fill) + if ink is None: + ink = fill + if ink is not None: + self.draw.draw_bitmap(xy, bitmap.im, ink) + + def chord(self, xy, start, end, fill=None, outline=None): + """Draw a chord.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_chord(xy, start, end, fill, 1) + if ink is not None: + self.draw.draw_chord(xy, start, end, ink, 0) + + def ellipse(self, xy, fill=None, outline=None): + """Draw an ellipse.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_ellipse(xy, fill, 1) + if ink is not None: + self.draw.draw_ellipse(xy, ink, 0) + + def line(self, xy, fill=None, width=0): + """Draw a line, or a connected sequence of line segments.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_lines(xy, ink, width) + + def shape(self, shape, fill=None, outline=None): + """(Experimental) Draw a shape.""" + shape.close() + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_outline(shape, fill, 1) + if ink is not None: + self.draw.draw_outline(shape, ink, 0) + + def pieslice(self, xy, start, end, fill=None, outline=None): + """Draw a pieslice.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_pieslice(xy, start, end, fill, 1) + if ink is not None: + self.draw.draw_pieslice(xy, start, end, ink, 0) + + def point(self, xy, fill=None): + """Draw one or more individual pixels.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_points(xy, ink) + + def polygon(self, xy, fill=None, outline=None): + """Draw a polygon.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_polygon(xy, fill, 1) + if ink is not None: + self.draw.draw_polygon(xy, ink, 0) + + def rectangle(self, xy, fill=None, outline=None): + """Draw a rectangle.""" + ink, fill = self._getink(outline, fill) + if fill is not None: + self.draw.draw_rectangle(xy, fill, 1) + if ink is not None: + self.draw.draw_rectangle(xy, ink, 0) + + def _multiline_check(self, text): + """Draw text.""" + split_character = "\n" if isinstance(text, str) else b"\n" + + return split_character in text + + def _multiline_split(self, text): + split_character = "\n" if isinstance(text, str) else b"\n" + + return text.split(split_character) + + def text(self, xy, text, fill=None, font=None, anchor=None, + *args, **kwargs): + if self._multiline_check(text): + return self.multiline_text(xy, text, fill, font, anchor, + *args, **kwargs) + ink, fill = self._getink(fill) + if font is None: + font = self.getfont() + if ink is None: + ink = fill + if ink is not None: + try: + mask, offset = font.getmask2(text, self.fontmode, *args, **kwargs) + xy = xy[0] + offset[0], xy[1] + offset[1] + except AttributeError: + try: + mask = font.getmask(text, self.fontmode, *args, **kwargs) + except TypeError: + mask = font.getmask(text) + self.draw.draw_bitmap(xy, mask, ink) + + def multiline_text(self, xy, text, fill=None, font=None, anchor=None, + spacing=4, align="left", direction=None, features=None): + widths = [] + max_width = 0 + lines = self._multiline_split(text) + line_spacing = self.textsize('A', font=font)[1] + spacing + for line in lines: + line_width, line_height = self.textsize(line, font) + widths.append(line_width) + max_width = max(max_width, line_width) + left, top = xy + for idx, line in enumerate(lines): + if align == "left": + pass # left = x + elif align == "center": + left += (max_width - widths[idx]) / 2.0 + elif align == "right": + left += (max_width - widths[idx]) + else: + assert False, 'align must be "left", "center" or "right"' + self.text((left, top), line, fill, font, anchor, + direction=direction, features=features) + top += line_spacing + left = xy[0] + + def textsize(self, text, font=None, spacing=4, direction=None, + features=None): + """Get the size of a given string, in pixels.""" + if self._multiline_check(text): + return self.multiline_textsize(text, font, spacing, + direction, features) + + if font is None: + font = self.getfont() + return font.getsize(text, direction, features) + + def multiline_textsize(self, text, font=None, spacing=4, direction=None, + features=None): + max_width = 0 + lines = self._multiline_split(text) + line_spacing = self.textsize('A', font=font)[1] + spacing + for line in lines: + line_width, line_height = self.textsize(line, font, spacing, + direction, features) + max_width = max(max_width, line_width) + return max_width, len(lines)*line_spacing - spacing + + +def Draw(im, mode=None): + """ + A simple 2D drawing interface for PIL images. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + try: + return im.getdraw(mode) + except AttributeError: + return ImageDraw(im, mode) + + +# experimental access to the outline API +try: + Outline = Image.core.outline +except AttributeError: + Outline = None + + +def getdraw(im=None, hints=None): + """ + (Experimental) A more advanced 2D drawing interface for PIL images, + based on the WCK interface. + + :param im: The image to draw in. + :param hints: An optional list of hints. + :returns: A (drawing context, drawing resource factory) tuple. + """ + # FIXME: this needs more work! + # FIXME: come up with a better 'hints' scheme. + handler = None + if not hints or "nicest" in hints: + try: + from . import _imagingagg as handler + except ImportError: + pass + if handler is None: + from . import ImageDraw2 as handler + if im: + im = handler.Draw(im) + return im, handler + + +def floodfill(image, xy, value, border=None, thresh=0): + """ + (experimental) Fills a bounded region with a given color. + + :param image: Target image. + :param xy: Seed position (a 2-item coordinate tuple). See + :ref:`coordinate-system`. + :param value: Fill color. + :param border: Optional border value. If given, the region consists of + pixels with a color different from the border color. If not given, + the region consists of pixels having the same color as the seed + pixel. + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in + order for it to be replaced. Useful for filling regions of non- + homogeneous, but similar, colors. + """ + # based on an implementation by Eric S. Raymond + pixel = image.load() + x, y = xy + try: + background = pixel[x, y] + if _color_diff(value, background) <= thresh: + return # seed point already has fill color + pixel[x, y] = value + except (ValueError, IndexError): + return # seed point outside image + edge = [(x, y)] + if border is None: + while edge: + newedge = [] + for (x, y) in edge: + for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): + try: + p = pixel[s, t] + except IndexError: + pass + else: + if _color_diff(p, background) <= thresh: + pixel[s, t] = value + newedge.append((s, t)) + edge = newedge + else: + while edge: + newedge = [] + for (x, y) in edge: + for (s, t) in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)): + try: + p = pixel[s, t] + except IndexError: + pass + else: + if p != value and p != border: + pixel[s, t] = value + newedge.append((s, t)) + edge = newedge + + +def _color_diff(rgb1, rgb2): + """ + Uses 1-norm distance to calculate difference between two rgb values. + """ + return abs(rgb1[0]-rgb2[0]) + abs(rgb1[1]-rgb2[1]) + abs(rgb1[2]-rgb2[2]) diff --git a/imagecrunch/PIL/ImageDraw2.py b/imagecrunch/PIL/ImageDraw2.py new file mode 100644 index 0000000..f7902b0 --- /dev/null +++ b/imagecrunch/PIL/ImageDraw2.py @@ -0,0 +1,108 @@ +# +# The Python Imaging Library +# $Id$ +# +# WCK-style drawing interface operations +# +# History: +# 2003-12-07 fl created +# 2005-05-15 fl updated; added to PIL as ImageDraw2 +# 2005-05-15 fl added text support +# 2005-05-20 fl added arc/chord/pieslice support +# +# Copyright (c) 2003-2005 by Secret Labs AB +# Copyright (c) 2003-2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath + + +class Pen(object): + def __init__(self, color, width=1, opacity=255): + self.color = ImageColor.getrgb(color) + self.width = width + + +class Brush(object): + def __init__(self, color, opacity=255): + self.color = ImageColor.getrgb(color) + + +class Font(object): + def __init__(self, color, file, size=12): + # FIXME: add support for bitmap fonts + self.color = ImageColor.getrgb(color) + self.font = ImageFont.truetype(file, size) + + +class Draw(object): + + def __init__(self, image, size=None, color=None): + if not hasattr(image, "im"): + image = Image.new(image, size, color) + self.draw = ImageDraw.Draw(image) + self.image = image + self.transform = None + + def flush(self): + return self.image + + def render(self, op, xy, pen, brush=None): + # handle color arguments + outline = fill = None + width = 1 + if isinstance(pen, Pen): + outline = pen.color + width = pen.width + elif isinstance(brush, Pen): + outline = brush.color + width = brush.width + if isinstance(brush, Brush): + fill = brush.color + elif isinstance(pen, Brush): + fill = pen.color + # handle transformation + if self.transform: + xy = ImagePath.Path(xy) + xy.transform(self.transform) + # render the item + if op == "line": + self.draw.line(xy, fill=outline, width=width) + else: + getattr(self.draw, op)(xy, fill=fill, outline=outline) + + def settransform(self, offset): + (xoffset, yoffset) = offset + self.transform = (1, 0, xoffset, 0, 1, yoffset) + + def arc(self, xy, start, end, *options): + self.render("arc", xy, start, end, *options) + + def chord(self, xy, start, end, *options): + self.render("chord", xy, start, end, *options) + + def ellipse(self, xy, *options): + self.render("ellipse", xy, *options) + + def line(self, xy, *options): + self.render("line", xy, *options) + + def pieslice(self, xy, start, end, *options): + self.render("pieslice", xy, start, end, *options) + + def polygon(self, xy, *options): + self.render("polygon", xy, *options) + + def rectangle(self, xy, *options): + self.render("rectangle", xy, *options) + + def text(self, xy, text, font): + if self.transform: + xy = ImagePath.Path(xy) + xy.transform(self.transform) + self.draw.text(xy, text, font=font.font, fill=font.color) + + def textsize(self, text, font): + return self.draw.textsize(text, font=font.font) diff --git a/imagecrunch/PIL/ImageEnhance.py b/imagecrunch/PIL/ImageEnhance.py new file mode 100644 index 0000000..11c9c3a --- /dev/null +++ b/imagecrunch/PIL/ImageEnhance.py @@ -0,0 +1,100 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image enhancement classes +# +# For a background, see "Image Processing By Interpolation and +# Extrapolation", Paul Haeberli and Douglas Voorhies. Available +# at http://www.graficaobscura.com/interp/index.html +# +# History: +# 1996-03-23 fl Created +# 2009-06-16 fl Fixed mean calculation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFilter, ImageStat + + +class _Enhance(object): + + def enhance(self, factor): + """ + Returns an enhanced image. + + :param factor: A floating point value controlling the enhancement. + Factor 1.0 always returns a copy of the original image, + lower factors mean less color (brightness, contrast, + etc), and higher values more. There are no restrictions + on this value. + :rtype: :py:class:`~PIL.Image.Image` + """ + return Image.blend(self.degenerate, self.image, factor) + + +class Color(_Enhance): + """Adjust image color balance. + + This class can be used to adjust the colour balance of an image, in + a manner similar to the controls on a colour TV set. An enhancement + factor of 0.0 gives a black and white image. A factor of 1.0 gives + the original image. + """ + def __init__(self, image): + self.image = image + self.intermediate_mode = 'L' + if 'A' in image.getbands(): + self.intermediate_mode = 'LA' + + self.degenerate = image.convert(self.intermediate_mode).convert(image.mode) + + +class Contrast(_Enhance): + """Adjust image contrast. + + This class can be used to control the contrast of an image, similar + to the contrast control on a TV set. An enhancement factor of 0.0 + gives a solid grey image. A factor of 1.0 gives the original image. + """ + def __init__(self, image): + self.image = image + mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5) + self.degenerate = Image.new("L", image.size, mean).convert(image.mode) + + if 'A' in image.getbands(): + self.degenerate.putalpha(image.getchannel('A')) + + +class Brightness(_Enhance): + """Adjust image brightness. + + This class can be used to control the brightness of an image. An + enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the + original image. + """ + def __init__(self, image): + self.image = image + self.degenerate = Image.new(image.mode, image.size, 0) + + if 'A' in image.getbands(): + self.degenerate.putalpha(image.getchannel('A')) + + +class Sharpness(_Enhance): + """Adjust image sharpness. + + This class can be used to adjust the sharpness of an image. An + enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the + original image, and a factor of 2.0 gives a sharpened image. + """ + def __init__(self, image): + self.image = image + self.degenerate = image.filter(ImageFilter.SMOOTH) + + if 'A' in image.getbands(): + self.degenerate.putalpha(image.getchannel('A')) diff --git a/imagecrunch/PIL/ImageFile.py b/imagecrunch/PIL/ImageFile.py new file mode 100644 index 0000000..681dee5 --- /dev/null +++ b/imagecrunch/PIL/ImageFile.py @@ -0,0 +1,667 @@ +# +# The Python Imaging Library. +# $Id$ +# +# base class for image file handlers +# +# history: +# 1995-09-09 fl Created +# 1996-03-11 fl Fixed load mechanism. +# 1996-04-15 fl Added pcx/xbm decoders. +# 1996-04-30 fl Added encoders. +# 1996-12-14 fl Added load helpers +# 1997-01-11 fl Use encode_to_file where possible +# 1997-08-27 fl Flush output in _save +# 1998-03-05 fl Use memory mapping for some modes +# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" +# 1999-05-31 fl Added image parser +# 2000-10-12 fl Set readonly flag on memory-mapped images +# 2002-03-20 fl Use better messages for common decoder errors +# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available +# 2003-10-30 fl Added StubImageFile class +# 2004-02-25 fl Made incremental parser more robust +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._util import isPath +import io +import os +import sys +import struct + +MAXBLOCK = 65536 + +SAFEBLOCK = 1024*1024 + +LOAD_TRUNCATED_IMAGES = False + +ERRORS = { + -1: "image buffer overrun error", + -2: "decoding error", + -3: "unknown error", + -8: "bad configuration", + -9: "out of memory error" +} + + +def raise_ioerror(error): + try: + message = Image.core.getcodecstatus(error) + except AttributeError: + message = ERRORS.get(error) + if not message: + message = "decoder error %d" % error + raise IOError(message + " when reading image file") + + +# +# -------------------------------------------------------------------- +# Helpers + +def _tilesort(t): + # sort on offset + return t[2] + + +# +# -------------------------------------------------------------------- +# ImageFile base class + +class ImageFile(Image.Image): + "Base class for image file format handlers." + + def __init__(self, fp=None, filename=None): + Image.Image.__init__(self) + + self._min_frame = 0 + + self.tile = None + self.readonly = 1 # until we know better + + self.decoderconfig = () + self.decodermaxblock = MAXBLOCK + + if isPath(fp): + # filename + self.fp = open(fp, "rb") + self.filename = fp + self._exclusive_fp = True + else: + # stream + self.fp = fp + self.filename = filename + # can be overridden + self._exclusive_fp = None + + try: + self._open() + except (IndexError, # end of data + TypeError, # end of data (ord) + KeyError, # unsupported mode + EOFError, # got header but not the first frame + struct.error) as v: + # close the file only if we have opened it this constructor + if self._exclusive_fp: + self.fp.close() + raise SyntaxError(v) + + if not self.mode or self.size[0] <= 0: + raise SyntaxError("not identified by this driver") + + def draft(self, mode, size): + "Set draft mode" + + pass + + def get_format_mimetype(self): + if self.format is None: + return + return Image.MIME.get(self.format.upper()) + + def verify(self): + "Check file integrity" + + # raise exception if something's wrong. must be called + # directly after open, and closes file when finished. + if self._exclusive_fp: + self.fp.close() + self.fp = None + + def load(self): + "Load image data based on tile list" + + pixel = Image.Image.load(self) + + if self.tile is None: + raise IOError("cannot load this image") + if not self.tile: + return pixel + + self.map = None + use_mmap = self.filename and len(self.tile) == 1 + # As of pypy 2.1.0, memory mapping was failing here. + use_mmap = use_mmap and not hasattr(sys, 'pypy_version_info') + + readonly = 0 + + # look for read/seek overrides + try: + read = self.load_read + # don't use mmap if there are custom read/seek functions + use_mmap = False + except AttributeError: + read = self.fp.read + + try: + seek = self.load_seek + use_mmap = False + except AttributeError: + seek = self.fp.seek + + if use_mmap: + # try memory mapping + decoder_name, extents, offset, args = self.tile[0] + if decoder_name == "raw" and len(args) >= 3 and args[0] == self.mode \ + and args[0] in Image._MAPMODES: + try: + if hasattr(Image.core, "map"): + # use built-in mapper WIN32 only + self.map = Image.core.map(self.filename) + self.map.seek(offset) + self.im = self.map.readimage( + self.mode, self.size, args[1], args[2] + ) + else: + # use mmap, if possible + import mmap + with open(self.filename, "r") as fp: + self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) + self.im = Image.core.map_buffer( + self.map, self.size, decoder_name, extents, offset, args + ) + readonly = 1 + # After trashing self.im, we might need to reload the palette data. + if self.palette: + self.palette.dirty = 1 + except (AttributeError, EnvironmentError, ImportError): + self.map = None + + self.load_prepare() + err_code = -3 # initialize to unknown error + if not self.map: + # sort tiles in file order + self.tile.sort(key=_tilesort) + + try: + # FIXME: This is a hack to handle TIFF's JpegTables tag. + prefix = self.tile_prefix + except AttributeError: + prefix = b"" + + for decoder_name, extents, offset, args in self.tile: + decoder = Image._getdecoder(self.mode, decoder_name, + args, self.decoderconfig) + try: + seek(offset) + decoder.setimage(self.im, extents) + if decoder.pulls_fd: + decoder.setfd(self.fp) + status, err_code = decoder.decode(b"") + else: + b = prefix + while True: + try: + s = read(self.decodermaxblock) + except (IndexError, struct.error): # truncated png/gif + if LOAD_TRUNCATED_IMAGES: + break + else: + raise IOError("image file is truncated") + + if not s: # truncated jpeg + if LOAD_TRUNCATED_IMAGES: + break + else: + self.tile = [] + raise IOError("image file is truncated " + "(%d bytes not processed)" % len(b)) + + b = b + s + n, err_code = decoder.decode(b) + if n < 0: + break + b = b[n:] + finally: + # Need to cleanup here to prevent leaks + decoder.cleanup() + + self.tile = [] + self.readonly = readonly + + self.load_end() + + if self._exclusive_fp and self._close_exclusive_fp_after_loading: + self.fp.close() + self.fp = None + + if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: + # still raised if decoder fails to return anything + raise_ioerror(err_code) + + return Image.Image.load(self) + + def load_prepare(self): + # create image memory if necessary + if not self.im or\ + self.im.mode != self.mode or self.im.size != self.size: + self.im = Image.core.new(self.mode, self.size) + # create palette (optional) + if self.mode == "P": + Image.Image.load(self) + + def load_end(self): + # may be overridden + pass + + # may be defined for contained formats + # def load_seek(self, pos): + # pass + + # may be defined for blocked formats (e.g. PNG) + # def load_read(self, bytes): + # pass + + def _seek_check(self, frame): + if (frame < self._min_frame or + # Only check upper limit on frames if additional seek operations + # are not required to do so + (not (hasattr(self, "_n_frames") and self._n_frames is None) and + frame >= self.n_frames+self._min_frame)): + raise EOFError("attempt to seek outside sequence") + + return self.tell() != frame + + +class StubImageFile(ImageFile): + """ + Base class for stub image loaders. + + A stub loader is an image loader that can identify files of a + certain format, but relies on external code to load the file. + """ + + def _open(self): + raise NotImplementedError( + "StubImageFile subclass must implement _open" + ) + + def load(self): + loader = self._load() + if loader is None: + raise IOError("cannot find loader for this %s file" % self.format) + image = loader.load(self) + assert image is not None + # become the other object (!) + self.__class__ = image.__class__ + self.__dict__ = image.__dict__ + + def _load(self): + "(Hook) Find actual image loader." + raise NotImplementedError( + "StubImageFile subclass must implement _load" + ) + + +class Parser(object): + """ + Incremental image parser. This class implements the standard + feed/close consumer interface. + """ + incremental = None + image = None + data = None + decoder = None + offset = 0 + finished = 0 + + def reset(self): + """ + (Consumer) Reset the parser. Note that you can only call this + method immediately after you've created a parser; parser + instances cannot be reused. + """ + assert self.data is None, "cannot reuse parsers" + + def feed(self, data): + """ + (Consumer) Feed data to the parser. + + :param data: A string buffer. + :exception IOError: If the parser failed to parse the image file. + """ + # collect data + + if self.finished: + return + + if self.data is None: + self.data = data + else: + self.data = self.data + data + + # parse what we have + if self.decoder: + + if self.offset > 0: + # skip header + skip = min(len(self.data), self.offset) + self.data = self.data[skip:] + self.offset = self.offset - skip + if self.offset > 0 or not self.data: + return + + n, e = self.decoder.decode(self.data) + + if n < 0: + # end of stream + self.data = None + self.finished = 1 + if e < 0: + # decoding error + self.image = None + raise_ioerror(e) + else: + # end of image + return + self.data = self.data[n:] + + elif self.image: + + # if we end up here with no decoder, this file cannot + # be incrementally parsed. wait until we've gotten all + # available data + pass + + else: + + # attempt to open this file + try: + with io.BytesIO(self.data) as fp: + im = Image.open(fp) + except IOError: + # traceback.print_exc() + pass # not enough data + else: + flag = hasattr(im, "load_seek") or hasattr(im, "load_read") + if flag or len(im.tile) != 1: + # custom load code, or multiple tiles + self.decode = None + else: + # initialize decoder + im.load_prepare() + d, e, o, a = im.tile[0] + im.tile = [] + self.decoder = Image._getdecoder( + im.mode, d, a, im.decoderconfig + ) + self.decoder.setimage(im.im, e) + + # calculate decoder offset + self.offset = o + if self.offset <= len(self.data): + self.data = self.data[self.offset:] + self.offset = 0 + + self.image = im + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + """ + (Consumer) Close the stream. + + :returns: An image object. + :exception IOError: If the parser failed to parse the image file either + because it cannot be identified or cannot be + decoded. + """ + # finish decoding + if self.decoder: + # get rid of what's left in the buffers + self.feed(b"") + self.data = self.decoder = None + if not self.finished: + raise IOError("image was incomplete") + if not self.image: + raise IOError("cannot parse this image") + if self.data: + # incremental parsing not possible; reopen the file + # not that we have all data + with io.BytesIO(self.data) as fp: + try: + self.image = Image.open(fp) + finally: + self.image.load() + return self.image + + +# -------------------------------------------------------------------- + +def _save(im, fp, tile, bufsize=0): + """Helper to save image based on tile list + + :param im: Image object. + :param fp: File object. + :param tile: Tile list. + :param bufsize: Optional buffer size + """ + + im.load() + if not hasattr(im, "encoderconfig"): + im.encoderconfig = () + tile.sort(key=_tilesort) + # FIXME: make MAXBLOCK a configuration parameter + # It would be great if we could have the encoder specify what it needs + # But, it would need at least the image size in most cases. RawEncode is + # a tricky case. + bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c + if fp == sys.stdout: + fp.flush() + return + try: + fh = fp.fileno() + fp.flush() + except (AttributeError, io.UnsupportedOperation): + # compress to Python file-compatible object + for e, b, o, a in tile: + e = Image._getencoder(im.mode, e, a, im.encoderconfig) + if o > 0: + fp.seek(o, 0) + e.setimage(im.im, b) + if e.pushes_fd: + e.setfd(fp) + l, s = e.encode_to_pyfd() + else: + while True: + l, s, d = e.encode(bufsize) + fp.write(d) + if s: + break + if s < 0: + raise IOError("encoder error %d when writing image file" % s) + e.cleanup() + else: + # slight speedup: compress to real file object + for e, b, o, a in tile: + e = Image._getencoder(im.mode, e, a, im.encoderconfig) + if o > 0: + fp.seek(o, 0) + e.setimage(im.im, b) + if e.pushes_fd: + e.setfd(fp) + l, s = e.encode_to_pyfd() + else: + s = e.encode_to_file(fh, bufsize) + if s < 0: + raise IOError("encoder error %d when writing image file" % s) + e.cleanup() + if hasattr(fp, "flush"): + fp.flush() + + +def _safe_read(fp, size): + """ + Reads large blocks in a safe way. Unlike fp.read(n), this function + doesn't trust the user. If the requested size is larger than + SAFEBLOCK, the file is read block by block. + + :param fp: File handle. Must implement a read method. + :param size: Number of bytes to read. + :returns: A string containing up to size bytes of data. + """ + if size <= 0: + return b"" + if size <= SAFEBLOCK: + return fp.read(size) + data = [] + while size > 0: + block = fp.read(min(size, SAFEBLOCK)) + if not block: + break + data.append(block) + size -= len(block) + return b"".join(data) + + +class PyCodecState(object): + def __init__(self): + self.xsize = 0 + self.ysize = 0 + self.xoff = 0 + self.yoff = 0 + + def extents(self): + return (self.xoff, self.yoff, + self.xoff+self.xsize, self.yoff+self.ysize) + + +class PyDecoder(object): + """ + Python implementation of a format decoder. Override this class and + add the decoding logic in the `decode` method. + + See :ref:`Writing Your Own File Decoder in Python` + """ + + _pulls_fd = False + + def __init__(self, mode, *args): + self.im = None + self.state = PyCodecState() + self.fd = None + self.mode = mode + self.init(args) + + def init(self, args): + """ + Override to perform decoder specific initialization + + :param args: Array of args items from the tile entry + :returns: None + """ + self.args = args + + @property + def pulls_fd(self): + return self._pulls_fd + + def decode(self, buffer): + """ + Override to perform the decoding process. + + :param buffer: A bytes object with the data to be decoded. If `handles_eof` + is set, then `buffer` will be empty and `self.fd` will be set. + :returns: A tuple of (bytes consumed, errcode). If finished with decoding + return <0 for the bytes consumed. Err codes are from `ERRORS` + """ + raise NotImplementedError() + + def cleanup(self): + """ + Override to perform decoder specific cleanup + + :returns: None + """ + pass + + def setfd(self, fd): + """ + Called from ImageFile to set the python file-like object + + :param fd: A python file-like object + :returns: None + """ + self.fd = fd + + def setimage(self, im, extents=None): + """ + Called from ImageFile to set the core output image for the decoder + + :param im: A core image object + :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle + for this tile + :returns: None + """ + + # following c code + self.im = im + + if extents: + (x0, y0, x1, y1) = extents + else: + (x0, y0, x1, y1) = (0, 0, 0, 0) + + if x0 == 0 and x1 == 0: + self.state.xsize, self.state.ysize = self.im.size + else: + self.state.xoff = x0 + self.state.yoff = y0 + self.state.xsize = x1 - x0 + self.state.ysize = y1 - y0 + + if self.state.xsize <= 0 or self.state.ysize <= 0: + raise ValueError("Size cannot be negative") + + if (self.state.xsize + self.state.xoff > self.im.size[0] or + self.state.ysize + self.state.yoff > self.im.size[1]): + raise ValueError("Tile cannot extend outside image") + + def set_as_raw(self, data, rawmode=None): + """ + Convenience method to set the internal image from a stream of raw data + + :param data: Bytes to be set + :param rawmode: The rawmode to be used for the decoder. If not specified, + it will default to the mode of the image + :returns: None + """ + + if not rawmode: + rawmode = self.mode + d = Image._getdecoder(self.mode, 'raw', (rawmode)) + d.setimage(self.im, self.state.extents()) + s = d.decode(data) + + if s[0] >= 0: + raise ValueError("not enough image data") + if s[1] != 0: + raise ValueError("cannot decode image data") diff --git a/imagecrunch/PIL/ImageFilter.py b/imagecrunch/PIL/ImageFilter.py new file mode 100644 index 0000000..e77349d --- /dev/null +++ b/imagecrunch/PIL/ImageFilter.py @@ -0,0 +1,486 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard filters +# +# History: +# 1995-11-27 fl Created +# 2002-06-08 fl Added rank and mode filters +# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2002 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import division + +import functools + +try: + import numpy +except ImportError: # pragma: no cover + numpy = None + + +class Filter(object): + pass + + +class MultibandFilter(Filter): + pass + + +class Kernel(MultibandFilter): + """ + Create a convolution kernel. The current version only + supports 3x3 and 5x5 integer and floating point kernels. + + In the current version, kernels can only be applied to + "L" and "RGB" images. + + :param size: Kernel size, given as (width, height). In the current + version, this must be (3,3) or (5,5). + :param kernel: A sequence containing kernel weights. + :param scale: Scale factor. If given, the result for each pixel is + divided by this value. the default is the sum of the + kernel weights. + :param offset: Offset. If given, this value is added to the result, + after it has been divided by the scale factor. + """ + name = "Kernel" + + def __init__(self, size, kernel, scale=None, offset=0): + if scale is None: + # default scale is sum of kernel + scale = functools.reduce(lambda a, b: a+b, kernel) + if size[0] * size[1] != len(kernel): + raise ValueError("not enough coefficients in kernel") + self.filterargs = size, scale, offset, kernel + + def filter(self, image): + if image.mode == "P": + raise ValueError("cannot filter palette images") + return image.filter(*self.filterargs) + + +class BuiltinFilter(Kernel): + def __init__(self): + pass + + +class RankFilter(Filter): + """ + Create a rank filter. The rank filter sorts all pixels in + a window of the given size, and returns the **rank**'th value. + + :param size: The kernel size, in pixels. + :param rank: What pixel value to pick. Use 0 for a min filter, + ``size * size / 2`` for a median filter, ``size * size - 1`` + for a max filter, etc. + """ + name = "Rank" + + def __init__(self, size, rank): + self.size = size + self.rank = rank + + def filter(self, image): + if image.mode == "P": + raise ValueError("cannot filter palette images") + image = image.expand(self.size//2, self.size//2) + return image.rankfilter(self.size, self.rank) + + +class MedianFilter(RankFilter): + """ + Create a median filter. Picks the median pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + name = "Median" + + def __init__(self, size=3): + self.size = size + self.rank = size*size//2 + + +class MinFilter(RankFilter): + """ + Create a min filter. Picks the lowest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + name = "Min" + + def __init__(self, size=3): + self.size = size + self.rank = 0 + + +class MaxFilter(RankFilter): + """ + Create a max filter. Picks the largest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + name = "Max" + + def __init__(self, size=3): + self.size = size + self.rank = size*size-1 + + +class ModeFilter(Filter): + """ + Create a mode filter. Picks the most frequent pixel value in a box with the + given size. Pixel values that occur only once or twice are ignored; if no + pixel value occurs more than twice, the original pixel value is preserved. + + :param size: The kernel size, in pixels. + """ + name = "Mode" + + def __init__(self, size=3): + self.size = size + + def filter(self, image): + return image.modefilter(self.size) + + +class GaussianBlur(MultibandFilter): + """Gaussian blur filter. + + :param radius: Blur radius. + """ + name = "GaussianBlur" + + def __init__(self, radius=2): + self.radius = radius + + def filter(self, image): + return image.gaussian_blur(self.radius) + + +class BoxBlur(MultibandFilter): + """Blurs the image by setting each pixel to the average value of the pixels + in a square box extending radius pixels in each direction. + Supports float radius of arbitrary size. Uses an optimized implementation + which runs in linear time relative to the size of the image + for any radius value. + + :param radius: Size of the box in one direction. Radius 0 does not blur, + returns an identical image. Radius 1 takes 1 pixel + in each direction, i.e. 9 pixels in total. + """ + name = "BoxBlur" + + def __init__(self, radius): + self.radius = radius + + def filter(self, image): + return image.box_blur(self.radius) + + +class UnsharpMask(MultibandFilter): + """Unsharp mask filter. + + See Wikipedia's entry on `digital unsharp masking`_ for an explanation of + the parameters. + + :param radius: Blur Radius + :param percent: Unsharp strength, in percent + :param threshold: Threshold controls the minimum brightness change that + will be sharpened + + .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking + + """ + name = "UnsharpMask" + + def __init__(self, radius=2, percent=150, threshold=3): + self.radius = radius + self.percent = percent + self.threshold = threshold + + def filter(self, image): + return image.unsharp_mask(self.radius, self.percent, self.threshold) + + +class BLUR(BuiltinFilter): + name = "Blur" + filterargs = (5, 5), 16, 0, ( + 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1 + ) + + +class CONTOUR(BuiltinFilter): + name = "Contour" + filterargs = (3, 3), 1, 255, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1 + ) + + +class DETAIL(BuiltinFilter): + name = "Detail" + filterargs = (3, 3), 6, 0, ( + 0, -1, 0, + -1, 10, -1, + 0, -1, 0 + ) + + +class EDGE_ENHANCE(BuiltinFilter): + name = "Edge-enhance" + filterargs = (3, 3), 2, 0, ( + -1, -1, -1, + -1, 10, -1, + -1, -1, -1 + ) + + +class EDGE_ENHANCE_MORE(BuiltinFilter): + name = "Edge-enhance More" + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 9, -1, + -1, -1, -1 + ) + + +class EMBOSS(BuiltinFilter): + name = "Emboss" + filterargs = (3, 3), 1, 128, ( + -1, 0, 0, + 0, 1, 0, + 0, 0, 0 + ) + + +class FIND_EDGES(BuiltinFilter): + name = "Find Edges" + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1 + ) + + +class SHARPEN(BuiltinFilter): + name = "Sharpen" + filterargs = (3, 3), 16, 0, ( + -2, -2, -2, + -2, 32, -2, + -2, -2, -2 + ) + + +class SMOOTH(BuiltinFilter): + name = "Smooth" + filterargs = (3, 3), 13, 0, ( + 1, 1, 1, + 1, 5, 1, + 1, 1, 1 + ) + + +class SMOOTH_MORE(BuiltinFilter): + name = "Smooth More" + filterargs = (5, 5), 100, 0, ( + 1, 1, 1, 1, 1, + 1, 5, 5, 5, 1, + 1, 5, 44, 5, 1, + 1, 5, 5, 5, 1, + 1, 1, 1, 1, 1 + ) + + +class Color3DLUT(MultibandFilter): + """Three-dimensional color lookup table. + + Transforms 3-channel pixels using the values of the channels as coordinates + in the 3D lookup table and interpolating the nearest elements. + + This method allows you to apply almost any color transformation + in constant time by using pre-calculated decimated tables. + + .. versionadded:: 5.2.0 + + :param size: Size of the table. One int or tuple of (int, int, int). + Minimal size in any dimension is 2, maximum is 65. + :param table: Flat lookup table. A list of ``channels * size**3`` + float elements or a list of ``size**3`` channels-sized + tuples with floats. Channels are changed first, + then first dimension, then second, then third. + Value 0.0 corresponds lowest value of output, 1.0 highest. + :param channels: Number of channels in the table. Could be 3 or 4. + Default is 3. + :param target_mode: A mode for the result image. Should have not less + than ``channels`` channels. Default is ``None``, + which means that mode wouldn't be changed. + """ + name = "Color 3D LUT" + + def __init__(self, size, table, channels=3, target_mode=None, **kwargs): + if channels not in (3, 4): + raise ValueError("Only 3 or 4 output channels are supported") + self.size = size = self._check_size(size) + self.channels = channels + self.mode = target_mode + + # Hidden flag `_copy_table=False` could be used to avoid extra copying + # of the table if the table is specially made for the constructor. + copy_table = kwargs.get('_copy_table', True) + items = size[0] * size[1] * size[2] + wrong_size = False + + if numpy and isinstance(table, numpy.ndarray): + if copy_table: + table = table.copy() + + if table.shape in [(items * channels,), (items, channels), + (size[2], size[1], size[0], channels)]: + table = table.reshape(items * channels) + else: + wrong_size = True + + else: + if copy_table: + table = list(table) + + # Convert to a flat list + if table and isinstance(table[0], (list, tuple)): + table, raw_table = [], table + for pixel in raw_table: + if len(pixel) != channels: + raise ValueError( + "The elements of the table should " + "have a length of {}.".format(channels)) + table.extend(pixel) + + if wrong_size or len(table) != items * channels: + raise ValueError( + "The table should have either channels * size**3 float items " + "or size**3 items of channels-sized tuples with floats. " + "Table should be: {}x{}x{}x{}. Actual length: {}".format( + channels, size[0], size[1], size[2], len(table))) + self.table = table + + @staticmethod + def _check_size(size): + try: + _, _, _ = size + except ValueError: + raise ValueError("Size should be either an integer or " + "a tuple of three integers.") + except TypeError: + size = (size, size, size) + size = [int(x) for x in size] + for size1D in size: + if not 2 <= size1D <= 65: + raise ValueError("Size should be in [2, 65] range.") + return size + + @classmethod + def generate(cls, size, callback, channels=3, target_mode=None): + """Generates new LUT using provided callback. + + :param size: Size of the table. Passed to the constructor. + :param callback: Function with three parameters which correspond + three color channels. Will be called ``size**3`` + times with values from 0.0 to 1.0 and should return + a tuple with ``channels`` elements. + :param channels: The number of channels which should return callback. + :param target_mode: Passed to the constructor of the resulting + lookup table. + """ + size1D, size2D, size3D = cls._check_size(size) + if channels not in (3, 4): + raise ValueError("Only 3 or 4 output channels are supported") + + table = [0] * (size1D * size2D * size3D * channels) + idx_out = 0 + for b in range(size3D): + for g in range(size2D): + for r in range(size1D): + table[idx_out:idx_out + channels] = callback( + r / (size1D-1), g / (size2D-1), b / (size3D-1)) + idx_out += channels + + return cls((size1D, size2D, size3D), table, channels=channels, + target_mode=target_mode, _copy_table=False) + + def transform(self, callback, with_normals=False, channels=None, + target_mode=None): + """Transforms the table values using provided callback and returns + a new LUT with altered values. + + :param callback: A function which takes old lookup table values + and returns a new set of values. The number + of arguments which function should take is + ``self.channels`` or ``3 + self.channels`` + if ``with_normals`` flag is set. + Should return a tuple of ``self.channels`` or + ``channels`` elements if it is set. + :param with_normals: If true, ``callback`` will be called with + coordinates in the color cube as the first + three arguments. Otherwise, ``callback`` + will be called only with actual color values. + :param channels: The number of channels in the resulting lookup table. + :param target_mode: Passed to the constructor of the resulting + lookup table. + """ + if channels not in (None, 3, 4): + raise ValueError("Only 3 or 4 output channels are supported") + ch_in = self.channels + ch_out = channels or ch_in + size1D, size2D, size3D = self.size + + table = [0] * (size1D * size2D * size3D * ch_out) + idx_in = 0 + idx_out = 0 + for b in range(size3D): + for g in range(size2D): + for r in range(size1D): + values = self.table[idx_in:idx_in + ch_in] + if with_normals: + values = callback(r / (size1D-1), g / (size2D-1), + b / (size3D-1), *values) + else: + values = callback(*values) + table[idx_out:idx_out + ch_out] = values + idx_in += ch_in + idx_out += ch_out + + return type(self)(self.size, table, channels=ch_out, + target_mode=target_mode or self.mode, + _copy_table=False) + + def __repr__(self): + r = [ + "{} from {}".format(self.__class__.__name__, + self.table.__class__.__name__), + "size={:d}x{:d}x{:d}".format(*self.size), + "channels={:d}".format(self.channels), + ] + if self.mode: + r.append("target_mode={}".format(self.mode)) + return "<{}>".format(" ".join(r)) + + def filter(self, image): + from . import Image + + return image.color_lut_3d( + self.mode or image.mode, Image.LINEAR, self.channels, + self.size[0], self.size[1], self.size[2], self.table) diff --git a/imagecrunch/PIL/ImageFont.py b/imagecrunch/PIL/ImageFont.py new file mode 100644 index 0000000..3ac29e8 --- /dev/null +++ b/imagecrunch/PIL/ImageFont.py @@ -0,0 +1,471 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIL raster font management +# +# History: +# 1996-08-07 fl created (experimental) +# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 +# 1999-02-06 fl rewrote most font management stuff in C +# 1999-03-17 fl take pth files into account in load_path (from Richard Jones) +# 2001-02-17 fl added freetype support +# 2001-05-09 fl added TransposedFont wrapper class +# 2002-03-04 fl make sure we have a "L" or "1" font +# 2002-12-04 fl skip non-directory entries in the system path +# 2003-04-29 fl add embedded default font +# 2003-09-27 fl added support for truetype charmap encodings +# +# Todo: +# Adapt to PILFONT2 format (16-bit fonts, compressed, single file) +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._util import isDirectory, isPath, py3 +import os +import sys + +LAYOUT_BASIC = 0 +LAYOUT_RAQM = 1 + + +class _imagingft_not_installed(object): + # module placeholder + def __getattr__(self, id): + raise ImportError("The _imagingft C module is not installed") + + +try: + from . import _imagingft as core +except ImportError: + core = _imagingft_not_installed() + + +# FIXME: add support for pilfont2 format (see FontFile.py) + +# -------------------------------------------------------------------- +# Font metrics format: +# "PILfont" LF +# fontdescriptor LF +# (optional) key=value... LF +# "DATA" LF +# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) +# +# To place a character, cut out srcbox and paste at dstbox, +# relative to the character position. Then move the character +# position according to dx, dy. +# -------------------------------------------------------------------- + + +class ImageFont(object): + "PIL font wrapper" + + def _load_pilfont(self, filename): + + with open(filename, "rb") as fp: + for ext in (".png", ".gif", ".pbm"): + try: + fullname = os.path.splitext(filename)[0] + ext + image = Image.open(fullname) + except: + pass + else: + if image and image.mode in ("1", "L"): + break + else: + raise IOError("cannot find glyph data file") + + self.file = fullname + + return self._load_pilfont_data(fp, image) + + def _load_pilfont_data(self, file, image): + + # read PILfont header + if file.readline() != b"PILfont\n": + raise SyntaxError("Not a PILfont file") + file.readline().split(b";") + self.info = [] # FIXME: should be a dictionary + while True: + s = file.readline() + if not s or s == b"DATA\n": + break + self.info.append(s) + + # read PILfont metrics + data = file.read(256*20) + + # check image + if image.mode not in ("1", "L"): + raise TypeError("invalid font image mode") + + image.load() + + self.font = Image.core.font(image.im, data) + + def getsize(self, text, *args, **kwargs): + return self.font.getsize(text) + + def getmask(self, text, mode="", *args, **kwargs): + return self.font.getmask(text, mode) + + +## +# Wrapper for FreeType fonts. Application code should use the +# truetype factory function to create font objects. + +class FreeTypeFont(object): + "FreeType font wrapper (requires _imagingft service)" + + def __init__(self, font=None, size=10, index=0, encoding="", + layout_engine=None): + # FIXME: use service provider instead + + self.path = font + self.size = size + self.index = index + self.encoding = encoding + + if layout_engine not in (LAYOUT_BASIC, LAYOUT_RAQM): + layout_engine = LAYOUT_BASIC + if core.HAVE_RAQM: + layout_engine = LAYOUT_RAQM + if layout_engine == LAYOUT_RAQM and not core.HAVE_RAQM: + layout_engine = LAYOUT_BASIC + + self.layout_engine = layout_engine + + if isPath(font): + self.font = core.getfont(font, size, index, encoding, layout_engine=layout_engine) + else: + self.font_bytes = font.read() + self.font = core.getfont( + "", size, index, encoding, self.font_bytes, layout_engine) + + def _multiline_split(self, text): + split_character = "\n" if isinstance(text, str) else b"\n" + return text.split(split_character) + + def getname(self): + return self.font.family, self.font.style + + def getmetrics(self): + return self.font.ascent, self.font.descent + + def getsize(self, text, direction=None, features=None): + size, offset = self.font.getsize(text, direction, features) + return (size[0] + offset[0], size[1] + offset[1]) + + def getsize_multiline(self, text, direction=None, spacing=4, features=None): + max_width = 0 + lines = self._multiline_split(text) + line_spacing = self.getsize('A')[1] + spacing + for line in lines: + line_width, line_height = self.getsize(line, direction, features) + max_width = max(max_width, line_width) + + return max_width, len(lines)*line_spacing - spacing + + def getoffset(self, text): + return self.font.getsize(text)[1] + + def getmask(self, text, mode="", direction=None, features=None): + return self.getmask2(text, mode, direction=direction, features=features)[0] + + def getmask2(self, text, mode="", fill=Image.core.fill, direction=None, features=None, *args, **kwargs): + size, offset = self.font.getsize(text, direction, features) + im = fill("L", size, 0) + self.font.render(text, im.id, mode == "1", direction, features) + return im, offset + + def font_variant(self, font=None, size=None, index=None, encoding=None, + layout_engine=None): + """ + Create a copy of this FreeTypeFont object, + using any specified arguments to override the settings. + + Parameters are identical to the parameters used to initialize this + object. + + :return: A FreeTypeFont object. + """ + return FreeTypeFont(font=self.path if font is None else font, + size=self.size if size is None else size, + index=self.index if index is None else index, + encoding=self.encoding if encoding is None else encoding, + layout_engine=self.layout_engine if layout_engine is None else layout_engine + ) + + +class TransposedFont(object): + "Wrapper for writing rotated or mirrored text" + + def __init__(self, font, orientation=None): + """ + Wrapper that creates a transposed font from any existing font + object. + + :param font: A font object. + :param orientation: An optional orientation. If given, this should + be one of Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM, + Image.ROTATE_90, Image.ROTATE_180, or Image.ROTATE_270. + """ + self.font = font + self.orientation = orientation # any 'transpose' argument, or None + + def getsize(self, text, *args, **kwargs): + w, h = self.font.getsize(text) + if self.orientation in (Image.ROTATE_90, Image.ROTATE_270): + return h, w + return w, h + + def getmask(self, text, mode="", *args, **kwargs): + im = self.font.getmask(text, mode, *args, **kwargs) + if self.orientation is not None: + return im.transpose(self.orientation) + return im + + +def load(filename): + """ + Load a font file. This function loads a font object from the given + bitmap font file, and returns the corresponding font object. + + :param filename: Name of font file. + :return: A font object. + :exception IOError: If the file could not be read. + """ + f = ImageFont() + f._load_pilfont(filename) + return f + + +def truetype(font=None, size=10, index=0, encoding="", + layout_engine=None): + """ + Load a TrueType or OpenType font from a file or file-like object, + and create a font object. + This function loads a font object from the given file or file-like + object, and creates a font object for a font of the given size. + + This function requires the _imagingft service. + + :param font: A filename or file-like object containing a TrueType font. + Under Windows, if the file is not found in this filename, + the loader also looks in Windows :file:`fonts/` directory. + :param size: The requested size, in points. + :param index: Which font face to load (default is first available face). + :param encoding: Which font encoding to use (default is Unicode). Common + encodings are "unic" (Unicode), "symb" (Microsoft + Symbol), "ADOB" (Adobe Standard), "ADBE" (Adobe Expert), + and "armn" (Apple Roman). See the FreeType documentation + for more information. + :param layout_engine: Which layout engine to use, if available: + `ImageFont.LAYOUT_BASIC` or `ImageFont.LAYOUT_RAQM`. + :return: A font object. + :exception IOError: If the file could not be read. + """ + + try: + return FreeTypeFont(font, size, index, encoding, layout_engine) + except IOError: + ttf_filename = os.path.basename(font) + + dirs = [] + if sys.platform == "win32": + # check the windows font repository + # NOTE: must use uppercase WINDIR, to work around bugs in + # 1.5.2's os.environ.get() + windir = os.environ.get("WINDIR") + if windir: + dirs.append(os.path.join(windir, "fonts")) + elif sys.platform in ('linux', 'linux2'): + lindirs = os.environ.get("XDG_DATA_DIRS", "") + if not lindirs: + # According to the freedesktop spec, XDG_DATA_DIRS should + # default to /usr/share + lindirs = '/usr/share' + dirs += [os.path.join(lindir, "fonts") + for lindir in lindirs.split(":")] + elif sys.platform == 'darwin': + dirs += ['/Library/Fonts', '/System/Library/Fonts', + os.path.expanduser('~/Library/Fonts')] + + ext = os.path.splitext(ttf_filename)[1] + first_font_with_a_different_extension = None + for directory in dirs: + for walkroot, walkdir, walkfilenames in os.walk(directory): + for walkfilename in walkfilenames: + if ext and walkfilename == ttf_filename: + fontpath = os.path.join(walkroot, walkfilename) + return FreeTypeFont(fontpath, size, index, encoding, layout_engine) + elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: + fontpath = os.path.join(walkroot, walkfilename) + if os.path.splitext(fontpath)[1] == '.ttf': + return FreeTypeFont(fontpath, size, index, encoding, layout_engine) + if not ext and first_font_with_a_different_extension is None: + first_font_with_a_different_extension = fontpath + if first_font_with_a_different_extension: + return FreeTypeFont(first_font_with_a_different_extension, size, + index, encoding, layout_engine) + raise + + +def load_path(filename): + """ + Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a + bitmap font along the Python path. + + :param filename: Name of font file. + :return: A font object. + :exception IOError: If the file could not be read. + """ + for directory in sys.path: + if isDirectory(directory): + if not isinstance(filename, str): + if py3: + filename = filename.decode("utf-8") + else: + filename = filename.encode("utf-8") + try: + return load(os.path.join(directory, filename)) + except IOError: + pass + raise IOError("cannot find font file") + + +def load_default(): + """Load a "better than nothing" default font. + + .. versionadded:: 1.1.4 + + :return: A font object. + """ + from io import BytesIO + import base64 + f = ImageFont() + f._load_pilfont_data( + # courB08 + BytesIO(base64.b64decode(b''' +UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA +BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL +AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA +AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB +ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A +BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB +//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA +AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH +AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA +ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv +AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ +/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 +AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA +AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG +AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA +BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA +AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA +2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF +AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// ++gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA +////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA +BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv +AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA +AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA +AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA +BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// +//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA +AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF +AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB +mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn +AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA +AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 +AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA +Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB +//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA +AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ +AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC +DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ +AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ ++wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 +AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ +///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG +AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA +BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA +Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC +eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG +AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// ++gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA +////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA +BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT +AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A +AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA +Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA +Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// +//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA +AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ +AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA +LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 +AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA +AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 +AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA +AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG +AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA +EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK +AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA +pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG +AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// ++QAGAAIAzgAKANUAEw== +''')), Image.open(BytesIO(base64.b64decode(b''' +iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u +Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 +M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g +LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F +IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA +Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 +NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx +in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 +SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY +AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt +y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG +ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY +lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H +/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 +AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 +c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ +/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw +pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv +oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR +evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA +AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// +Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR +w7IkEbzhVQAAAABJRU5ErkJggg== +''')))) + return f diff --git a/imagecrunch/PIL/ImageGrab.py b/imagecrunch/PIL/ImageGrab.py new file mode 100644 index 0000000..712b02c --- /dev/null +++ b/imagecrunch/PIL/ImageGrab.py @@ -0,0 +1,80 @@ +# +# The Python Imaging Library +# $Id$ +# +# screen grabber (macOS and Windows only) +# +# History: +# 2001-04-26 fl created +# 2001-09-17 fl use builtin driver, if present +# 2002-11-19 fl added grabclipboard support +# +# Copyright (c) 2001-2002 by Secret Labs AB +# Copyright (c) 2001-2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image + +import sys +if sys.platform not in ["win32", "darwin"]: + raise ImportError("ImageGrab is macOS and Windows only") + +if sys.platform == "win32": + grabber = Image.core.grabscreen +elif sys.platform == "darwin": + import os + import tempfile + import subprocess + + +def grab(bbox=None): + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp('.png') + os.close(fh) + subprocess.call(['screencapture', '-x', filepath]) + im = Image.open(filepath) + im.load() + os.unlink(filepath) + else: + size, data = grabber() + im = Image.frombytes( + "RGB", size, data, + # RGB, 32-bit line padding, origin lower left corner + "raw", "BGR", (size[0]*3 + 3) & -4, -1 + ) + if bbox: + im = im.crop(bbox) + return im + + +def grabclipboard(): + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp('.jpg') + os.close(fh) + commands = [ + "set theFile to (open for access POSIX file \""+filepath+"\" with write permission)", + "try", + "write (the clipboard as JPEG picture) to theFile", + "end try", + "close access theFile" + ] + script = ["osascript"] + for command in commands: + script += ["-e", command] + subprocess.call(script) + + im = None + if os.stat(filepath).st_size != 0: + im = Image.open(filepath) + im.load() + os.unlink(filepath) + return im + else: + data = Image.core.grabclipboard() + if isinstance(data, bytes): + from . import BmpImagePlugin + import io + return BmpImagePlugin.DibImageFile(io.BytesIO(data)) + return data diff --git a/imagecrunch/PIL/ImageMath.py b/imagecrunch/PIL/ImageMath.py new file mode 100644 index 0000000..d985877 --- /dev/null +++ b/imagecrunch/PIL/ImageMath.py @@ -0,0 +1,271 @@ +# +# The Python Imaging Library +# $Id$ +# +# a simple math add-on for the Python Imaging Library +# +# History: +# 1999-02-15 fl Original PIL Plus release +# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 +# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 +# +# Copyright (c) 1999-2005 by Secret Labs AB +# Copyright (c) 2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image, _imagingmath +from ._util import py3 + +try: + import builtins +except ImportError: + import __builtin__ + builtins = __builtin__ + +VERBOSE = 0 + + +def _isconstant(v): + return isinstance(v, int) or isinstance(v, float) + + +class _Operand(object): + """Wraps an image operand, providing standard operators""" + + def __init__(self, im): + self.im = im + + def __fixup(self, im1): + # convert image to suitable mode + if isinstance(im1, _Operand): + # argument was an image. + if im1.im.mode in ("1", "L"): + return im1.im.convert("I") + elif im1.im.mode in ("I", "F"): + return im1.im + else: + raise ValueError("unsupported mode: %s" % im1.im.mode) + else: + # argument was a constant + if _isconstant(im1) and self.im.mode in ("1", "L", "I"): + return Image.new("I", self.im.size, im1) + else: + return Image.new("F", self.im.size, im1) + + def apply(self, op, im1, im2=None, mode=None): + im1 = self.__fixup(im1) + if im2 is None: + # unary operation + out = Image.new(mode or im1.mode, im1.size, None) + im1.load() + try: + op = getattr(_imagingmath, op+"_"+im1.mode) + except AttributeError: + raise TypeError("bad operand type for '%s'" % op) + _imagingmath.unop(op, out.im.id, im1.im.id) + else: + # binary operation + im2 = self.__fixup(im2) + if im1.mode != im2.mode: + # convert both arguments to floating point + if im1.mode != "F": + im1 = im1.convert("F") + if im2.mode != "F": + im2 = im2.convert("F") + if im1.mode != im2.mode: + raise ValueError("mode mismatch") + if im1.size != im2.size: + # crop both arguments to a common size + size = (min(im1.size[0], im2.size[0]), + min(im1.size[1], im2.size[1])) + if im1.size != size: + im1 = im1.crop((0, 0) + size) + if im2.size != size: + im2 = im2.crop((0, 0) + size) + out = Image.new(mode or im1.mode, size, None) + else: + out = Image.new(mode or im1.mode, im1.size, None) + im1.load() + im2.load() + try: + op = getattr(_imagingmath, op+"_"+im1.mode) + except AttributeError: + raise TypeError("bad operand type for '%s'" % op) + _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id) + return _Operand(out) + + # unary operators + def __bool__(self): + # an image is "true" if it contains at least one non-zero pixel + return self.im.getbbox() is not None + + if not py3: + # Provide __nonzero__ for pre-Py3k + __nonzero__ = __bool__ + del __bool__ + + def __abs__(self): + return self.apply("abs", self) + + def __pos__(self): + return self + + def __neg__(self): + return self.apply("neg", self) + + # binary operators + def __add__(self, other): + return self.apply("add", self, other) + + def __radd__(self, other): + return self.apply("add", other, self) + + def __sub__(self, other): + return self.apply("sub", self, other) + + def __rsub__(self, other): + return self.apply("sub", other, self) + + def __mul__(self, other): + return self.apply("mul", self, other) + + def __rmul__(self, other): + return self.apply("mul", other, self) + + def __truediv__(self, other): + return self.apply("div", self, other) + + def __rtruediv__(self, other): + return self.apply("div", other, self) + + def __mod__(self, other): + return self.apply("mod", self, other) + + def __rmod__(self, other): + return self.apply("mod", other, self) + + def __pow__(self, other): + return self.apply("pow", self, other) + + def __rpow__(self, other): + return self.apply("pow", other, self) + + if not py3: + # Provide __div__ and __rdiv__ for pre-Py3k + __div__ = __truediv__ + __rdiv__ = __rtruediv__ + del __truediv__ + del __rtruediv__ + + # bitwise + def __invert__(self): + return self.apply("invert", self) + + def __and__(self, other): + return self.apply("and", self, other) + + def __rand__(self, other): + return self.apply("and", other, self) + + def __or__(self, other): + return self.apply("or", self, other) + + def __ror__(self, other): + return self.apply("or", other, self) + + def __xor__(self, other): + return self.apply("xor", self, other) + + def __rxor__(self, other): + return self.apply("xor", other, self) + + def __lshift__(self, other): + return self.apply("lshift", self, other) + + def __rshift__(self, other): + return self.apply("rshift", self, other) + + # logical + def __eq__(self, other): + return self.apply("eq", self, other) + + def __ne__(self, other): + return self.apply("ne", self, other) + + def __lt__(self, other): + return self.apply("lt", self, other) + + def __le__(self, other): + return self.apply("le", self, other) + + def __gt__(self, other): + return self.apply("gt", self, other) + + def __ge__(self, other): + return self.apply("ge", self, other) + + +# conversions +def imagemath_int(self): + return _Operand(self.im.convert("I")) + + +def imagemath_float(self): + return _Operand(self.im.convert("F")) + + +# logical +def imagemath_equal(self, other): + return self.apply("eq", self, other, mode="I") + + +def imagemath_notequal(self, other): + return self.apply("ne", self, other, mode="I") + + +def imagemath_min(self, other): + return self.apply("min", self, other) + + +def imagemath_max(self, other): + return self.apply("max", self, other) + + +def imagemath_convert(self, mode): + return _Operand(self.im.convert(mode)) + + +ops = {} +for k, v in list(globals().items()): + if k[:10] == "imagemath_": + ops[k[10:]] = v + + +def eval(expression, _dict={}, **kw): + """ + Evaluates an image expression. + + :param expression: A string containing a Python-style expression. + :param options: Values to add to the evaluation context. You + can either use a dictionary, or one or more keyword + arguments. + :return: The evaluated expression. This is usually an image object, but can + also be an integer, a floating point value, or a pixel tuple, + depending on the expression. + """ + + # build execution namespace + args = ops.copy() + args.update(_dict) + args.update(kw) + for k, v in list(args.items()): + if hasattr(v, "im"): + args[k] = _Operand(v) + + out = builtins.eval(expression, args) + try: + return out.im + except AttributeError: + return out diff --git a/imagecrunch/PIL/ImageMode.py b/imagecrunch/PIL/ImageMode.py new file mode 100644 index 0000000..b227f21 --- /dev/null +++ b/imagecrunch/PIL/ImageMode.py @@ -0,0 +1,55 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard mode descriptors +# +# History: +# 2006-03-20 fl Added +# +# Copyright (c) 2006 by Secret Labs AB. +# Copyright (c) 2006 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +# mode descriptor cache +_modes = None + + +class ModeDescriptor(object): + """Wrapper for mode strings.""" + + def __init__(self, mode, bands, basemode, basetype): + self.mode = mode + self.bands = bands + self.basemode = basemode + self.basetype = basetype + + def __str__(self): + return self.mode + + +def getmode(mode): + """Gets a mode descriptor for the given mode.""" + global _modes + if not _modes: + # initialize mode cache + + from . import Image + modes = {} + # core modes + for m, (basemode, basetype, bands) in Image._MODEINFO.items(): + modes[m] = ModeDescriptor(m, bands, basemode, basetype) + # extra experimental modes + modes["RGBa"] = ModeDescriptor("RGBa", ("R", "G", "B", "a"), "RGB", "L") + modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L") + modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L") + modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L") + # mapping modes + modes["I;16"] = ModeDescriptor("I;16", "I", "L", "L") + modes["I;16L"] = ModeDescriptor("I;16L", "I", "L", "L") + modes["I;16B"] = ModeDescriptor("I;16B", "I", "L", "L") + # set global mode cache atomically + _modes = modes + return _modes[mode] diff --git a/imagecrunch/PIL/ImageMorph.py b/imagecrunch/PIL/ImageMorph.py new file mode 100644 index 0000000..579ee4e --- /dev/null +++ b/imagecrunch/PIL/ImageMorph.py @@ -0,0 +1,250 @@ +# A binary morphology add-on for the Python Imaging Library +# +# History: +# 2014-06-04 Initial version. +# +# Copyright (c) 2014 Dov Grobgeld + +from __future__ import print_function + +from . import Image, _imagingmorph +import re + +LUT_SIZE = 1 << 9 + + +class LutBuilder(object): + """A class for building a MorphLut from a descriptive language + + The input patterns is a list of a strings sequences like these:: + + 4:(... + .1. + 111)->1 + + (whitespaces including linebreaks are ignored). The option 4 + describes a series of symmetry operations (in this case a + 4-rotation), the pattern is described by: + + - . or X - Ignore + - 1 - Pixel is on + - 0 - Pixel is off + + The result of the operation is described after "->" string. + + The default is to return the current pixel value, which is + returned if no other match is found. + + Operations: + + - 4 - 4 way rotation + - N - Negate + - 1 - Dummy op for no other operation (an op must always be given) + - M - Mirroring + + Example:: + + lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) + lut = lb.build_lut() + + """ + def __init__(self, patterns=None, op_name=None): + if patterns is not None: + self.patterns = patterns + else: + self.patterns = [] + self.lut = None + if op_name is not None: + known_patterns = { + 'corner': ['1:(... ... ...)->0', + '4:(00. 01. ...)->1'], + 'dilation4': ['4:(... .0. .1.)->1'], + 'dilation8': ['4:(... .0. .1.)->1', + '4:(... .0. ..1)->1'], + 'erosion4': ['4:(... .1. .0.)->0'], + 'erosion8': ['4:(... .1. .0.)->0', + '4:(... .1. ..0)->0'], + 'edge': ['1:(... ... ...)->0', + '4:(.0. .1. ...)->1', + '4:(01. .1. ...)->1'] + } + if op_name not in known_patterns: + raise Exception('Unknown pattern '+op_name+'!') + + self.patterns = known_patterns[op_name] + + def add_patterns(self, patterns): + self.patterns += patterns + + def build_default_lut(self): + symbols = [0, 1] + m = 1 << 4 # pos of current pixel + self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) + + def get_lut(self): + return self.lut + + def _string_permute(self, pattern, permutation): + """string_permute takes a pattern and a permutation and returns the + string permuted according to the permutation list. + """ + assert(len(permutation) == 9) + return ''.join(pattern[p] for p in permutation) + + def _pattern_permute(self, basic_pattern, options, basic_result): + """pattern_permute takes a basic pattern and its result and clones + the pattern according to the modifications described in the $options + parameter. It returns a list of all cloned patterns.""" + patterns = [(basic_pattern, basic_result)] + + # rotations + if '4' in options: + res = patterns[-1][1] + for i in range(4): + patterns.append( + (self._string_permute(patterns[-1][0], [6, 3, 0, + 7, 4, 1, + 8, 5, 2]), res)) + # mirror + if 'M' in options: + n = len(patterns) + for pattern, res in patterns[0:n]: + patterns.append( + (self._string_permute(pattern, [2, 1, 0, + 5, 4, 3, + 8, 7, 6]), res)) + + # negate + if 'N' in options: + n = len(patterns) + for pattern, res in patterns[0:n]: + # Swap 0 and 1 + pattern = (pattern + .replace('0', 'Z') + .replace('1', '0') + .replace('Z', '1')) + res = 1-int(res) + patterns.append((pattern, res)) + + return patterns + + def build_lut(self): + """Compile all patterns into a morphology lut. + + TBD :Build based on (file) morphlut:modify_lut + """ + self.build_default_lut() + patterns = [] + + # Parse and create symmetries of the patterns strings + for p in self.patterns: + m = re.search( + r'(\w*):?\s*\((.+?)\)\s*->\s*(\d)', p.replace('\n', '')) + if not m: + raise Exception('Syntax error in pattern "'+p+'"') + options = m.group(1) + pattern = m.group(2) + result = int(m.group(3)) + + # Get rid of spaces + pattern = pattern.replace(' ', '').replace('\n', '') + + patterns += self._pattern_permute(pattern, options, result) + +# # Debugging +# for p, r in patterns: +# print(p, r) +# print('--') + + # compile the patterns into regular expressions for speed + for i, pattern in enumerate(patterns): + p = pattern[0].replace('.', 'X').replace('X', '[01]') + p = re.compile(p) + patterns[i] = (p, pattern[1]) + + # Step through table and find patterns that match. + # Note that all the patterns are searched. The last one + # caught overrides + for i in range(LUT_SIZE): + # Build the bit pattern + bitpattern = bin(i)[2:] + bitpattern = ('0'*(9-len(bitpattern)) + bitpattern)[::-1] + + for p, r in patterns: + if p.match(bitpattern): + self.lut[i] = [0, 1][r] + + return self.lut + + +class MorphOp(object): + """A class for binary morphological operators""" + + def __init__(self, + lut=None, + op_name=None, + patterns=None): + """Create a binary morphological operator""" + self.lut = lut + if op_name is not None: + self.lut = LutBuilder(op_name=op_name).build_lut() + elif patterns is not None: + self.lut = LutBuilder(patterns=patterns).build_lut() + + def apply(self, image): + """Run a single morphological operation on an image + + Returns a tuple of the number of changed pixels and the + morphed image""" + if self.lut is None: + raise Exception('No operator loaded') + + if image.mode != 'L': + raise Exception('Image must be binary, meaning it must use mode L') + outimage = Image.new(image.mode, image.size, None) + count = _imagingmorph.apply( + bytes(self.lut), image.im.id, outimage.im.id) + return count, outimage + + def match(self, image): + """Get a list of coordinates matching the morphological operation on + an image. + + Returns a list of tuples of (x,y) coordinates + of all matching pixels. See :ref:`coordinate-system`.""" + if self.lut is None: + raise Exception('No operator loaded') + + if image.mode != 'L': + raise Exception('Image must be binary, meaning it must use mode L') + return _imagingmorph.match(bytes(self.lut), image.im.id) + + def get_on_pixels(self, image): + """Get a list of all turned on pixels in a binary image + + Returns a list of tuples of (x,y) coordinates + of all matching pixels. See :ref:`coordinate-system`.""" + + if image.mode != 'L': + raise Exception('Image must be binary, meaning it must use mode L') + return _imagingmorph.get_on_pixels(image.im.id) + + def load_lut(self, filename): + """Load an operator from an mrl file""" + with open(filename, 'rb') as f: + self.lut = bytearray(f.read()) + + if len(self.lut) != LUT_SIZE: + self.lut = None + raise Exception('Wrong size operator file!') + + def save_lut(self, filename): + """Save an operator to an mrl file""" + if self.lut is None: + raise Exception('No operator loaded') + with open(filename, 'wb') as f: + f.write(self.lut) + + def set_lut(self, lut): + """Set the lut from an external source""" + self.lut = lut diff --git a/imagecrunch/PIL/ImageOps.py b/imagecrunch/PIL/ImageOps.py new file mode 100644 index 0000000..25d491a --- /dev/null +++ b/imagecrunch/PIL/ImageOps.py @@ -0,0 +1,529 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard image operations +# +# History: +# 2001-10-20 fl Created +# 2001-10-23 fl Added autocontrast operator +# 2001-12-18 fl Added Kevin's fit operator +# 2004-03-14 fl Fixed potential division by zero in equalize +# 2005-05-05 fl Fixed equalize for low number of values +# +# Copyright (c) 2001-2004 by Secret Labs AB +# Copyright (c) 2001-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._util import isStringType +import operator +import functools +import warnings + + +# +# helpers + +def _border(border): + if isinstance(border, tuple): + if len(border) == 2: + left, top = right, bottom = border + elif len(border) == 4: + left, top, right, bottom = border + else: + left = top = right = bottom = border + return left, top, right, bottom + + +def _color(color, mode): + if isStringType(color): + from . import ImageColor + color = ImageColor.getcolor(color, mode) + return color + + +def _lut(image, lut): + if image.mode == "P": + # FIXME: apply to lookup table, not image data + raise NotImplementedError("mode P support coming soon") + elif image.mode in ("L", "RGB"): + if image.mode == "RGB" and len(lut) == 256: + lut = lut + lut + lut + return image.point(lut) + else: + raise IOError("not supported for this image mode") + +# +# actions + + +def autocontrast(image, cutoff=0, ignore=None): + """ + Maximize (normalize) image contrast. This function calculates a + histogram of the input image, removes **cutoff** percent of the + lightest and darkest pixels from the histogram, and remaps the image + so that the darkest pixel becomes black (0), and the lightest + becomes white (255). + + :param image: The image to process. + :param cutoff: How many percent to cut off from the histogram. + :param ignore: The background pixel value (use None for no background). + :return: An image. + """ + histogram = image.histogram() + lut = [] + for layer in range(0, len(histogram), 256): + h = histogram[layer:layer+256] + if ignore is not None: + # get rid of outliers + try: + h[ignore] = 0 + except TypeError: + # assume sequence + for ix in ignore: + h[ix] = 0 + if cutoff: + # cut off pixels from both ends of the histogram + # get number of pixels + n = 0 + for ix in range(256): + n = n + h[ix] + # remove cutoff% pixels from the low end + cut = n * cutoff // 100 + for lo in range(256): + if cut > h[lo]: + cut = cut - h[lo] + h[lo] = 0 + else: + h[lo] -= cut + cut = 0 + if cut <= 0: + break + # remove cutoff% samples from the hi end + cut = n * cutoff // 100 + for hi in range(255, -1, -1): + if cut > h[hi]: + cut = cut - h[hi] + h[hi] = 0 + else: + h[hi] -= cut + cut = 0 + if cut <= 0: + break + # find lowest/highest samples after preprocessing + for lo in range(256): + if h[lo]: + break + for hi in range(255, -1, -1): + if h[hi]: + break + if hi <= lo: + # don't bother + lut.extend(list(range(256))) + else: + scale = 255.0 / (hi - lo) + offset = -lo * scale + for ix in range(256): + ix = int(ix * scale + offset) + if ix < 0: + ix = 0 + elif ix > 255: + ix = 255 + lut.append(ix) + return _lut(image, lut) + + +def colorize(image, black, white): + """ + Colorize grayscale image. The **black** and **white** + arguments should be RGB tuples; this function calculates a color + wedge mapping all black pixels in the source image to the first + color, and all white pixels to the second color. + + :param image: The image to colorize. + :param black: The color to use for black input pixels. + :param white: The color to use for white input pixels. + :return: An image. + """ + assert image.mode == "L" + black = _color(black, "RGB") + white = _color(white, "RGB") + red = [] + green = [] + blue = [] + for i in range(256): + red.append(black[0]+i*(white[0]-black[0])//255) + green.append(black[1]+i*(white[1]-black[1])//255) + blue.append(black[2]+i*(white[2]-black[2])//255) + image = image.convert("RGB") + return _lut(image, red + green + blue) + + +def crop(image, border=0): + """ + Remove border from image. The same amount of pixels are removed + from all four sides. This function works on all image modes. + + .. seealso:: :py:meth:`~PIL.Image.Image.crop` + + :param image: The image to crop. + :param border: The number of pixels to remove. + :return: An image. + """ + left, top, right, bottom = _border(border) + return image.crop( + (left, top, image.size[0]-right, image.size[1]-bottom) + ) + + +def scale(image, factor, resample=Image.NEAREST): + """ + Returns a rescaled image by a specific factor given in parameter. + A factor greater than 1 expands the image, between 0 and 1 contracts the + image. + + :param image: The image to rescale. + :param factor: The expansion factor, as a float. + :param resample: An optional resampling filter. Same values possible as + in the PIL.Image.resize function. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + if factor == 1: + return image.copy() + elif factor <= 0: + raise ValueError("the factor must be greater than 0") + else: + size = (int(round(factor * image.width)), + int(round(factor * image.height))) + return image.resize(size, resample) + + +def deform(image, deformer, resample=Image.BILINEAR): + """ + Deform the image. + + :param image: The image to deform. + :param deformer: A deformer object. Any object that implements a + **getmesh** method can be used. + :param resample: An optional resampling filter. Same values possible as + in the PIL.Image.transform function. + :return: An image. + """ + return image.transform( + image.size, Image.MESH, deformer.getmesh(image), resample + ) + + +def equalize(image, mask=None): + """ + Equalize the image histogram. This function applies a non-linear + mapping to the input image, in order to create a uniform + distribution of grayscale values in the output image. + + :param image: The image to equalize. + :param mask: An optional mask. If given, only the pixels selected by + the mask are included in the analysis. + :return: An image. + """ + if image.mode == "P": + image = image.convert("RGB") + h = image.histogram(mask) + lut = [] + for b in range(0, len(h), 256): + histo = [_f for _f in h[b:b+256] if _f] + if len(histo) <= 1: + lut.extend(list(range(256))) + else: + step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 + if not step: + lut.extend(list(range(256))) + else: + n = step // 2 + for i in range(256): + lut.append(n // step) + n = n + h[i+b] + return _lut(image, lut) + + +def expand(image, border=0, fill=0): + """ + Add border to the image + + :param image: The image to expand. + :param border: Border width, in pixels. + :param fill: Pixel fill value (a color value). Default is 0 (black). + :return: An image. + """ + left, top, right, bottom = _border(border) + width = left + image.size[0] + right + height = top + image.size[1] + bottom + out = Image.new(image.mode, (width, height), _color(fill, image.mode)) + out.paste(image, (left, top)) + return out + + +def fit(image, size, method=Image.NEAREST, bleed=0.0, centering=(0.5, 0.5)): + """ + Returns a sized and cropped version of the image, cropped to the + requested aspect ratio and size. + + This function was contributed by Kevin Cazabon. + + :param image: The image to size and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: What resampling method to use. Default is + :py:attr:`PIL.Image.NEAREST`. + :param bleed: Remove a border around the outside of the image (from all + four edges. The value is a decimal percentage (use 0.01 for + one percent). The default value is 0 (no border). + :param centering: Control the cropping position. Use (0.5, 0.5) for + center cropping (e.g. if cropping the width, take 50% off + of the left side, and therefore 50% off the right side). + (0.0, 0.0) will crop from the top left corner (i.e. if + cropping the width, take all of the crop off of the right + side, and if cropping the height, take all of it off the + bottom). (1.0, 0.0) will crop from the bottom left + corner, etc. (i.e. if cropping the width, take all of the + crop off the left side, and if cropping the height take + none from the top, and therefore all off the bottom). + :return: An image. + """ + + # by Kevin Cazabon, Feb 17/2000 + # kevin@cazabon.com + # http://www.cazabon.com + + # ensure inputs are valid + if not isinstance(centering, list): + centering = [centering[0], centering[1]] + + if centering[0] > 1.0 or centering[0] < 0.0: + centering[0] = 0.50 + if centering[1] > 1.0 or centering[1] < 0.0: + centering[1] = 0.50 + + if bleed > 0.49999 or bleed < 0.0: + bleed = 0.0 + + # calculate the area to use for resizing and cropping, subtracting + # the 'bleed' around the edges + + # number of pixels to trim off on Top and Bottom, Left and Right + bleedPixels = ( + int((float(bleed) * float(image.size[0])) + 0.5), + int((float(bleed) * float(image.size[1])) + 0.5) + ) + + liveArea = (0, 0, image.size[0], image.size[1]) + if bleed > 0.0: + liveArea = ( + bleedPixels[0], bleedPixels[1], image.size[0] - bleedPixels[0] - 1, + image.size[1] - bleedPixels[1] - 1 + ) + + liveSize = (liveArea[2] - liveArea[0], liveArea[3] - liveArea[1]) + + # calculate the aspect ratio of the liveArea + liveAreaAspectRatio = float(liveSize[0])/float(liveSize[1]) + + # calculate the aspect ratio of the output image + aspectRatio = float(size[0]) / float(size[1]) + + # figure out if the sides or top/bottom will be cropped off + if liveAreaAspectRatio >= aspectRatio: + # liveArea is wider than what's needed, crop the sides + cropWidth = int((aspectRatio * float(liveSize[1])) + 0.5) + cropHeight = liveSize[1] + else: + # liveArea is taller than what's needed, crop the top and bottom + cropWidth = liveSize[0] + cropHeight = int((float(liveSize[0])/aspectRatio) + 0.5) + + # make the crop + leftSide = int(liveArea[0] + (float(liveSize[0]-cropWidth) * centering[0])) + if leftSide < 0: + leftSide = 0 + topSide = int(liveArea[1] + (float(liveSize[1]-cropHeight) * centering[1])) + if topSide < 0: + topSide = 0 + + out = image.crop( + (leftSide, topSide, leftSide + cropWidth, topSide + cropHeight) + ) + + # resize the image and return it + return out.resize(size, method) + + +def flip(image): + """ + Flip the image vertically (top to bottom). + + :param image: The image to flip. + :return: An image. + """ + return image.transpose(Image.FLIP_TOP_BOTTOM) + + +def grayscale(image): + """ + Convert the image to grayscale. + + :param image: The image to convert. + :return: An image. + """ + return image.convert("L") + + +def invert(image): + """ + Invert (negate) the image. + + :param image: The image to invert. + :return: An image. + """ + lut = [] + for i in range(256): + lut.append(255-i) + return _lut(image, lut) + + +def mirror(image): + """ + Flip image horizontally (left to right). + + :param image: The image to mirror. + :return: An image. + """ + return image.transpose(Image.FLIP_LEFT_RIGHT) + + +def posterize(image, bits): + """ + Reduce the number of bits for each color channel. + + :param image: The image to posterize. + :param bits: The number of bits to keep for each channel (1-8). + :return: An image. + """ + lut = [] + mask = ~(2**(8-bits)-1) + for i in range(256): + lut.append(i & mask) + return _lut(image, lut) + + +def solarize(image, threshold=128): + """ + Invert all pixel values above a threshold. + + :param image: The image to solarize. + :param threshold: All pixels above this greyscale level are inverted. + :return: An image. + """ + lut = [] + for i in range(256): + if i < threshold: + lut.append(i) + else: + lut.append(255-i) + return _lut(image, lut) + + +# -------------------------------------------------------------------- +# PIL USM components, from Kevin Cazabon. + +def gaussian_blur(im, radius=None): + """ PIL_usm.gblur(im, [radius])""" + + warnings.warn( + 'PIL.ImageOps.gaussian_blur is deprecated. ' + 'Use PIL.ImageFilter.GaussianBlur instead. ' + 'This function will be removed in a future version.', + DeprecationWarning + ) + + if radius is None: + radius = 5.0 + + im.load() + + return im.im.gaussian_blur(radius) + + +def gblur(im, radius=None): + """ PIL_usm.gblur(im, [radius])""" + + warnings.warn( + 'PIL.ImageOps.gblur is deprecated. ' + 'Use PIL.ImageFilter.GaussianBlur instead. ' + 'This function will be removed in a future version.', + DeprecationWarning + ) + + return gaussian_blur(im, radius) + + +def unsharp_mask(im, radius=None, percent=None, threshold=None): + """ PIL_usm.usm(im, [radius, percent, threshold])""" + + warnings.warn( + 'PIL.ImageOps.unsharp_mask is deprecated. ' + 'Use PIL.ImageFilter.UnsharpMask instead. ' + 'This function will be removed in a future version.', + DeprecationWarning + ) + + if radius is None: + radius = 5.0 + if percent is None: + percent = 150 + if threshold is None: + threshold = 3 + + im.load() + + return im.im.unsharp_mask(radius, percent, threshold) + + +def usm(im, radius=None, percent=None, threshold=None): + """ PIL_usm.usm(im, [radius, percent, threshold])""" + + warnings.warn( + 'PIL.ImageOps.usm is deprecated. ' + 'Use PIL.ImageFilter.UnsharpMask instead. ' + 'This function will be removed in a future version.', + DeprecationWarning + ) + + return unsharp_mask(im, radius, percent, threshold) + + +def box_blur(image, radius): + """ + Blur the image by setting each pixel to the average value of the pixels + in a square box extending radius pixels in each direction. + Supports float radius of arbitrary size. Uses an optimized implementation + which runs in linear time relative to the size of the image + for any radius value. + + :param image: The image to blur. + :param radius: Size of the box in one direction. Radius 0 does not blur, + returns an identical image. Radius 1 takes 1 pixel + in each direction, i.e. 9 pixels in total. + :return: An image. + """ + warnings.warn( + 'PIL.ImageOps.box_blur is deprecated. ' + 'Use PIL.ImageFilter.BoxBlur instead. ' + 'This function will be removed in a future version.', + DeprecationWarning + ) + + image.load() + + return image._new(image.im.box_blur(radius)) diff --git a/imagecrunch/PIL/ImagePalette.py b/imagecrunch/PIL/ImagePalette.py new file mode 100644 index 0000000..cecc645 --- /dev/null +++ b/imagecrunch/PIL/ImagePalette.py @@ -0,0 +1,216 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image palette object +# +# History: +# 1996-03-11 fl Rewritten. +# 1997-01-03 fl Up and running. +# 1997-08-23 fl Added load hack +# 2001-04-16 fl Fixed randint shadow bug in random() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import array +from . import ImageColor, GimpPaletteFile, GimpGradientFile, PaletteFile + + +class ImagePalette(object): + """ + Color palette for palette mapped images + + :param mode: The mode to use for the Palette. See: + :ref:`concept-modes`. Defaults to "RGB" + :param palette: An optional palette. If given, it must be a bytearray, + an array or a list of ints between 0-255 and of length ``size`` + times the number of colors in ``mode``. The list must be aligned + by channel (All R values must be contiguous in the list before G + and B values.) Defaults to 0 through 255 per channel. + :param size: An optional palette size. If given, it cannot be equal to + or greater than 256. Defaults to 0. + """ + + def __init__(self, mode="RGB", palette=None, size=0): + self.mode = mode + self.rawmode = None # if set, palette contains raw data + self.palette = palette or bytearray(range(256))*len(self.mode) + self.colors = {} + self.dirty = None + if ((size == 0 and len(self.mode)*256 != len(self.palette)) or + (size != 0 and size != len(self.palette))): + raise ValueError("wrong palette size") + + def copy(self): + new = ImagePalette() + + new.mode = self.mode + new.rawmode = self.rawmode + if self.palette is not None: + new.palette = self.palette[:] + new.colors = self.colors.copy() + new.dirty = self.dirty + + return new + + def getdata(self): + """ + Get palette contents in format suitable # for the low-level + ``im.putpalette`` primitive. + + .. warning:: This method is experimental. + """ + if self.rawmode: + return self.rawmode, self.palette + return self.mode + ";L", self.tobytes() + + def tobytes(self): + """Convert palette to bytes. + + .. warning:: This method is experimental. + """ + if self.rawmode: + raise ValueError("palette contains raw palette data") + if isinstance(self.palette, bytes): + return self.palette + arr = array.array("B", self.palette) + if hasattr(arr, 'tobytes'): + return arr.tobytes() + return arr.tostring() + + # Declare tostring as an alias for tobytes + tostring = tobytes + + def getcolor(self, color): + """Given an rgb tuple, allocate palette entry. + + .. warning:: This method is experimental. + """ + if self.rawmode: + raise ValueError("palette contains raw palette data") + if isinstance(color, tuple): + try: + return self.colors[color] + except KeyError: + # allocate new color slot + if isinstance(self.palette, bytes): + self.palette = bytearray(self.palette) + index = len(self.colors) + if index >= 256: + raise ValueError("cannot allocate more than 256 colors") + self.colors[color] = index + self.palette[index] = color[0] + self.palette[index+256] = color[1] + self.palette[index+512] = color[2] + self.dirty = 1 + return index + else: + raise ValueError("unknown color specifier: %r" % color) + + def save(self, fp): + """Save palette to text file. + + .. warning:: This method is experimental. + """ + if self.rawmode: + raise ValueError("palette contains raw palette data") + if isinstance(fp, str): + fp = open(fp, "w") + fp.write("# Palette\n") + fp.write("# Mode: %s\n" % self.mode) + for i in range(256): + fp.write("%d" % i) + for j in range(i*len(self.mode), (i+1)*len(self.mode)): + try: + fp.write(" %d" % self.palette[j]) + except IndexError: + fp.write(" 0") + fp.write("\n") + fp.close() + + +# -------------------------------------------------------------------- +# Internal + +def raw(rawmode, data): + palette = ImagePalette() + palette.rawmode = rawmode + palette.palette = data + palette.dirty = 1 + return palette + + +# -------------------------------------------------------------------- +# Factories + +def make_linear_lut(black, white): + lut = [] + if black == 0: + for i in range(256): + lut.append(white*i//255) + else: + raise NotImplementedError # FIXME + return lut + + +def make_gamma_lut(exp): + lut = [] + for i in range(256): + lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5)) + return lut + + +def negative(mode="RGB"): + palette = list(range(256)) + palette.reverse() + return ImagePalette(mode, palette * len(mode)) + + +def random(mode="RGB"): + from random import randint + palette = [] + for i in range(256*len(mode)): + palette.append(randint(0, 255)) + return ImagePalette(mode, palette) + + +def sepia(white="#fff0c0"): + r, g, b = ImageColor.getrgb(white) + r = make_linear_lut(0, r) + g = make_linear_lut(0, g) + b = make_linear_lut(0, b) + return ImagePalette("RGB", r + g + b) + + +def wedge(mode="RGB"): + return ImagePalette(mode, list(range(256)) * len(mode)) + + +def load(filename): + + # FIXME: supports GIMP gradients only + + with open(filename, "rb") as fp: + + for paletteHandler in [ + GimpPaletteFile.GimpPaletteFile, + GimpGradientFile.GimpGradientFile, + PaletteFile.PaletteFile + ]: + try: + fp.seek(0) + lut = paletteHandler(fp).getpalette() + if lut: + break + except (SyntaxError, ValueError): + # import traceback + # traceback.print_exc() + pass + else: + raise IOError("cannot load palette") + + return lut # data, rawmode diff --git a/imagecrunch/PIL/ImagePath.py b/imagecrunch/PIL/ImagePath.py new file mode 100644 index 0000000..8cbfec0 --- /dev/null +++ b/imagecrunch/PIL/ImagePath.py @@ -0,0 +1,20 @@ +# +# The Python Imaging Library +# $Id$ +# +# path interface +# +# History: +# 1996-11-04 fl Created +# 2002-04-14 fl Added documentation stub class +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +Path = Image.core.path diff --git a/imagecrunch/PIL/ImageQt.py b/imagecrunch/PIL/ImageQt.py new file mode 100644 index 0000000..c9dc363 --- /dev/null +++ b/imagecrunch/PIL/ImageQt.py @@ -0,0 +1,212 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a simple Qt image interface. +# +# history: +# 2006-06-03 fl: created +# 2006-06-04 fl: inherit from QImage instead of wrapping it +# 2006-06-05 fl: removed toimage helper; move string support to ImageQt +# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) +# +# Copyright (c) 2006 by Secret Labs AB +# Copyright (c) 2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image +from ._util import isPath, py3 +from io import BytesIO +import sys + +qt_versions = [ + ['5', 'PyQt5'], + ['4', 'PyQt4'], + ['side', 'PySide'] +] +# If a version has already been imported, attempt it first +qt_versions.sort(key=lambda qt_version: qt_version[1] in sys.modules, reverse=True) +for qt_version, qt_module in qt_versions: + try: + if qt_module == 'PyQt5': + from PyQt5.QtGui import QImage, qRgba, QPixmap + from PyQt5.QtCore import QBuffer, QIODevice + elif qt_module == 'PyQt4': + from PyQt4.QtGui import QImage, qRgba, QPixmap + from PyQt4.QtCore import QBuffer, QIODevice + elif qt_module == 'PySide': + from PySide.QtGui import QImage, qRgba, QPixmap + from PySide.QtCore import QBuffer, QIODevice + except (ImportError, RuntimeError): + continue + qt_is_installed = True + break +else: + qt_is_installed = False + qt_version = None + + +def rgb(r, g, b, a=255): + """(Internal) Turns an RGB color into a Qt compatible color integer.""" + # use qRgb to pack the colors, and then turn the resulting long + # into a negative integer with the same bitpattern. + return (qRgba(r, g, b, a) & 0xffffffff) + + +def fromqimage(im): + """ + :param im: A PIL Image object, or a file name + (given either as Python string or a PyQt string object) + """ + buffer = QBuffer() + buffer.open(QIODevice.ReadWrite) + # preserve alha channel with png + # otherwise ppm is more friendly with Image.open + if im.hasAlphaChannel(): + im.save(buffer, 'png') + else: + im.save(buffer, 'ppm') + + b = BytesIO() + try: + b.write(buffer.data()) + except TypeError: + # workaround for Python 2 + b.write(str(buffer.data())) + buffer.close() + b.seek(0) + + return Image.open(b) + + +def fromqpixmap(im): + return fromqimage(im) + # buffer = QBuffer() + # buffer.open(QIODevice.ReadWrite) + # # im.save(buffer) + # # What if png doesn't support some image features like animation? + # im.save(buffer, 'ppm') + # bytes_io = BytesIO() + # bytes_io.write(buffer.data()) + # buffer.close() + # bytes_io.seek(0) + # return Image.open(bytes_io) + + +def align8to32(bytes, width, mode): + """ + converts each scanline of data from 8 bit to 32 bit aligned + """ + + bits_per_pixel = { + '1': 1, + 'L': 8, + 'P': 8, + }[mode] + + # calculate bytes per line and the extra padding if needed + bits_per_line = bits_per_pixel * width + full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8) + bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0) + + extra_padding = -bytes_per_line % 4 + + # already 32 bit aligned by luck + if not extra_padding: + return bytes + + new_data = [] + for i in range(len(bytes) // bytes_per_line): + new_data.append(bytes[i*bytes_per_line:(i+1)*bytes_per_line] + b'\x00' * extra_padding) + + return b''.join(new_data) + + +def _toqclass_helper(im): + data = None + colortable = None + + # handle filename, if given instead of image name + if hasattr(im, "toUtf8"): + # FIXME - is this really the best way to do this? + if py3: + im = str(im.toUtf8(), "utf-8") + else: + im = unicode(im.toUtf8(), "utf-8") + if isPath(im): + im = Image.open(im) + + if im.mode == "1": + format = QImage.Format_Mono + elif im.mode == "L": + format = QImage.Format_Indexed8 + colortable = [] + for i in range(256): + colortable.append(rgb(i, i, i)) + elif im.mode == "P": + format = QImage.Format_Indexed8 + colortable = [] + palette = im.getpalette() + for i in range(0, len(palette), 3): + colortable.append(rgb(*palette[i:i+3])) + elif im.mode == "RGB": + data = im.tobytes("raw", "BGRX") + format = QImage.Format_RGB32 + elif im.mode == "RGBA": + try: + data = im.tobytes("raw", "BGRA") + except SystemError: + # workaround for earlier versions + r, g, b, a = im.split() + im = Image.merge("RGBA", (b, g, r, a)) + format = QImage.Format_ARGB32 + else: + raise ValueError("unsupported image mode %r" % im.mode) + + __data = data or align8to32(im.tobytes(), im.size[0], im.mode) + return { + 'data': __data, 'im': im, 'format': format, 'colortable': colortable + } + + +if qt_is_installed: + class ImageQt(QImage): + + def __init__(self, im): + """ + An PIL image wrapper for Qt. This is a subclass of PyQt's QImage + class. + + :param im: A PIL Image object, or a file name (given either as Python + string or a PyQt string object). + """ + im_data = _toqclass_helper(im) + # must keep a reference, or Qt will crash! + # All QImage constructors that take data operate on an existing + # buffer, so this buffer has to hang on for the life of the image. + # Fixes https://github.com/python-pillow/Pillow/issues/1370 + self.__data = im_data['data'] + QImage.__init__(self, + self.__data, im_data['im'].size[0], + im_data['im'].size[1], im_data['format']) + if im_data['colortable']: + self.setColorTable(im_data['colortable']) + + +def toqimage(im): + return ImageQt(im) + + +def toqpixmap(im): + # # This doesn't work. For now using a dumb approach. + # im_data = _toqclass_helper(im) + # result = QPixmap(im_data['im'].size[0], im_data['im'].size[1]) + # result.loadFromData(im_data['data']) + # Fix some strange bug that causes + if im.mode == 'RGB': + im = im.convert('RGBA') + + qimage = toqimage(im) + return QPixmap.fromImage(qimage) diff --git a/imagecrunch/PIL/ImageSequence.py b/imagecrunch/PIL/ImageSequence.py new file mode 100644 index 0000000..1fc6e5d --- /dev/null +++ b/imagecrunch/PIL/ImageSequence.py @@ -0,0 +1,56 @@ +# +# The Python Imaging Library. +# $Id$ +# +# sequence support classes +# +# history: +# 1997-02-20 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## + + +class Iterator(object): + """ + This class implements an iterator object that can be used to loop + over an image sequence. + + You can use the ``[]`` operator to access elements by index. This operator + will raise an :py:exc:`IndexError` if you try to access a nonexistent + frame. + + :param im: An image object. + """ + + def __init__(self, im): + if not hasattr(im, "seek"): + raise AttributeError("im must have seek method") + self.im = im + self.position = 0 + + def __getitem__(self, ix): + try: + self.im.seek(ix) + return self.im + except EOFError: + raise IndexError # end of sequence + + def __iter__(self): + return self + + def __next__(self): + try: + self.im.seek(self.position) + self.position += 1 + return self.im + except EOFError: + raise StopIteration + + def next(self): + return self.__next__() diff --git a/imagecrunch/PIL/ImageShow.py b/imagecrunch/PIL/ImageShow.py new file mode 100644 index 0000000..b50d613 --- /dev/null +++ b/imagecrunch/PIL/ImageShow.py @@ -0,0 +1,194 @@ +# +# The Python Imaging Library. +# $Id$ +# +# im.show() drivers +# +# History: +# 2008-04-06 fl Created +# +# Copyright (c) Secret Labs AB 2008. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +from PIL import Image +import os +import sys + +if sys.version_info.major >= 3: + from shlex import quote +else: + from pipes import quote + +_viewers = [] + + +def register(viewer, order=1): + try: + if issubclass(viewer, Viewer): + viewer = viewer() + except TypeError: + pass # raised if viewer wasn't a class + if order > 0: + _viewers.append(viewer) + elif order < 0: + _viewers.insert(0, viewer) + + +def show(image, title=None, **options): + r""" + Display a given image. + + :param image: An image object. + :param title: Optional title. Not all viewers can display the title. + :param \**options: Additional viewer options. + :returns: True if a suitable viewer was found, false otherwise. + """ + for viewer in _viewers: + if viewer.show(image, title=title, **options): + return 1 + return 0 + + +class Viewer(object): + """Base class for viewers.""" + + # main api + + def show(self, image, **options): + + # save temporary image to disk + if image.mode[:4] == "I;16": + # @PIL88 @PIL101 + # "I;16" isn't an 'official' mode, but we still want to + # provide a simple way to show 16-bit images. + base = "L" + # FIXME: auto-contrast if max() > 255? + else: + base = Image.getmodebase(image.mode) + if base != image.mode and image.mode != "1" and image.mode != "RGBA": + image = image.convert(base) + + return self.show_image(image, **options) + + # hook methods + + format = None + options = {} + + def get_format(self, image): + """Return format name, or None to save as PGM/PPM""" + return self.format + + def get_command(self, file, **options): + raise NotImplementedError + + def save_image(self, image): + """Save to temporary file, and return filename""" + return image._dump(format=self.get_format(image), **self.options) + + def show_image(self, image, **options): + """Display given image""" + return self.show_file(self.save_image(image), **options) + + def show_file(self, file, **options): + """Display given file""" + os.system(self.get_command(file, **options)) + return 1 + +# -------------------------------------------------------------------- + + +if sys.platform == "win32": + + class WindowsViewer(Viewer): + format = "BMP" + + def get_command(self, file, **options): + return ('start "Pillow" /WAIT "%s" ' + '&& ping -n 2 127.0.0.1 >NUL ' + '&& del /f "%s"' % (file, file)) + + register(WindowsViewer) + +elif sys.platform == "darwin": + + class MacViewer(Viewer): + format = "PNG" + options = {'compress_level': 1} + + def get_command(self, file, **options): + # on darwin open returns immediately resulting in the temp + # file removal while app is opening + command = "open -a /Applications/Preview.app" + command = "(%s %s; sleep 20; rm -f %s)&" % (command, quote(file), + quote(file)) + return command + + register(MacViewer) + +else: + + # unixoids + + def which(executable): + path = os.environ.get("PATH") + if not path: + return None + for dirname in path.split(os.pathsep): + filename = os.path.join(dirname, executable) + if os.path.isfile(filename) and os.access(filename, os.X_OK): + return filename + return None + + class UnixViewer(Viewer): + format = "PNG" + options = {'compress_level': 1} + + def show_file(self, file, **options): + command, executable = self.get_command_ex(file, **options) + command = "(%s %s; rm -f %s)&" % (command, quote(file), + quote(file)) + os.system(command) + return 1 + + # implementations + + class DisplayViewer(UnixViewer): + def get_command_ex(self, file, **options): + command = executable = "display" + return command, executable + + if which("display"): + register(DisplayViewer) + + class EogViewer(UnixViewer): + def get_command_ex(self, file, **options): + command = executable = "eog" + return command, executable + + if which("eog"): + register(EogViewer) + + class XVViewer(UnixViewer): + def get_command_ex(self, file, title=None, **options): + # note: xv is pretty outdated. most modern systems have + # imagemagick's display command instead. + command = executable = "xv" + if title: + command += " -name %s" % quote(title) + return command, executable + + if which("xv"): + register(XVViewer) + +if __name__ == "__main__": + + if len(sys.argv) < 2: + print("Syntax: python ImageShow.py imagefile [title]") + sys.exit() + + print(show(Image.open(sys.argv[1]), *sys.argv[2:])) diff --git a/imagecrunch/PIL/ImageStat.py b/imagecrunch/PIL/ImageStat.py new file mode 100644 index 0000000..cd58fc8 --- /dev/null +++ b/imagecrunch/PIL/ImageStat.py @@ -0,0 +1,148 @@ +# +# The Python Imaging Library. +# $Id$ +# +# global image statistics +# +# History: +# 1996-04-05 fl Created +# 1997-05-21 fl Added mask; added rms, var, stddev attributes +# 1997-08-05 fl Added median +# 1998-07-05 hk Fixed integer overflow error +# +# Notes: +# This class shows how to implement delayed evaluation of attributes. +# To get a certain value, simply access the corresponding attribute. +# The __getattr__ dispatcher takes care of the rest. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996-97. +# +# See the README file for information on usage and redistribution. +# + +import math +import operator +import functools + + +class Stat(object): + + def __init__(self, image_or_list, mask=None): + try: + if mask: + self.h = image_or_list.histogram(mask) + else: + self.h = image_or_list.histogram() + except AttributeError: + self.h = image_or_list # assume it to be a histogram list + if not isinstance(self.h, list): + raise TypeError("first argument must be image or list") + self.bands = list(range(len(self.h) // 256)) + + def __getattr__(self, id): + "Calculate missing attribute" + if id[:4] == "_get": + raise AttributeError(id) + # calculate missing attribute + v = getattr(self, "_get" + id)() + setattr(self, id, v) + return v + + def _getextrema(self): + "Get min/max values for each band in the image" + + def minmax(histogram): + n = 255 + x = 0 + for i in range(256): + if histogram[i]: + n = min(n, i) + x = max(x, i) + return n, x # returns (255, 0) if there's no data in the histogram + + v = [] + for i in range(0, len(self.h), 256): + v.append(minmax(self.h[i:])) + return v + + def _getcount(self): + "Get total number of pixels in each layer" + + v = [] + for i in range(0, len(self.h), 256): + v.append(functools.reduce(operator.add, self.h[i:i+256])) + return v + + def _getsum(self): + "Get sum of all pixels in each layer" + + v = [] + for i in range(0, len(self.h), 256): + layerSum = 0.0 + for j in range(256): + layerSum += j * self.h[i + j] + v.append(layerSum) + return v + + def _getsum2(self): + "Get squared sum of all pixels in each layer" + + v = [] + for i in range(0, len(self.h), 256): + sum2 = 0.0 + for j in range(256): + sum2 += (j ** 2) * float(self.h[i + j]) + v.append(sum2) + return v + + def _getmean(self): + "Get average pixel level for each layer" + + v = [] + for i in self.bands: + v.append(self.sum[i] / self.count[i]) + return v + + def _getmedian(self): + "Get median pixel level for each layer" + + v = [] + for i in self.bands: + s = 0 + l = self.count[i]//2 + b = i * 256 + for j in range(256): + s = s + self.h[b+j] + if s > l: + break + v.append(j) + return v + + def _getrms(self): + "Get RMS for each layer" + + v = [] + for i in self.bands: + v.append(math.sqrt(self.sum2[i] / self.count[i])) + return v + + def _getvar(self): + "Get variance for each layer" + + v = [] + for i in self.bands: + n = self.count[i] + v.append((self.sum2[i]-(self.sum[i]**2.0)/n)/n) + return v + + def _getstddev(self): + "Get standard deviation for each layer" + + v = [] + for i in self.bands: + v.append(math.sqrt(self.var[i])) + return v + + +Global = Stat # compatibility diff --git a/imagecrunch/PIL/ImageTk.py b/imagecrunch/PIL/ImageTk.py new file mode 100644 index 0000000..b5ad53d --- /dev/null +++ b/imagecrunch/PIL/ImageTk.py @@ -0,0 +1,303 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Tk display interface +# +# History: +# 96-04-08 fl Created +# 96-09-06 fl Added getimage method +# 96-11-01 fl Rewritten, removed image attribute and crop method +# 97-05-09 fl Use PyImagingPaste method instead of image type +# 97-05-12 fl Minor tweaks to match the IFUNC95 interface +# 97-05-17 fl Support the "pilbitmap" booster patch +# 97-06-05 fl Added file= and data= argument to image constructors +# 98-03-09 fl Added width and height methods to Image classes +# 98-07-02 fl Use default mode for "P" images without palette attribute +# 98-07-02 fl Explicitly destroy Tkinter image objects +# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) +# 99-07-26 fl Automatically hook into Tkinter (if possible) +# 99-08-15 fl Hook uses _imagingtk instead of _imaging +# +# Copyright (c) 1997-1999 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import sys + +if sys.version_info.major > 2: + import tkinter +else: + import Tkinter as tkinter + +# required for pypy, which always has cffi installed +try: + from cffi import FFI + ffi = FFI() +except ImportError: + pass + +from . import Image +from io import BytesIO + + +# -------------------------------------------------------------------- +# Check for Tkinter interface hooks + +_pilbitmap_ok = None + + +def _pilbitmap_check(): + global _pilbitmap_ok + if _pilbitmap_ok is None: + try: + im = Image.new("1", (1, 1)) + tkinter.BitmapImage(data="PIL:%d" % im.im.id) + _pilbitmap_ok = 1 + except tkinter.TclError: + _pilbitmap_ok = 0 + return _pilbitmap_ok + + +def _get_image_from_kw(kw): + source = None + if "file" in kw: + source = kw.pop("file") + elif "data" in kw: + source = BytesIO(kw.pop("data")) + if source: + return Image.open(source) + + +# -------------------------------------------------------------------- +# PhotoImage + +class PhotoImage(object): + """ + A Tkinter-compatible photo image. This can be used + everywhere Tkinter expects an image object. If the image is an RGBA + image, pixels having alpha 0 are treated as transparent. + + The constructor takes either a PIL image, or a mode and a size. + Alternatively, you can use the **file** or **data** options to initialize + the photo image object. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. + :param size: If the first argument is a mode string, this defines the size + of the image. + :keyword file: A filename to load the image from (using + ``Image.open(file)``). + :keyword data: An 8-bit string containing image data (as loaded from an + image file). + """ + + def __init__(self, image=None, size=None, **kw): + + # Tk compatibility: file or data + if image is None: + image = _get_image_from_kw(kw) + + if hasattr(image, "mode") and hasattr(image, "size"): + # got an image instead of a mode + mode = image.mode + if mode == "P": + # palette mapped data + image.load() + try: + mode = image.palette.mode + except AttributeError: + mode = "RGB" # default + size = image.size + kw["width"], kw["height"] = size + else: + mode = image + image = None + + if mode not in ["1", "L", "RGB", "RGBA"]: + mode = Image.getmodebase(mode) + + self.__mode = mode + self.__size = size + self.__photo = tkinter.PhotoImage(**kw) + self.tk = self.__photo.tk + if image: + self.paste(image) + + def __del__(self): + name = self.__photo.name + self.__photo.name = None + try: + self.__photo.tk.call("image", "delete", name) + except: + pass # ignore internal errors + + def __str__(self): + """ + Get the Tkinter photo image identifier. This method is automatically + called by Tkinter whenever a PhotoImage object is passed to a Tkinter + method. + + :return: A Tkinter photo image identifier (a string). + """ + return str(self.__photo) + + def width(self): + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self): + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def paste(self, im, box=None): + """ + Paste a PIL image into the photo image. Note that this can + be very slow if the photo image is displayed. + + :param im: A PIL image. The size must match the target region. If the + mode does not match, the image is converted to the mode of + the bitmap image. + :param box: A 4-tuple defining the left, upper, right, and lower pixel + coordinate. See :ref:`coordinate-system`. If None is given + instead of a tuple, all of the image is assumed. + """ + + # convert to blittable + im.load() + image = im.im + if image.isblock() and im.mode == self.__mode: + block = image + else: + block = image.new_block(self.__mode, im.size) + image.convert2(block, image) # convert directly between buffers + + tk = self.__photo.tk + + try: + tk.call("PyImagingPhoto", self.__photo, block.id) + except tkinter.TclError: + # activate Tkinter hook + try: + from . import _imagingtk + try: + if hasattr(tk, 'interp'): + # Pypy is using a ffi cdata element + # (Pdb) self.tk.interp + # + _imagingtk.tkinit(int(ffi.cast("uintptr_t", tk.interp)), 1) + else: + _imagingtk.tkinit(tk.interpaddr(), 1) + except AttributeError: + _imagingtk.tkinit(id(tk), 0) + tk.call("PyImagingPhoto", self.__photo, block.id) + except (ImportError, AttributeError, tkinter.TclError): + raise # configuration problem; cannot attach to Tkinter + +# -------------------------------------------------------------------- +# BitmapImage + + +class BitmapImage(object): + """ + A Tkinter-compatible bitmap image. This can be used everywhere Tkinter + expects an image object. + + The given image must have mode "1". Pixels having value 0 are treated as + transparent. Options, if any, are passed on to Tkinter. The most commonly + used option is **foreground**, which is used to specify the color for the + non-transparent parts. See the Tkinter documentation for information on + how to specify colours. + + :param image: A PIL image. + """ + + def __init__(self, image=None, **kw): + + # Tk compatibility: file or data + if image is None: + image = _get_image_from_kw(kw) + + self.__mode = image.mode + self.__size = image.size + + if _pilbitmap_check(): + # fast way (requires the pilbitmap booster patch) + image.load() + kw["data"] = "PIL:%d" % image.im.id + self.__im = image # must keep a reference + else: + # slow but safe way + kw["data"] = image.tobitmap() + self.__photo = tkinter.BitmapImage(**kw) + + def __del__(self): + name = self.__photo.name + self.__photo.name = None + try: + self.__photo.tk.call("image", "delete", name) + except: + pass # ignore internal errors + + def width(self): + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self): + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def __str__(self): + """ + Get the Tkinter bitmap image identifier. This method is automatically + called by Tkinter whenever a BitmapImage object is passed to a Tkinter + method. + + :return: A Tkinter bitmap image identifier (a string). + """ + return str(self.__photo) + + +def getimage(photo): + """ This function is unimplemented """ + + """Copies the contents of a PhotoImage to a PIL image memory.""" + photo.tk.call("PyImagingPhotoGet", photo) + + +def _show(image, title): + """Helper for the Image.show method.""" + + class UI(tkinter.Label): + def __init__(self, master, im): + if im.mode == "1": + self.image = BitmapImage(im, foreground="white", master=master) + else: + self.image = PhotoImage(im, master=master) + tkinter.Label.__init__(self, master, image=self.image, + bg="black", bd=0) + + if not tkinter._default_root: + raise IOError("tkinter not initialized") + top = tkinter.Toplevel() + if title: + top.title(title) + UI(top, image).pack() diff --git a/imagecrunch/PIL/ImageTransform.py b/imagecrunch/PIL/ImageTransform.py new file mode 100644 index 0000000..c3f6af8 --- /dev/null +++ b/imagecrunch/PIL/ImageTransform.py @@ -0,0 +1,98 @@ +# +# The Python Imaging Library. +# $Id$ +# +# transform wrappers +# +# History: +# 2002-04-08 fl Created +# +# Copyright (c) 2002 by Secret Labs AB +# Copyright (c) 2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +class Transform(Image.ImageTransformHandler): + def __init__(self, data): + self.data = data + + def getdata(self): + return self.method, self.data + + def transform(self, size, image, **options): + # can be overridden + method, data = self.getdata() + return image.transform(size, method, data, **options) + + +class AffineTransform(Transform): + """ + Define an affine image transform. + + This function takes a 6-tuple (a, b, c, d, e, f) which contain the first + two rows from an affine transform matrix. For each pixel (x, y) in the + output image, the new value is taken from a position (a x + b y + c, + d x + e y + f) in the input image, rounded to nearest pixel. + + This function can be used to scale, translate, rotate, and shear the + original image. + + See :py:meth:`~PIL.Image.Image.transform` + + :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows + from an affine transform matrix. + """ + method = Image.AFFINE + + +class ExtentTransform(Transform): + """ + Define a transform to extract a subregion from an image. + + Maps a rectangle (defined by two corners) from the image to a rectangle of + the given size. The resulting image will contain data sampled from between + the corners, such that (x0, y0) in the input image will end up at (0,0) in + the output image, and (x1, y1) at size. + + This method can be used to crop, stretch, shrink, or mirror an arbitrary + rectangle in the current image. It is slightly slower than crop, but about + as fast as a corresponding resize operation. + + See :py:meth:`~PIL.Image.Image.transform` + + :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the + input image's coordinate system. See :ref:`coordinate-system`. + """ + method = Image.EXTENT + + +class QuadTransform(Transform): + """ + Define a quad image transform. + + Maps a quadrilateral (a region defined by four corners) from the image to a + rectangle of the given size. + + See :py:meth:`~PIL.Image.Image.transform` + + :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the + upper left, lower left, lower right, and upper right corner of the + source quadrilateral. + """ + method = Image.QUAD + + +class MeshTransform(Transform): + """ + Define a mesh image transform. A mesh transform consists of one or more + individual quad transforms. + + See :py:meth:`~PIL.Image.Image.transform` + + :param data: A list of (bbox, quad) tuples. + """ + method = Image.MESH diff --git a/imagecrunch/PIL/ImageWin.py b/imagecrunch/PIL/ImageWin.py new file mode 100644 index 0000000..9b86270 --- /dev/null +++ b/imagecrunch/PIL/ImageWin.py @@ -0,0 +1,228 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Windows DIB display interface +# +# History: +# 1996-05-20 fl Created +# 1996-09-20 fl Fixed subregion exposure +# 1997-09-21 fl Added draw primitive (for tzPrint) +# 2003-05-21 fl Added experimental Window/ImageWindow classes +# 2003-09-05 fl Added fromstring/tostring methods +# +# Copyright (c) Secret Labs AB 1997-2003. +# Copyright (c) Fredrik Lundh 1996-2003. +# +# See the README file for information on usage and redistribution. +# + +from . import Image + + +class HDC(object): + """ + Wraps an HDC integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods. + """ + def __init__(self, dc): + self.dc = dc + + def __int__(self): + return self.dc + + +class HWND(object): + """ + Wraps an HWND integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods, instead of a DC. + """ + def __init__(self, wnd): + self.wnd = wnd + + def __int__(self): + return self.wnd + + +class Dib(object): + """ + A Windows bitmap with the given mode and size. The mode can be one of "1", + "L", "P", or "RGB". + + If the display requires a palette, this constructor creates a suitable + palette and associates it with the image. For an "L" image, 128 greylevels + are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together + with 20 greylevels. + + To make sure that palettes work properly under Windows, you must call the + **palette** method upon certain events from Windows. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. The mode can be one of "1", + "L", "P", or "RGB". + :param size: If the first argument is a mode string, this + defines the size of the image. + """ + + def __init__(self, image, size=None): + if hasattr(image, "mode") and hasattr(image, "size"): + mode = image.mode + size = image.size + else: + mode = image + image = None + if mode not in ["1", "L", "P", "RGB"]: + mode = Image.getmodebase(mode) + self.image = Image.core.display(mode, size) + self.mode = mode + self.size = size + if image: + self.paste(image) + + def expose(self, handle): + """ + Copy the bitmap contents to a device context. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. In PythonWin, you can use the + :py:meth:`CDC.GetHandleAttrib` to get a suitable handle. + """ + if isinstance(handle, HWND): + dc = self.image.getdc(handle) + try: + result = self.image.expose(dc) + finally: + self.image.releasedc(handle, dc) + else: + result = self.image.expose(handle) + return result + + def draw(self, handle, dst, src=None): + """ + Same as expose, but allows you to specify where to draw the image, and + what part of it to draw. + + The destination and source areas are given as 4-tuple rectangles. If + the source is omitted, the entire image is copied. If the source and + the destination have different sizes, the image is resized as + necessary. + """ + if not src: + src = (0, 0) + self.size + if isinstance(handle, HWND): + dc = self.image.getdc(handle) + try: + result = self.image.draw(dc, dst, src) + finally: + self.image.releasedc(handle, dc) + else: + result = self.image.draw(handle, dst, src) + return result + + def query_palette(self, handle): + """ + Installs the palette associated with the image in the given device + context. + + This method should be called upon **QUERYNEWPALETTE** and + **PALETTECHANGED** events from Windows. If this method returns a + non-zero value, one or more display palette entries were changed, and + the image should be redrawn. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. + :return: A true value if one or more entries were changed (this + indicates that the image should be redrawn). + """ + if isinstance(handle, HWND): + handle = self.image.getdc(handle) + try: + result = self.image.query_palette(handle) + finally: + self.image.releasedc(handle, handle) + else: + result = self.image.query_palette(handle) + return result + + def paste(self, im, box=None): + """ + Paste a PIL image into the bitmap image. + + :param im: A PIL image. The size must match the target region. + If the mode does not match, the image is converted to the + mode of the bitmap image. + :param box: A 4-tuple defining the left, upper, right, and + lower pixel coordinate. See :ref:`coordinate-system`. If + None is given instead of a tuple, all of the image is + assumed. + """ + im.load() + if self.mode != im.mode: + im = im.convert(self.mode) + if box: + self.image.paste(im.im, box) + else: + self.image.paste(im.im) + + def frombytes(self, buffer): + """ + Load display memory contents from byte data. + + :param buffer: A buffer containing display data (usually + data returned from tobytes) + """ + return self.image.frombytes(buffer) + + def tobytes(self): + """ + Copy display memory contents to bytes object. + + :return: A bytes object containing display data. + """ + return self.image.tobytes() + + +class Window(object): + """Create a Window with the given title size.""" + + def __init__(self, title="PIL", width=None, height=None): + self.hwnd = Image.core.createwindow( + title, self.__dispatcher, width or 0, height or 0 + ) + + def __dispatcher(self, action, *args): + return getattr(self, "ui_handle_" + action)(*args) + + def ui_handle_clear(self, dc, x0, y0, x1, y1): + pass + + def ui_handle_damage(self, x0, y0, x1, y1): + pass + + def ui_handle_destroy(self): + pass + + def ui_handle_repair(self, dc, x0, y0, x1, y1): + pass + + def ui_handle_resize(self, width, height): + pass + + def mainloop(self): + Image.core.eventloop() + + +class ImageWindow(Window): + """Create an image window which displays the given image.""" + + def __init__(self, image, title="PIL"): + if not isinstance(image, Dib): + image = Dib(image) + self.image = image + width, height = image.size + Window.__init__(self, title, width=width, height=height) + + def ui_handle_repair(self, dc, x0, y0, x1, y1): + self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/imagecrunch/PIL/ImtImagePlugin.py b/imagecrunch/PIL/ImtImagePlugin.py new file mode 100644 index 0000000..05e8cd3 --- /dev/null +++ b/imagecrunch/PIL/ImtImagePlugin.py @@ -0,0 +1,95 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IM Tools support for PIL +# +# history: +# 1996-05-27 fl Created (read 8-bit images only) +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# + + +import re + +from . import Image, ImageFile + +__version__ = "0.2" + + +# +# -------------------------------------------------------------------- + +field = re.compile(br"([a-z]*) ([^ \r\n]*)") + + +## +# Image plugin for IM Tools images. + +class ImtImageFile(ImageFile.ImageFile): + + format = "IMT" + format_description = "IM Tools" + + def _open(self): + + # Quick rejection: if there's not a LF among the first + # 100 bytes, this is (probably) not a text header. + + if b"\n" not in self.fp.read(100): + raise SyntaxError("not an IM file") + self.fp.seek(0) + + xsize = ysize = 0 + + while True: + + s = self.fp.read(1) + if not s: + break + + if s == b'\x0C': + + # image data begins + self.tile = [("raw", (0, 0)+self.size, + self.fp.tell(), + (self.mode, 0, 1))] + + break + + else: + + # read key/value pair + # FIXME: dangerous, may read whole file + s = s + self.fp.readline() + if len(s) == 1 or len(s) > 100: + break + if s[0] == ord(b"*"): + continue # comment + + m = field.match(s) + if not m: + break + k, v = m.group(1, 2) + if k == "width": + xsize = int(v) + self.size = xsize, ysize + elif k == "height": + ysize = int(v) + self.size = xsize, ysize + elif k == "pixel" and v == "n8": + self.mode = "L" + + +# +# -------------------------------------------------------------------- + +Image.register_open(ImtImageFile.format, ImtImageFile) + +# +# no extension registered (".im" is simply too common) diff --git a/imagecrunch/PIL/IptcImagePlugin.py b/imagecrunch/PIL/IptcImagePlugin.py new file mode 100644 index 0000000..f5a8de1 --- /dev/null +++ b/imagecrunch/PIL/IptcImagePlugin.py @@ -0,0 +1,257 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IPTC/NAA file handling +# +# history: +# 1995-10-01 fl Created +# 1998-03-09 fl Cleaned up and added to PIL +# 2002-06-18 fl Added getiptcinfo helper +# +# Copyright (c) Secret Labs AB 1997-2002. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +from . import Image, ImageFile +from ._binary import i8, i16be as i16, i32be as i32, o8 +import os +import tempfile + +__version__ = "0.3" + +COMPRESSION = { + 1: "raw", + 5: "jpeg" +} + +PAD = o8(0) * 4 + + +# +# Helpers + +def i(c): + return i32((PAD + c)[-4:]) + + +def dump(c): + for i in c: + print("%02x" % i8(i), end=' ') + print() + + +## +# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields +# from TIFF and JPEG files, use the getiptcinfo function. + +class IptcImageFile(ImageFile.ImageFile): + + format = "IPTC" + format_description = "IPTC/NAA" + + def getint(self, key): + return i(self.info[key]) + + def field(self): + # + # get a IPTC field header + s = self.fp.read(5) + if not len(s): + return None, 0 + + tag = i8(s[1]), i8(s[2]) + + # syntax + if i8(s[0]) != 0x1C or tag[0] < 1 or tag[0] > 9: + raise SyntaxError("invalid IPTC/NAA file") + + # field size + size = i8(s[3]) + if size > 132: + raise IOError("illegal field length in IPTC/NAA file") + elif size == 128: + size = 0 + elif size > 128: + size = i(self.fp.read(size-128)) + else: + size = i16(s[3:]) + + return tag, size + + def _open(self): + + # load descriptive fields + while True: + offset = self.fp.tell() + tag, size = self.field() + if not tag or tag == (8, 10): + break + if size: + tagdata = self.fp.read(size) + else: + tagdata = None + if tag in self.info: + if isinstance(self.info[tag], list): + self.info[tag].append(tagdata) + else: + self.info[tag] = [self.info[tag], tagdata] + else: + self.info[tag] = tagdata + + # print(tag, self.info[tag]) + + # mode + layers = i8(self.info[(3, 60)][0]) + component = i8(self.info[(3, 60)][1]) + if (3, 65) in self.info: + id = i8(self.info[(3, 65)][0])-1 + else: + id = 0 + if layers == 1 and not component: + self.mode = "L" + elif layers == 3 and component: + self.mode = "RGB"[id] + elif layers == 4 and component: + self.mode = "CMYK"[id] + + # size + self.size = self.getint((3, 20)), self.getint((3, 30)) + + # compression + try: + compression = COMPRESSION[self.getint((3, 120))] + except KeyError: + raise IOError("Unknown IPTC image compression") + + # tile + if tag == (8, 10): + self.tile = [("iptc", (compression, offset), + (0, 0, self.size[0], self.size[1]))] + + def load(self): + + if len(self.tile) != 1 or self.tile[0][0] != "iptc": + return ImageFile.ImageFile.load(self) + + type, tile, box = self.tile[0] + + encoding, offset = tile + + self.fp.seek(offset) + + # Copy image data to temporary file + o_fd, outfile = tempfile.mkstemp(text=False) + o = os.fdopen(o_fd) + if encoding == "raw": + # To simplify access to the extracted file, + # prepend a PPM header + o.write("P5\n%d %d\n255\n" % self.size) + while True: + type, size = self.field() + if type != (8, 10): + break + while size > 0: + s = self.fp.read(min(size, 8192)) + if not s: + break + o.write(s) + size -= len(s) + o.close() + + try: + _im = Image.open(outfile) + _im.load() + self.im = _im.im + finally: + try: + os.unlink(outfile) + except OSError: + pass + + +Image.register_open(IptcImageFile.format, IptcImageFile) + +Image.register_extension(IptcImageFile.format, ".iim") + + +def getiptcinfo(im): + """ + Get IPTC information from TIFF, JPEG, or IPTC file. + + :param im: An image containing IPTC data. + :returns: A dictionary containing IPTC information, or None if + no IPTC information block was found. + """ + from . import TiffImagePlugin, JpegImagePlugin + import io + + data = None + + if isinstance(im, IptcImageFile): + # return info dictionary right away + return im.info + + elif isinstance(im, JpegImagePlugin.JpegImageFile): + # extract the IPTC/NAA resource + try: + app = im.app["APP13"] + if app[:14] == b"Photoshop 3.0\x00": + app = app[14:] + # parse the image resource block + offset = 0 + while app[offset:offset+4] == b"8BIM": + offset += 4 + # resource code + code = i16(app, offset) + offset += 2 + # resource name (usually empty) + name_len = i8(app[offset]) + # name = app[offset+1:offset+1+name_len] + offset = 1 + offset + name_len + if offset & 1: + offset += 1 + # resource data block + size = i32(app, offset) + offset += 4 + if code == 0x0404: + # 0x0404 contains IPTC/NAA data + data = app[offset:offset+size] + break + offset = offset + size + if offset & 1: + offset += 1 + except (AttributeError, KeyError): + pass + + elif isinstance(im, TiffImagePlugin.TiffImageFile): + # get raw data from the IPTC/NAA tag (PhotoShop tags the data + # as 4-byte integers, so we cannot use the get method...) + try: + data = im.tag.tagdata[TiffImagePlugin.IPTC_NAA_CHUNK] + except (AttributeError, KeyError): + pass + + if data is None: + return None # no properties + + # create an IptcImagePlugin object without initializing it + class FakeImage(object): + pass + im = FakeImage() + im.__class__ = IptcImageFile + + # parse the IPTC information chunk + im.info = {} + im.fp = io.BytesIO(data) + + try: + im._open() + except (IndexError, KeyError): + pass # expected failure + + return im.info diff --git a/imagecrunch/PIL/Jpeg2KImagePlugin.py b/imagecrunch/PIL/Jpeg2KImagePlugin.py new file mode 100644 index 0000000..25fbefb --- /dev/null +++ b/imagecrunch/PIL/Jpeg2KImagePlugin.py @@ -0,0 +1,276 @@ +# +# The Python Imaging Library +# $Id$ +# +# JPEG2000 file handling +# +# History: +# 2014-03-12 ajh Created +# +# Copyright (c) 2014 Coriolis Systems Limited +# Copyright (c) 2014 Alastair Houghton +# +# See the README file for information on usage and redistribution. +# +from . import Image, ImageFile +import struct +import os +import io + +__version__ = "0.1" + + +def _parse_codestream(fp): + """Parse the JPEG 2000 codestream to extract the size and component + count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" + + hdr = fp.read(2) + lsiz = struct.unpack('>H', hdr)[0] + siz = hdr + fp.read(lsiz - 2) + lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, xtsiz, ytsiz, \ + xtosiz, ytosiz, csiz \ + = struct.unpack_from('>HHIIIIIIIIH', siz) + ssiz = [None]*csiz + xrsiz = [None]*csiz + yrsiz = [None]*csiz + for i in range(csiz): + ssiz[i], xrsiz[i], yrsiz[i] \ + = struct.unpack_from('>BBB', siz, 36 + 3 * i) + + size = (xsiz - xosiz, ysiz - yosiz) + if csiz == 1: + if (yrsiz[0] & 0x7f) > 8: + mode = 'I;16' + else: + mode = 'L' + elif csiz == 2: + mode = 'LA' + elif csiz == 3: + mode = 'RGB' + elif csiz == 4: + mode = 'RGBA' + else: + mode = None + + return (size, mode) + + +def _parse_jp2_header(fp): + """Parse the JP2 header box to extract size, component count and + color space information, returning a PIL (size, mode) tuple.""" + + # Find the JP2 header box + header = None + while True: + lbox, tbox = struct.unpack('>I4s', fp.read(8)) + if lbox == 1: + lbox = struct.unpack('>Q', fp.read(8))[0] + hlen = 16 + else: + hlen = 8 + + if lbox < hlen: + raise SyntaxError('Invalid JP2 header length') + + if tbox == b'jp2h': + header = fp.read(lbox - hlen) + break + else: + fp.seek(lbox - hlen, os.SEEK_CUR) + + if header is None: + raise SyntaxError('could not find JP2 header') + + size = None + mode = None + bpc = None + nc = None + + hio = io.BytesIO(header) + while True: + lbox, tbox = struct.unpack('>I4s', hio.read(8)) + if lbox == 1: + lbox = struct.unpack('>Q', hio.read(8))[0] + hlen = 16 + else: + hlen = 8 + + content = hio.read(lbox - hlen) + + if tbox == b'ihdr': + height, width, nc, bpc, c, unkc, ipr \ + = struct.unpack('>IIHBBBB', content) + size = (width, height) + if unkc: + if nc == 1 and (bpc & 0x7f) > 8: + mode = 'I;16' + elif nc == 1: + mode = 'L' + elif nc == 2: + mode = 'LA' + elif nc == 3: + mode = 'RGB' + elif nc == 4: + mode = 'RGBA' + break + elif tbox == b'colr': + meth, prec, approx = struct.unpack_from('>BBB', content) + if meth == 1: + cs = struct.unpack_from('>I', content, 3)[0] + if cs == 16: # sRGB + if nc == 1 and (bpc & 0x7f) > 8: + mode = 'I;16' + elif nc == 1: + mode = 'L' + elif nc == 3: + mode = 'RGB' + elif nc == 4: + mode = 'RGBA' + break + elif cs == 17: # grayscale + if nc == 1 and (bpc & 0x7f) > 8: + mode = 'I;16' + elif nc == 1: + mode = 'L' + elif nc == 2: + mode = 'LA' + break + elif cs == 18: # sYCC + if nc == 3: + mode = 'RGB' + elif nc == 4: + mode = 'RGBA' + break + + if size is None or mode is None: + raise SyntaxError("Malformed jp2 header") + + return (size, mode) + +## +# Image plugin for JPEG2000 images. + + +class Jpeg2KImageFile(ImageFile.ImageFile): + format = "JPEG2000" + format_description = "JPEG 2000 (ISO 15444)" + + def _open(self): + sig = self.fp.read(4) + if sig == b'\xff\x4f\xff\x51': + self.codec = "j2k" + self.size, self.mode = _parse_codestream(self.fp) + else: + sig = sig + self.fp.read(8) + + if sig == b'\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a': + self.codec = "jp2" + self.size, self.mode = _parse_jp2_header(self.fp) + else: + raise SyntaxError('not a JPEG 2000 file') + + if self.size is None or self.mode is None: + raise SyntaxError('unable to determine size/mode') + + self.reduce = 0 + self.layers = 0 + + fd = -1 + length = -1 + + try: + fd = self.fp.fileno() + length = os.fstat(fd).st_size + except: + fd = -1 + try: + pos = self.fp.tell() + self.fp.seek(0, 2) + length = self.fp.tell() + self.fp.seek(pos, 0) + except: + length = -1 + + self.tile = [('jpeg2k', (0, 0) + self.size, 0, + (self.codec, self.reduce, self.layers, fd, length))] + + def load(self): + if self.reduce: + power = 1 << self.reduce + adjust = power >> 1 + self.size = (int((self.size[0] + adjust) / power), + int((self.size[1] + adjust) / power)) + + if self.tile: + # Update the reduce and layers settings + t = self.tile[0] + t3 = (t[3][0], self.reduce, self.layers, t[3][3], t[3][4]) + self.tile = [(t[0], (0, 0) + self.size, t[2], t3)] + + return ImageFile.ImageFile.load(self) + + +def _accept(prefix): + return (prefix[:4] == b'\xff\x4f\xff\x51' or + prefix[:12] == b'\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a') + + +# ------------------------------------------------------------ +# Save support + +def _save(im, fp, filename): + if filename.endswith('.j2k'): + kind = 'j2k' + else: + kind = 'jp2' + + # Get the keyword arguments + info = im.encoderinfo + + offset = info.get('offset', None) + tile_offset = info.get('tile_offset', None) + tile_size = info.get('tile_size', None) + quality_mode = info.get('quality_mode', 'rates') + quality_layers = info.get('quality_layers', None) + num_resolutions = info.get('num_resolutions', 0) + cblk_size = info.get('codeblock_size', None) + precinct_size = info.get('precinct_size', None) + irreversible = info.get('irreversible', False) + progression = info.get('progression', 'LRCP') + cinema_mode = info.get('cinema_mode', 'no') + fd = -1 + + if hasattr(fp, "fileno"): + try: + fd = fp.fileno() + except: + fd = -1 + + im.encoderconfig = ( + offset, + tile_offset, + tile_size, + quality_mode, + quality_layers, + num_resolutions, + cblk_size, + precinct_size, + irreversible, + progression, + cinema_mode, + fd + ) + + ImageFile._save(im, fp, [('jpeg2k', (0, 0)+im.size, 0, kind)]) + +# ------------------------------------------------------------ +# Registry stuff + + +Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) +Image.register_save(Jpeg2KImageFile.format, _save) + +Image.register_extensions(Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"]) + +Image.register_mime(Jpeg2KImageFile.format, 'image/jp2') +Image.register_mime(Jpeg2KImageFile.format, 'image/jpx') diff --git a/imagecrunch/PIL/JpegImagePlugin.py b/imagecrunch/PIL/JpegImagePlugin.py new file mode 100644 index 0000000..97ef834 --- /dev/null +++ b/imagecrunch/PIL/JpegImagePlugin.py @@ -0,0 +1,804 @@ +# +# The Python Imaging Library. +# $Id$ +# +# JPEG (JFIF) file handling +# +# See "Digital Compression and Coding of Continuous-Tone Still Images, +# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) +# +# History: +# 1995-09-09 fl Created +# 1995-09-13 fl Added full parser +# 1996-03-25 fl Added hack to use the IJG command line utilities +# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug +# 1996-05-28 fl Added draft support, JFIF version (0.1) +# 1996-12-30 fl Added encoder options, added progression property (0.2) +# 1997-08-27 fl Save mode 1 images as BW (0.3) +# 1998-07-12 fl Added YCbCr to draft and save methods (0.4) +# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) +# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) +# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) +# 2003-04-25 fl Added experimental EXIF decoder (0.5) +# 2003-06-06 fl Added experimental EXIF GPSinfo decoder +# 2003-09-13 fl Extract COM markers +# 2009-09-06 fl Added icc_profile support (from Florian Hoech) +# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) +# 2009-03-08 fl Added subsampling support (from Justin Huff). +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import print_function + +import array +import struct +import io +import warnings +from . import Image, ImageFile, TiffImagePlugin +from ._binary import i8, o8, i16be as i16 +from .JpegPresets import presets +from ._util import isStringType + +__version__ = "0.6" + + +# +# Parser + +def Skip(self, marker): + n = i16(self.fp.read(2))-2 + ImageFile._safe_read(self.fp, n) + + +def APP(self, marker): + # + # Application marker. Store these in the APP dictionary. + # Also look for well-known application markers. + + n = i16(self.fp.read(2))-2 + s = ImageFile._safe_read(self.fp, n) + + app = "APP%d" % (marker & 15) + + self.app[app] = s # compatibility + self.applist.append((app, s)) + + if marker == 0xFFE0 and s[:4] == b"JFIF": + # extract JFIF information + self.info["jfif"] = version = i16(s, 5) # version + self.info["jfif_version"] = divmod(version, 256) + # extract JFIF properties + try: + jfif_unit = i8(s[7]) + jfif_density = i16(s, 8), i16(s, 10) + except: + pass + else: + if jfif_unit == 1: + self.info["dpi"] = jfif_density + self.info["jfif_unit"] = jfif_unit + self.info["jfif_density"] = jfif_density + elif marker == 0xFFE1 and s[:5] == b"Exif\0": + if "exif" not in self.info: + # extract Exif information (incomplete) + self.info["exif"] = s # FIXME: value will change + elif marker == 0xFFE2 and s[:5] == b"FPXR\0": + # extract FlashPix information (incomplete) + self.info["flashpix"] = s # FIXME: value will change + elif marker == 0xFFE2 and s[:12] == b"ICC_PROFILE\0": + # Since an ICC profile can be larger than the maximum size of + # a JPEG marker (64K), we need provisions to split it into + # multiple markers. The format defined by the ICC specifies + # one or more APP2 markers containing the following data: + # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) + # Marker sequence number 1, 2, etc (1 byte) + # Number of markers Total of APP2's used (1 byte) + # Profile data (remainder of APP2 data) + # Decoders should use the marker sequence numbers to + # reassemble the profile, rather than assuming that the APP2 + # markers appear in the correct sequence. + self.icclist.append(s) + elif marker == 0xFFEE and s[:5] == b"Adobe": + self.info["adobe"] = i16(s, 5) + # extract Adobe custom properties + try: + adobe_transform = i8(s[1]) + except: + pass + else: + self.info["adobe_transform"] = adobe_transform + elif marker == 0xFFE2 and s[:4] == b"MPF\0": + # extract MPO information + self.info["mp"] = s[4:] + # offset is current location minus buffer size + # plus constant header size + self.info["mpoffset"] = self.fp.tell() - n + 4 + + # If DPI isn't in JPEG header, fetch from EXIF + if "dpi" not in self.info and "exif" in self.info: + try: + exif = self._getexif() + resolution_unit = exif[0x0128] + x_resolution = exif[0x011A] + try: + dpi = x_resolution[0] / x_resolution[1] + except TypeError: + dpi = x_resolution + if resolution_unit == 3: # cm + # 1 dpcm = 2.54 dpi + dpi *= 2.54 + self.info["dpi"] = dpi, dpi + except (KeyError, SyntaxError, ZeroDivisionError): + # SyntaxError for invalid/unreadable exif + # KeyError for dpi not included + # ZeroDivisionError for invalid dpi rational value + self.info["dpi"] = 72, 72 + + +def COM(self, marker): + # + # Comment marker. Store these in the APP dictionary. + n = i16(self.fp.read(2))-2 + s = ImageFile._safe_read(self.fp, n) + + self.app["COM"] = s # compatibility + self.applist.append(("COM", s)) + + +def SOF(self, marker): + # + # Start of frame marker. Defines the size and mode of the + # image. JPEG is colour blind, so we use some simple + # heuristics to map the number of layers to an appropriate + # mode. Note that this could be made a bit brighter, by + # looking for JFIF and Adobe APP markers. + + n = i16(self.fp.read(2))-2 + s = ImageFile._safe_read(self.fp, n) + self.size = i16(s[3:]), i16(s[1:]) + + self.bits = i8(s[0]) + if self.bits != 8: + raise SyntaxError("cannot handle %d-bit layers" % self.bits) + + self.layers = i8(s[5]) + if self.layers == 1: + self.mode = "L" + elif self.layers == 3: + self.mode = "RGB" + elif self.layers == 4: + self.mode = "CMYK" + else: + raise SyntaxError("cannot handle %d-layer images" % self.layers) + + if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: + self.info["progressive"] = self.info["progression"] = 1 + + if self.icclist: + # fixup icc profile + self.icclist.sort() # sort by sequence number + if i8(self.icclist[0][13]) == len(self.icclist): + profile = [] + for p in self.icclist: + profile.append(p[14:]) + icc_profile = b"".join(profile) + else: + icc_profile = None # wrong number of fragments + self.info["icc_profile"] = icc_profile + self.icclist = None + + for i in range(6, len(s), 3): + t = s[i:i+3] + # 4-tuples: id, vsamp, hsamp, qtable + self.layer.append((t[0], i8(t[1])//16, i8(t[1]) & 15, i8(t[2]))) + + +def DQT(self, marker): + # + # Define quantization table. Support baseline 8-bit tables + # only. Note that there might be more than one table in + # each marker. + + # FIXME: The quantization tables can be used to estimate the + # compression quality. + + n = i16(self.fp.read(2))-2 + s = ImageFile._safe_read(self.fp, n) + while len(s): + if len(s) < 65: + raise SyntaxError("bad quantization table marker") + v = i8(s[0]) + if v//16 == 0: + self.quantization[v & 15] = array.array("B", s[1:65]) + s = s[65:] + else: + return # FIXME: add code to read 16-bit tables! + # raise SyntaxError, "bad quantization table element size" + + +# +# JPEG marker table + +MARKER = { + 0xFFC0: ("SOF0", "Baseline DCT", SOF), + 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), + 0xFFC2: ("SOF2", "Progressive DCT", SOF), + 0xFFC3: ("SOF3", "Spatial lossless", SOF), + 0xFFC4: ("DHT", "Define Huffman table", Skip), + 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), + 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), + 0xFFC7: ("SOF7", "Differential spatial", SOF), + 0xFFC8: ("JPG", "Extension", None), + 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), + 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), + 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), + 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), + 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), + 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), + 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), + 0xFFD0: ("RST0", "Restart 0", None), + 0xFFD1: ("RST1", "Restart 1", None), + 0xFFD2: ("RST2", "Restart 2", None), + 0xFFD3: ("RST3", "Restart 3", None), + 0xFFD4: ("RST4", "Restart 4", None), + 0xFFD5: ("RST5", "Restart 5", None), + 0xFFD6: ("RST6", "Restart 6", None), + 0xFFD7: ("RST7", "Restart 7", None), + 0xFFD8: ("SOI", "Start of image", None), + 0xFFD9: ("EOI", "End of image", None), + 0xFFDA: ("SOS", "Start of scan", Skip), + 0xFFDB: ("DQT", "Define quantization table", DQT), + 0xFFDC: ("DNL", "Define number of lines", Skip), + 0xFFDD: ("DRI", "Define restart interval", Skip), + 0xFFDE: ("DHP", "Define hierarchical progression", SOF), + 0xFFDF: ("EXP", "Expand reference component", Skip), + 0xFFE0: ("APP0", "Application segment 0", APP), + 0xFFE1: ("APP1", "Application segment 1", APP), + 0xFFE2: ("APP2", "Application segment 2", APP), + 0xFFE3: ("APP3", "Application segment 3", APP), + 0xFFE4: ("APP4", "Application segment 4", APP), + 0xFFE5: ("APP5", "Application segment 5", APP), + 0xFFE6: ("APP6", "Application segment 6", APP), + 0xFFE7: ("APP7", "Application segment 7", APP), + 0xFFE8: ("APP8", "Application segment 8", APP), + 0xFFE9: ("APP9", "Application segment 9", APP), + 0xFFEA: ("APP10", "Application segment 10", APP), + 0xFFEB: ("APP11", "Application segment 11", APP), + 0xFFEC: ("APP12", "Application segment 12", APP), + 0xFFED: ("APP13", "Application segment 13", APP), + 0xFFEE: ("APP14", "Application segment 14", APP), + 0xFFEF: ("APP15", "Application segment 15", APP), + 0xFFF0: ("JPG0", "Extension 0", None), + 0xFFF1: ("JPG1", "Extension 1", None), + 0xFFF2: ("JPG2", "Extension 2", None), + 0xFFF3: ("JPG3", "Extension 3", None), + 0xFFF4: ("JPG4", "Extension 4", None), + 0xFFF5: ("JPG5", "Extension 5", None), + 0xFFF6: ("JPG6", "Extension 6", None), + 0xFFF7: ("JPG7", "Extension 7", None), + 0xFFF8: ("JPG8", "Extension 8", None), + 0xFFF9: ("JPG9", "Extension 9", None), + 0xFFFA: ("JPG10", "Extension 10", None), + 0xFFFB: ("JPG11", "Extension 11", None), + 0xFFFC: ("JPG12", "Extension 12", None), + 0xFFFD: ("JPG13", "Extension 13", None), + 0xFFFE: ("COM", "Comment", COM) +} + + +def _accept(prefix): + return prefix[0:1] == b"\377" + + +## +# Image plugin for JPEG and JFIF images. + +class JpegImageFile(ImageFile.ImageFile): + + format = "JPEG" + format_description = "JPEG (ISO 10918)" + + def _open(self): + + s = self.fp.read(1) + + if i8(s) != 255: + raise SyntaxError("not a JPEG file") + + # Create attributes + self.bits = self.layers = 0 + + # JPEG specifics (internal) + self.layer = [] + self.huffman_dc = {} + self.huffman_ac = {} + self.quantization = {} + self.app = {} # compatibility + self.applist = [] + self.icclist = [] + + while True: + + i = i8(s) + if i == 0xFF: + s = s + self.fp.read(1) + i = i16(s) + else: + # Skip non-0xFF junk + s = self.fp.read(1) + continue + + if i in MARKER: + name, description, handler = MARKER[i] + # print(hex(i), name, description) + if handler is not None: + handler(self, i) + if i == 0xFFDA: # start of scan + rawmode = self.mode + if self.mode == "CMYK": + rawmode = "CMYK;I" # assume adobe conventions + self.tile = [("jpeg", (0, 0) + self.size, 0, + (rawmode, ""))] + # self.__offset = self.fp.tell() + break + s = self.fp.read(1) + elif i == 0 or i == 0xFFFF: + # padded marker or junk; move on + s = b"\xff" + elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) + s = self.fp.read(1) + else: + raise SyntaxError("no marker found") + + def load_read(self, read_bytes): + """ + internal: read more image data + For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker + so libjpeg can finish decoding + """ + s = self.fp.read(read_bytes) + + if not s and ImageFile.LOAD_TRUNCATED_IMAGES: + # Premature EOF. + # Pretend file is finished adding EOI marker + return b"\xFF\xD9" + + return s + + def draft(self, mode, size): + + if len(self.tile) != 1: + return + + # Protect from second call + if self.decoderconfig: + return + + d, e, o, a = self.tile[0] + scale = 0 + + if a[0] == "RGB" and mode in ["L", "YCbCr"]: + self.mode = mode + a = mode, "" + + if size: + scale = min(self.size[0] // size[0], self.size[1] // size[1]) + for s in [8, 4, 2, 1]: + if scale >= s: + break + e = e[0], e[1], (e[2]-e[0]+s-1)//s+e[0], (e[3]-e[1]+s-1)//s+e[1] + self.size = ((self.size[0]+s-1)//s, (self.size[1]+s-1)//s) + scale = s + + self.tile = [(d, e, o, a)] + self.decoderconfig = (scale, 0) + + return self + + def load_djpeg(self): + + # ALTERNATIVE: handle JPEGs via the IJG command line utilities + + import subprocess + import tempfile + import os + f, path = tempfile.mkstemp() + os.close(f) + if os.path.exists(self.filename): + subprocess.check_call(["djpeg", "-outfile", path, self.filename]) + else: + raise ValueError("Invalid Filename") + + try: + _im = Image.open(path) + _im.load() + self.im = _im.im + finally: + try: + os.unlink(path) + except OSError: + pass + + self.mode = self.im.mode + self.size = self.im.size + + self.tile = [] + + def _getexif(self): + return _getexif(self) + + def _getmp(self): + return _getmp(self) + + +def _fixup_dict(src_dict): + # Helper function for _getexif() + # returns a dict with any single item tuples/lists as individual values + def _fixup(value): + try: + if len(value) == 1 and not isinstance(value, dict): + return value[0] + except: + pass + return value + + return {k: _fixup(v) for k, v in src_dict.items()} + + +def _getexif(self): + # Extract EXIF information. This method is highly experimental, + # and is likely to be replaced with something better in a future + # version. + + # The EXIF record consists of a TIFF file embedded in a JPEG + # application marker (!). + try: + data = self.info["exif"] + except KeyError: + return None + file = io.BytesIO(data[6:]) + head = file.read(8) + # process dictionary + info = TiffImagePlugin.ImageFileDirectory_v1(head) + info.load(file) + exif = dict(_fixup_dict(info)) + # get exif extension + try: + # exif field 0x8769 is an offset pointer to the location + # of the nested embedded exif ifd. + # It should be a long, but may be corrupted. + file.seek(exif[0x8769]) + except (KeyError, TypeError): + pass + else: + info = TiffImagePlugin.ImageFileDirectory_v1(head) + info.load(file) + exif.update(_fixup_dict(info)) + # get gpsinfo extension + try: + # exif field 0x8825 is an offset pointer to the location + # of the nested embedded gps exif ifd. + # It should be a long, but may be corrupted. + file.seek(exif[0x8825]) + except (KeyError, TypeError): + pass + else: + info = TiffImagePlugin.ImageFileDirectory_v1(head) + info.load(file) + exif[0x8825] = _fixup_dict(info) + + return exif + + +def _getmp(self): + # Extract MP information. This method was inspired by the "highly + # experimental" _getexif version that's been in use for years now, + # itself based on the ImageFileDirectory class in the TIFF plug-in. + + # The MP record essentially consists of a TIFF file embedded in a JPEG + # application marker. + try: + data = self.info["mp"] + except KeyError: + return None + file_contents = io.BytesIO(data) + head = file_contents.read(8) + endianness = '>' if head[:4] == b'\x4d\x4d\x00\x2a' else '<' + # process dictionary + try: + info = TiffImagePlugin.ImageFileDirectory_v2(head) + info.load(file_contents) + mp = dict(info) + except: + raise SyntaxError("malformed MP Index (unreadable directory)") + # it's an error not to have a number of images + try: + quant = mp[0xB001] + except KeyError: + raise SyntaxError("malformed MP Index (no number of images)") + # get MP entries + mpentries = [] + try: + rawmpentries = mp[0xB002] + for entrynum in range(0, quant): + unpackedentry = struct.unpack_from( + '{}LLLHH'.format(endianness), rawmpentries, entrynum * 16) + labels = ('Attribute', 'Size', 'DataOffset', 'EntryNo1', + 'EntryNo2') + mpentry = dict(zip(labels, unpackedentry)) + mpentryattr = { + 'DependentParentImageFlag': bool(mpentry['Attribute'] & + (1 << 31)), + 'DependentChildImageFlag': bool(mpentry['Attribute'] & + (1 << 30)), + 'RepresentativeImageFlag': bool(mpentry['Attribute'] & + (1 << 29)), + 'Reserved': (mpentry['Attribute'] & (3 << 27)) >> 27, + 'ImageDataFormat': (mpentry['Attribute'] & (7 << 24)) >> 24, + 'MPType': mpentry['Attribute'] & 0x00FFFFFF + } + if mpentryattr['ImageDataFormat'] == 0: + mpentryattr['ImageDataFormat'] = 'JPEG' + else: + raise SyntaxError("unsupported picture format in MPO") + mptypemap = { + 0x000000: 'Undefined', + 0x010001: 'Large Thumbnail (VGA Equivalent)', + 0x010002: 'Large Thumbnail (Full HD Equivalent)', + 0x020001: 'Multi-Frame Image (Panorama)', + 0x020002: 'Multi-Frame Image: (Disparity)', + 0x020003: 'Multi-Frame Image: (Multi-Angle)', + 0x030000: 'Baseline MP Primary Image' + } + mpentryattr['MPType'] = mptypemap.get(mpentryattr['MPType'], + 'Unknown') + mpentry['Attribute'] = mpentryattr + mpentries.append(mpentry) + mp[0xB002] = mpentries + except KeyError: + raise SyntaxError("malformed MP Index (bad MP Entry)") + # Next we should try and parse the individual image unique ID list; + # we don't because I've never seen this actually used in a real MPO + # file and so can't test it. + return mp + + +# -------------------------------------------------------------------- +# stuff to save JPEG files + +RAWMODE = { + "1": "L", + "L": "L", + "RGB": "RGB", + "RGBX": "RGB", + "CMYK": "CMYK;I", # assume adobe conventions + "YCbCr": "YCbCr", +} + +zigzag_index = (0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63) + +samplings = {(1, 1, 1, 1, 1, 1): 0, + (2, 1, 1, 1, 1, 1): 1, + (2, 2, 1, 1, 1, 1): 2, + } + + +def convert_dict_qtables(qtables): + qtables = [qtables[key] for key in range(len(qtables)) if key in qtables] + for idx, table in enumerate(qtables): + qtables[idx] = [table[i] for i in zigzag_index] + return qtables + + +def get_sampling(im): + # There's no subsampling when image have only 1 layer + # (grayscale images) or when they are CMYK (4 layers), + # so set subsampling to default value. + # + # NOTE: currently Pillow can't encode JPEG to YCCK format. + # If YCCK support is added in the future, subsampling code will have + # to be updated (here and in JpegEncode.c) to deal with 4 layers. + if not hasattr(im, 'layers') or im.layers in (1, 4): + return -1 + sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] + return samplings.get(sampling, -1) + + +def _save(im, fp, filename): + + try: + rawmode = RAWMODE[im.mode] + except KeyError: + raise IOError("cannot write mode %s as JPEG" % im.mode) + + info = im.encoderinfo + + dpi = [int(round(x)) for x in info.get("dpi", (0, 0))] + + quality = info.get("quality", 0) + subsampling = info.get("subsampling", -1) + qtables = info.get("qtables") + + if quality == "keep": + quality = 0 + subsampling = "keep" + qtables = "keep" + elif quality in presets: + preset = presets[quality] + quality = 0 + subsampling = preset.get('subsampling', -1) + qtables = preset.get('quantization') + elif not isinstance(quality, int): + raise ValueError("Invalid quality setting") + else: + if subsampling in presets: + subsampling = presets[subsampling].get('subsampling', -1) + if isStringType(qtables) and qtables in presets: + qtables = presets[qtables].get('quantization') + + if subsampling == "4:4:4": + subsampling = 0 + elif subsampling == "4:2:2": + subsampling = 1 + elif subsampling == "4:2:0": + subsampling = 2 + elif subsampling == "4:1:1": + # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. + # Set 4:2:0 if someone is still using that value. + subsampling = 2 + elif subsampling == "keep": + if im.format != "JPEG": + raise ValueError( + "Cannot use 'keep' when original image is not a JPEG") + subsampling = get_sampling(im) + + def validate_qtables(qtables): + if qtables is None: + return qtables + if isStringType(qtables): + try: + lines = [int(num) for line in qtables.splitlines() + for num in line.split('#', 1)[0].split()] + except ValueError: + raise ValueError("Invalid quantization table") + else: + qtables = [lines[s:s+64] for s in range(0, len(lines), 64)] + if isinstance(qtables, (tuple, list, dict)): + if isinstance(qtables, dict): + qtables = convert_dict_qtables(qtables) + elif isinstance(qtables, tuple): + qtables = list(qtables) + if not (0 < len(qtables) < 5): + raise ValueError("None or too many quantization tables") + for idx, table in enumerate(qtables): + try: + if len(table) != 64: + raise TypeError + table = array.array('B', table) + except TypeError: + raise ValueError("Invalid quantization table") + else: + qtables[idx] = list(table) + return qtables + + if qtables == "keep": + if im.format != "JPEG": + raise ValueError( + "Cannot use 'keep' when original image is not a JPEG") + qtables = getattr(im, "quantization", None) + qtables = validate_qtables(qtables) + + extra = b"" + + icc_profile = info.get("icc_profile") + if icc_profile: + ICC_OVERHEAD_LEN = 14 + MAX_BYTES_IN_MARKER = 65533 + MAX_DATA_BYTES_IN_MARKER = MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN + markers = [] + while icc_profile: + markers.append(icc_profile[:MAX_DATA_BYTES_IN_MARKER]) + icc_profile = icc_profile[MAX_DATA_BYTES_IN_MARKER:] + i = 1 + for marker in markers: + size = struct.pack(">H", 2 + ICC_OVERHEAD_LEN + len(marker)) + extra += (b"\xFF\xE2" + size + b"ICC_PROFILE\0" + o8(i) + + o8(len(markers)) + marker) + i += 1 + + # "progressive" is the official name, but older documentation + # says "progression" + # FIXME: issue a warning if the wrong form is used (post-1.1.7) + progressive = (info.get("progressive", False) or + info.get("progression", False)) + + optimize = info.get("optimize", False) + + # get keyword arguments + im.encoderconfig = ( + quality, + progressive, + info.get("smooth", 0), + optimize, + info.get("streamtype", 0), + dpi[0], dpi[1], + subsampling, + qtables, + extra, + info.get("exif", b"") + ) + + # if we optimize, libjpeg needs a buffer big enough to hold the whole image + # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is + # channels*size, this is a value that's been used in a django patch. + # https://github.com/matthewwithanm/django-imagekit/issues/50 + bufsize = 0 + if optimize or progressive: + # CMYK can be bigger + if im.mode == 'CMYK': + bufsize = 4 * im.size[0] * im.size[1] + # keep sets quality to 0, but the actual value may be high. + elif quality >= 95 or quality == 0: + bufsize = 2 * im.size[0] * im.size[1] + else: + bufsize = im.size[0] * im.size[1] + + # The exif info needs to be written as one block, + APP1, + one spare byte. + # Ensure that our buffer is big enough. Same with the icc_profile block. + bufsize = max(ImageFile.MAXBLOCK, bufsize, len(info.get("exif", b"")) + 5, + len(extra) + 1) + + ImageFile._save(im, fp, [("jpeg", (0, 0)+im.size, 0, rawmode)], bufsize) + + +def _save_cjpeg(im, fp, filename): + # ALTERNATIVE: handle JPEGs via the IJG command line utilities. + import os + import subprocess + tempfile = im._dump() + subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) + try: + os.unlink(tempfile) + except OSError: + pass + + +## +# Factory for making JPEG and MPO instances +def jpeg_factory(fp=None, filename=None): + im = JpegImageFile(fp, filename) + try: + mpheader = im._getmp() + if mpheader[45057] > 1: + # It's actually an MPO + from .MpoImagePlugin import MpoImageFile + im = MpoImageFile(fp, filename) + except (TypeError, IndexError): + # It is really a JPEG + pass + except SyntaxError: + warnings.warn("Image appears to be a malformed MPO file, it will be " + "interpreted as a base JPEG file") + return im + + +# -------------------------------------------------------------------q- +# Registry stuff + +Image.register_open(JpegImageFile.format, jpeg_factory, _accept) +Image.register_save(JpegImageFile.format, _save) + +Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) + +Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/imagecrunch/PIL/JpegPresets.py b/imagecrunch/PIL/JpegPresets.py new file mode 100644 index 0000000..5f01f0d --- /dev/null +++ b/imagecrunch/PIL/JpegPresets.py @@ -0,0 +1,241 @@ +""" +JPEG quality settings equivalent to the Photoshop settings. + +More presets can be added to the presets dict if needed. + +Can be use when saving JPEG file. + +To apply the preset, specify:: + + quality="preset_name" + +To apply only the quantization table:: + + qtables="preset_name" + +To apply only the subsampling setting:: + + subsampling="preset_name" + +Example:: + + im.save("image_name.jpg", quality="web_high") + + +Subsampling +----------- + +Subsampling is the practice of encoding images by implementing less resolution +for chroma information than for luma information. +(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling) + +Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and +4:2:0. + +You can get the subsampling of a JPEG with the +`JpegImagePlugin.get_subsampling(im)` function. + + +Quantization tables +------------------- + +They are values use by the DCT (Discrete cosine transform) to remove +*unnecessary* information from the image (the lossy part of the compression). +(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, +https://en.wikipedia.org/wiki/JPEG#Quantization) + +You can get the quantization tables of a JPEG with:: + + im.quantization + +This will return a dict with a number of arrays. You can pass this dict +directly as the qtables argument when saving a JPEG. + +The tables format between im.quantization and quantization in presets differ in +3 ways: + +1. The base container of the preset is a list with sublists instead of dict. + dict[0] -> list[0], dict[1] -> list[1], ... +2. Each table in a preset is a list instead of an array. +3. The zigzag order is remove in the preset (needed by libjpeg >= 6a). + +You can convert the dict format to the preset format with the +`JpegImagePlugin.convert_dict_qtables(dict_qtables)` function. + +Libjpeg ref.: https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html + +""" + +presets = { + 'web_low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [20, 16, 25, 39, 50, 46, 62, 68, + 16, 18, 23, 38, 38, 53, 65, 68, + 25, 23, 31, 38, 53, 65, 68, 68, + 39, 38, 38, 53, 65, 68, 68, 68, + 50, 38, 53, 65, 68, 68, 68, 68, + 46, 53, 65, 68, 68, 68, 68, 68, + 62, 65, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68], + [21, 25, 32, 38, 54, 68, 68, 68, + 25, 28, 24, 38, 54, 68, 68, 68, + 32, 24, 32, 43, 66, 68, 68, 68, + 38, 38, 43, 53, 68, 68, 68, 68, + 54, 54, 66, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68] + ]}, + 'web_medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [16, 11, 11, 16, 23, 27, 31, 30, + 11, 12, 12, 15, 20, 23, 23, 30, + 11, 12, 13, 16, 23, 26, 35, 47, + 16, 15, 16, 23, 26, 37, 47, 64, + 23, 20, 23, 26, 39, 51, 64, 64, + 27, 23, 26, 37, 51, 64, 64, 64, + 31, 23, 35, 47, 64, 64, 64, 64, + 30, 30, 47, 64, 64, 64, 64, 64], + [17, 15, 17, 21, 20, 26, 38, 48, + 15, 19, 18, 17, 20, 26, 35, 43, + 17, 18, 20, 22, 26, 30, 46, 53, + 21, 17, 22, 28, 30, 39, 53, 64, + 20, 20, 26, 30, 39, 48, 64, 64, + 26, 26, 30, 39, 48, 63, 64, 64, + 38, 35, 46, 53, 64, 64, 64, 64, + 48, 43, 53, 64, 64, 64, 64, 64] + ]}, + 'web_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 14, 19, + 6, 6, 6, 11, 12, 15, 19, 28, + 9, 8, 10, 12, 16, 20, 27, 31, + 11, 10, 12, 15, 20, 27, 31, 31, + 12, 12, 14, 19, 27, 31, 31, 31, + 16, 12, 19, 28, 31, 31, 31, 31], + [7, 7, 13, 24, 26, 31, 31, 31, + 7, 12, 16, 21, 31, 31, 31, 31, + 13, 16, 17, 31, 31, 31, 31, 31, + 24, 21, 31, 31, 31, 31, 31, 31, + 26, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31] + ]}, + 'web_very_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 11, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 11, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'web_maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 2, 2, + 1, 1, 1, 1, 1, 2, 2, 3, + 1, 1, 1, 1, 2, 2, 3, 3, + 1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 2, 2, 3, 3, 3, 3], + [1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 1, 2, 3, 3, 3, 3, + 1, 1, 1, 3, 3, 3, 3, 3, + 2, 2, 3, 3, 3, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3] + ]}, + 'low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [18, 14, 14, 21, 30, 35, 34, 17, + 14, 16, 16, 19, 26, 23, 12, 12, + 14, 16, 17, 21, 23, 12, 12, 12, + 21, 19, 21, 23, 12, 12, 12, 12, + 30, 26, 23, 12, 12, 12, 12, 12, + 35, 23, 12, 12, 12, 12, 12, 12, + 34, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [20, 19, 22, 27, 20, 20, 17, 17, + 19, 25, 23, 14, 14, 12, 12, 12, + 22, 23, 14, 14, 12, 12, 12, 12, + 27, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [12, 8, 8, 12, 17, 21, 24, 17, + 8, 9, 9, 11, 15, 19, 12, 12, + 8, 9, 10, 12, 19, 12, 12, 12, + 12, 11, 12, 21, 12, 12, 12, 12, + 17, 15, 19, 12, 12, 12, 12, 12, + 21, 19, 12, 12, 12, 12, 12, 12, + 24, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [13, 11, 13, 16, 20, 20, 17, 17, + 11, 14, 14, 14, 14, 12, 12, 12, + 13, 14, 14, 14, 12, 12, 12, 12, + 16, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 12, 12, + 6, 6, 6, 11, 12, 12, 12, 12, + 9, 8, 10, 12, 12, 12, 12, 12, + 11, 10, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 16, 12, 12, 12, 12, 12, 12, 12], + [7, 7, 13, 24, 20, 20, 17, 17, + 7, 12, 16, 14, 14, 12, 12, 12, + 13, 16, 14, 14, 12, 12, 12, 12, + 24, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 10, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 10, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, +} diff --git a/imagecrunch/PIL/McIdasImagePlugin.py b/imagecrunch/PIL/McIdasImagePlugin.py new file mode 100644 index 0000000..06da33f --- /dev/null +++ b/imagecrunch/PIL/McIdasImagePlugin.py @@ -0,0 +1,75 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Basic McIdas support for PIL +# +# History: +# 1997-05-05 fl Created (8-bit images only) +# 2009-03-08 fl Added 16/32-bit support. +# +# Thanks to Richard Jones and Craig Swank for specs and samples. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +import struct +from . import Image, ImageFile + +__version__ = "0.2" + + +def _accept(s): + return s[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04" + + +## +# Image plugin for McIdas area images. + +class McIdasImageFile(ImageFile.ImageFile): + + format = "MCIDAS" + format_description = "McIdas area file" + + def _open(self): + + # parse area file directory + s = self.fp.read(256) + if not _accept(s) or len(s) != 256: + raise SyntaxError("not an McIdas area file") + + self.area_descriptor_raw = s + self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) + + # get mode + if w[11] == 1: + mode = rawmode = "L" + elif w[11] == 2: + # FIXME: add memory map support + mode = "I" + rawmode = "I;16B" + elif w[11] == 4: + # FIXME: add memory map support + mode = "I" + rawmode = "I;32B" + else: + raise SyntaxError("unsupported McIdas format") + + self.mode = mode + self.size = w[10], w[9] + + offset = w[34] + w[15] + stride = w[15] + w[10]*w[11]*w[14] + + self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))] + + +# -------------------------------------------------------------------- +# registry + +Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) + +# no default extension diff --git a/imagecrunch/PIL/MicImagePlugin.py b/imagecrunch/PIL/MicImagePlugin.py new file mode 100644 index 0000000..1dbb6a5 --- /dev/null +++ b/imagecrunch/PIL/MicImagePlugin.py @@ -0,0 +1,107 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Microsoft Image Composer support for PIL +# +# Notes: +# uses TiffImagePlugin.py to read the actual image streams +# +# History: +# 97-01-20 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, TiffImagePlugin + +import olefile + +__version__ = "0.1" + + +# +# -------------------------------------------------------------------- + + +def _accept(prefix): + return prefix[:8] == olefile.MAGIC + + +## +# Image plugin for Microsoft's Image Composer file format. + +class MicImageFile(TiffImagePlugin.TiffImageFile): + + format = "MIC" + format_description = "Microsoft Image Composer" + _close_exclusive_fp_after_loading = False + + def _open(self): + + # read the OLE directory and see if this is a likely + # to be a Microsoft Image Composer file + + try: + self.ole = olefile.OleFileIO(self.fp) + except IOError: + raise SyntaxError("not an MIC file; invalid OLE file") + + # find ACI subfiles with Image members (maybe not the + # best way to identify MIC files, but what the... ;-) + + self.images = [] + for path in self.ole.listdir(): + if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image": + self.images.append(path) + + # if we didn't find any images, this is probably not + # an MIC file. + if not self.images: + raise SyntaxError("not an MIC file; no image entries") + + self.__fp = self.fp + self.frame = None + + if len(self.images) > 1: + self.category = Image.CONTAINER + + self.seek(0) + + @property + def n_frames(self): + return len(self.images) + + @property + def is_animated(self): + return len(self.images) > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + try: + filename = self.images[frame] + except IndexError: + raise EOFError("no such frame") + + self.fp = self.ole.openstream(filename) + + TiffImagePlugin.TiffImageFile._open(self) + + self.frame = frame + + def tell(self): + + return self.frame + + +# +# -------------------------------------------------------------------- + +Image.register_open(MicImageFile.format, MicImageFile, _accept) + +Image.register_extension(MicImageFile.format, ".mic") diff --git a/imagecrunch/PIL/MpegImagePlugin.py b/imagecrunch/PIL/MpegImagePlugin.py new file mode 100644 index 0000000..fca7f9d --- /dev/null +++ b/imagecrunch/PIL/MpegImagePlugin.py @@ -0,0 +1,85 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPEG file handling +# +# History: +# 95-09-09 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile +from ._binary import i8 + +__version__ = "0.1" + + +# +# Bitstream parser + +class BitStream(object): + + def __init__(self, fp): + self.fp = fp + self.bits = 0 + self.bitbuffer = 0 + + def next(self): + return i8(self.fp.read(1)) + + def peek(self, bits): + while self.bits < bits: + c = self.next() + if c < 0: + self.bits = 0 + continue + self.bitbuffer = (self.bitbuffer << 8) + c + self.bits += 8 + return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 + + def skip(self, bits): + while self.bits < bits: + self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) + self.bits += 8 + self.bits = self.bits - bits + + def read(self, bits): + v = self.peek(bits) + self.bits = self.bits - bits + return v + + +## +# Image plugin for MPEG streams. This plugin can identify a stream, +# but it cannot read it. + +class MpegImageFile(ImageFile.ImageFile): + + format = "MPEG" + format_description = "MPEG" + + def _open(self): + + s = BitStream(self.fp) + + if s.read(32) != 0x1B3: + raise SyntaxError("not an MPEG file") + + self.mode = "RGB" + self.size = s.read(12), s.read(12) + + +# -------------------------------------------------------------------- +# Registry stuff + +Image.register_open(MpegImageFile.format, MpegImageFile) + +Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) + +Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/imagecrunch/PIL/MpoImagePlugin.py b/imagecrunch/PIL/MpoImagePlugin.py new file mode 100644 index 0000000..460ccec --- /dev/null +++ b/imagecrunch/PIL/MpoImagePlugin.py @@ -0,0 +1,99 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPO file handling +# +# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the +# Camera & Imaging Products Association) +# +# The multi-picture object combines multiple JPEG images (with a modified EXIF +# data format) into a single file. While it can theoretically be used much like +# a GIF animation, it is commonly used to represent 3D photographs and is (as +# of this writing) the most commonly used format by 3D cameras. +# +# History: +# 2014-03-13 Feneric Created +# +# See the README file for information on usage and redistribution. +# + +from . import Image, JpegImagePlugin + +__version__ = "0.1" + + +def _accept(prefix): + return JpegImagePlugin._accept(prefix) + + +def _save(im, fp, filename): + # Note that we can only save the current frame at present + return JpegImagePlugin._save(im, fp, filename) + + +## +# Image plugin for MPO images. + +class MpoImageFile(JpegImagePlugin.JpegImageFile): + + format = "MPO" + format_description = "MPO (CIPA DC-007)" + _close_exclusive_fp_after_loading = False + + def _open(self): + self.fp.seek(0) # prep the fp in order to pass the JPEG test + JpegImagePlugin.JpegImageFile._open(self) + self.mpinfo = self._getmp() + self.__framecount = self.mpinfo[0xB001] + self.__mpoffsets = [mpent['DataOffset'] + self.info['mpoffset'] + for mpent in self.mpinfo[0xB002]] + self.__mpoffsets[0] = 0 + # Note that the following assertion will only be invalid if something + # gets broken within JpegImagePlugin. + assert self.__framecount == len(self.__mpoffsets) + del self.info['mpoffset'] # no longer needed + self.__fp = self.fp # FIXME: hack + self.__fp.seek(self.__mpoffsets[0]) # get ready to read first frame + self.__frame = 0 + self.offset = 0 + # for now we can only handle reading and individual frame extraction + self.readonly = 1 + + def load_seek(self, pos): + self.__fp.seek(pos) + + @property + def n_frames(self): + return self.__framecount + + @property + def is_animated(self): + return self.__framecount > 1 + + def seek(self, frame): + if not self._seek_check(frame): + return + self.fp = self.__fp + self.offset = self.__mpoffsets[frame] + self.tile = [ + ("jpeg", (0, 0) + self.size, self.offset, (self.mode, "")) + ] + self.__frame = frame + + def tell(self): + return self.__frame + + +# -------------------------------------------------------------------q- +# Registry stuff + +# Note that since MPO shares a factory with JPEG, we do not need to do a +# separate registration for it here. +# Image.register_open(MpoImageFile.format, +# JpegImagePlugin.jpeg_factory, _accept) +Image.register_save(MpoImageFile.format, _save) + +Image.register_extension(MpoImageFile.format, ".mpo") + +Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/imagecrunch/PIL/MspImagePlugin.py b/imagecrunch/PIL/MspImagePlugin.py new file mode 100644 index 0000000..9692d11 --- /dev/null +++ b/imagecrunch/PIL/MspImagePlugin.py @@ -0,0 +1,192 @@ +# +# The Python Imaging Library. +# +# MSP file handling +# +# This is the format used by the Paint program in Windows 1 and 2. +# +# History: +# 95-09-05 fl Created +# 97-01-03 fl Read/write MSP images +# 17-02-21 es Fixed RLE interpretation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-97. +# Copyright (c) Eric Soroos 2017. +# +# See the README file for information on usage and redistribution. +# +# More info on this format: https://archive.org/details/gg243631 +# Page 313: +# Figure 205. Windows Paint Version 1: "DanM" Format +# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 +# +# See also: http://www.fileformat.info/format/mspaint/egff.htm + +from . import Image, ImageFile +from ._binary import i16le as i16, o16le as o16, i8 +import struct +import io + +__version__ = "0.1" + + +# +# read MSP files + + +def _accept(prefix): + return prefix[:4] in [b"DanM", b"LinS"] + + +## +# Image plugin for Windows MSP images. This plugin supports both +# uncompressed (Windows 1.0). + +class MspImageFile(ImageFile.ImageFile): + + format = "MSP" + format_description = "Windows Paint" + + def _open(self): + + # Header + s = self.fp.read(32) + if s[:4] not in [b"DanM", b"LinS"]: + raise SyntaxError("not an MSP file") + + # Header checksum + checksum = 0 + for i in range(0, 32, 2): + checksum = checksum ^ i16(s[i:i+2]) + if checksum != 0: + raise SyntaxError("bad MSP checksum") + + self.mode = "1" + self.size = i16(s[4:]), i16(s[6:]) + + if s[:4] == b"DanM": + self.tile = [("raw", (0, 0)+self.size, 32, ("1", 0, 1))] + else: + self.tile = [("MSP", (0, 0)+self.size, 32, None)] + + +class MspDecoder(ImageFile.PyDecoder): + # The algo for the MSP decoder is from + # http://www.fileformat.info/format/mspaint/egff.htm + # cc-by-attribution -- That page references is taken from the + # Encyclopedia of Graphics File Formats and is licensed by + # O'Reilly under the Creative Common/Attribution license + # + # For RLE encoded files, the 32byte header is followed by a scan + # line map, encoded as one 16bit word of encoded byte length per + # line. + # + # NOTE: the encoded length of the line can be 0. This was not + # handled in the previous version of this encoder, and there's no + # mention of how to handle it in the documentation. From the few + # examples I've seen, I've assumed that it is a fill of the + # background color, in this case, white. + # + # + # Pseudocode of the decoder: + # Read a BYTE value as the RunType + # If the RunType value is zero + # Read next byte as the RunCount + # Read the next byte as the RunValue + # Write the RunValue byte RunCount times + # If the RunType value is non-zero + # Use this value as the RunCount + # Read and write the next RunCount bytes literally + # + # e.g.: + # 0x00 03 ff 05 00 01 02 03 04 + # would yield the bytes: + # 0xff ff ff 00 01 02 03 04 + # + # which are then interpreted as a bit packed mode '1' image + + _pulls_fd = True + + def decode(self, buffer): + + img = io.BytesIO() + blank_line = bytearray((0xff,)*((self.state.xsize+7)//8)) + try: + self.fd.seek(32) + rowmap = struct.unpack_from("<%dH" % (self.state.ysize), + self.fd.read(self.state.ysize*2)) + except struct.error: + raise IOError("Truncated MSP file in row map") + + for x, rowlen in enumerate(rowmap): + try: + if rowlen == 0: + img.write(blank_line) + continue + row = self.fd.read(rowlen) + if len(row) != rowlen: + raise IOError("Truncated MSP file, expected %d bytes on row %s", + (rowlen, x)) + idx = 0 + while idx < rowlen: + runtype = i8(row[idx]) + idx += 1 + if runtype == 0: + (runcount, runval) = struct.unpack_from("Bc", row, idx) + img.write(runval * runcount) + idx += 2 + else: + runcount = runtype + img.write(row[idx:idx+runcount]) + idx += runcount + + except struct.error: + raise IOError("Corrupted MSP file in row %d" % x) + + self.set_as_raw(img.getvalue(), ("1", 0, 1)) + + return 0, 0 + + +Image.register_decoder('MSP', MspDecoder) + + +# +# write MSP files (uncompressed only) + + +def _save(im, fp, filename): + + if im.mode != "1": + raise IOError("cannot write mode %s as MSP" % im.mode) + + # create MSP header + header = [0] * 16 + + header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 + header[2], header[3] = im.size + header[4], header[5] = 1, 1 + header[6], header[7] = 1, 1 + header[8], header[9] = im.size + + checksum = 0 + for h in header: + checksum = checksum ^ h + header[12] = checksum # FIXME: is this the right field? + + # header + for h in header: + fp.write(o16(h)) + + # image body + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 32, ("1", 0, 1))]) + + +# +# registry + +Image.register_open(MspImageFile.format, MspImageFile, _accept) +Image.register_save(MspImageFile.format, _save) + +Image.register_extension(MspImageFile.format, ".msp") diff --git a/imagecrunch/PIL/OleFileIO.py b/imagecrunch/PIL/OleFileIO.py new file mode 100644 index 0000000..b3caa10 --- /dev/null +++ b/imagecrunch/PIL/OleFileIO.py @@ -0,0 +1,4 @@ +raise ImportError( + 'PIL.OleFileIO is deprecated. Use the olefile Python package ' + 'instead. This module will be removed in a future version.' +) diff --git a/imagecrunch/PIL/PSDraw.py b/imagecrunch/PIL/PSDraw.py new file mode 100644 index 0000000..d2ded6f --- /dev/null +++ b/imagecrunch/PIL/PSDraw.py @@ -0,0 +1,237 @@ +# +# The Python Imaging Library +# $Id$ +# +# simple postscript graphics interface +# +# History: +# 1996-04-20 fl Created +# 1999-01-10 fl Added gsave/grestore to image method +# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) +# +# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from . import EpsImagePlugin +from ._util import py3 +import sys + +## +# Simple Postscript graphics interface. + + +class PSDraw(object): + """ + Sets up printing to the given file. If **fp** is omitted, + :py:attr:`sys.stdout` is assumed. + """ + + def __init__(self, fp=None): + if not fp: + fp = sys.stdout + self.fp = fp + + def _fp_write(self, to_write): + if not py3 or self.fp == sys.stdout: + self.fp.write(to_write) + else: + self.fp.write(bytes(to_write, 'UTF-8')) + + def begin_document(self, id=None): + """Set up printing of a document. (Write Postscript DSC header.)""" + # FIXME: incomplete + self._fp_write("%!PS-Adobe-3.0\n" + "save\n" + "/showpage { } def\n" + "%%EndComments\n" + "%%BeginDocument\n") + # self._fp_write(ERROR_PS) # debugging! + self._fp_write(EDROFF_PS) + self._fp_write(VDI_PS) + self._fp_write("%%EndProlog\n") + self.isofont = {} + + def end_document(self): + """Ends printing. (Write Postscript DSC footer.)""" + self._fp_write("%%EndDocument\n" + "restore showpage\n" + "%%End\n") + if hasattr(self.fp, "flush"): + self.fp.flush() + + def setfont(self, font, size): + """ + Selects which font to use. + + :param font: A Postscript font name + :param size: Size in points. + """ + if font not in self.isofont: + # reencode font + self._fp_write("/PSDraw-%s ISOLatin1Encoding /%s E\n" % + (font, font)) + self.isofont[font] = 1 + # rough + self._fp_write("/F0 %d /PSDraw-%s F\n" % (size, font)) + + def line(self, xy0, xy1): + """ + Draws a line between the two points. Coordinates are given in + Postscript point coordinates (72 points per inch, (0, 0) is the lower + left corner of the page). + """ + xy = xy0 + xy1 + self._fp_write("%d %d %d %d Vl\n" % xy) + + def rectangle(self, box): + """ + Draws a rectangle. + + :param box: A 4-tuple of integers whose order and function is currently + undocumented. + + Hint: the tuple is passed into this format string: + + .. code-block:: python + + %d %d M %d %d 0 Vr\n + """ + self._fp_write("%d %d M %d %d 0 Vr\n" % box) + + def text(self, xy, text): + """ + Draws text at the given position. You must use + :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. + """ + text = "\\(".join(text.split("(")) + text = "\\)".join(text.split(")")) + xy = xy + (text,) + self._fp_write("%d %d M (%s) S\n" % xy) + + def image(self, box, im, dpi=None): + """Draw a PIL image, centered in the given box.""" + # default resolution depends on mode + if not dpi: + if im.mode == "1": + dpi = 200 # fax + else: + dpi = 100 # greyscale + # image size (on paper) + x = float(im.size[0] * 72) / dpi + y = float(im.size[1] * 72) / dpi + # max allowed size + xmax = float(box[2] - box[0]) + ymax = float(box[3] - box[1]) + if x > xmax: + y = y * xmax / x + x = xmax + if y > ymax: + x = x * ymax / y + y = ymax + dx = (xmax - x) / 2 + box[0] + dy = (ymax - y) / 2 + box[1] + self._fp_write("gsave\n%f %f translate\n" % (dx, dy)) + if (x, y) != im.size: + # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) + sx = x / im.size[0] + sy = y / im.size[1] + self._fp_write("%f %f scale\n" % (sx, sy)) + EpsImagePlugin._save(im, self.fp, None, 0) + self._fp_write("\ngrestore\n") + +# -------------------------------------------------------------------- +# Postscript driver + +# +# EDROFF.PS -- Postscript driver for Edroff 2 +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + + +EDROFF_PS = """\ +/S { show } bind def +/P { moveto show } bind def +/M { moveto } bind def +/X { 0 rmoveto } bind def +/Y { 0 exch rmoveto } bind def +/E { findfont + dup maxlength dict begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + /Encoding exch def + dup /FontName exch def + currentdict end definefont pop +} bind def +/F { findfont exch scalefont dup setfont + [ exch /setfont cvx ] cvx bind def +} bind def +""" + +# +# VDI.PS -- Postscript driver for VDI meta commands +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + +VDI_PS = """\ +/Vm { moveto } bind def +/Va { newpath arcn stroke } bind def +/Vl { moveto lineto stroke } bind def +/Vc { newpath 0 360 arc closepath } bind def +/Vr { exch dup 0 rlineto + exch dup neg 0 exch rlineto + exch neg 0 rlineto + 0 exch rlineto + 100 div setgray fill 0 setgray } bind def +/Tm matrix def +/Ve { Tm currentmatrix pop + translate scale newpath 0 0 .5 0 360 arc closepath + Tm setmatrix +} bind def +/Vf { currentgray exch setgray fill setgray } bind def +""" + +# +# ERROR.PS -- Error handler +# +# History: +# 89-11-21 fl: created (pslist 1.10) +# + +ERROR_PS = """\ +/landscape false def +/errorBUF 200 string def +/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def +errordict begin /handleerror { + initmatrix /Courier findfont 10 scalefont setfont + newpath 72 720 moveto $error begin /newerror false def + (PostScript Error) show errorNL errorNL + (Error: ) show + /errorname load errorBUF cvs show errorNL errorNL + (Command: ) show + /command load dup type /stringtype ne { errorBUF cvs } if show + errorNL errorNL + (VMstatus: ) show + vmstatus errorBUF cvs show ( bytes available, ) show + errorBUF cvs show ( bytes used at level ) show + errorBUF cvs show errorNL errorNL + (Operand stargck: ) show errorNL /ostargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall errorNL + (Execution stargck: ) show errorNL /estargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall + end showpage +} def end +""" diff --git a/imagecrunch/PIL/PaletteFile.py b/imagecrunch/PIL/PaletteFile.py new file mode 100644 index 0000000..9ed69d6 --- /dev/null +++ b/imagecrunch/PIL/PaletteFile.py @@ -0,0 +1,55 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read simple, teragon-style palette files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +from ._binary import o8 + + +## +# File handler for Teragon-style palette files. + +class PaletteFile(object): + + rawmode = "RGB" + + def __init__(self, fp): + + self.palette = [(i, i, i) for i in range(256)] + + while True: + + s = fp.readline() + + if not s: + break + if s[0:1] == b"#": + continue + if len(s) > 100: + raise SyntaxError("bad palette file") + + v = [int(x) for x in s.split()] + try: + [i, r, g, b] = v + except ValueError: + [i, r] = v + g = b = r + + if 0 <= i <= 255: + self.palette[i] = o8(r) + o8(g) + o8(b) + + self.palette = b"".join(self.palette) + + def getpalette(self): + + return self.palette, self.rawmode diff --git a/imagecrunch/PIL/PalmImagePlugin.py b/imagecrunch/PIL/PalmImagePlugin.py new file mode 100644 index 0000000..7d7b165 --- /dev/null +++ b/imagecrunch/PIL/PalmImagePlugin.py @@ -0,0 +1,236 @@ +# +# The Python Imaging Library. +# $Id$ +# + +## +# Image plugin for Palm pixmap images (output only). +## + +from . import Image, ImageFile +from ._binary import o8, o16be as o16b + +__version__ = "1.0" + +_Palm8BitColormapValues = ( + (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), + (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), + (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), + (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153), + (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255), + (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255), + (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204), + (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153), + (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153), + (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255), + (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204), + (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204), + (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153), + (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255), + (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255), + (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204), + (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153), + (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153), + (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255), + (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204), + (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204), + (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153), + (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255), + (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255), + (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204), + (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153), + (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153), + (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102), + (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51), + (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51), + (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), + (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102), + (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102), + (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51), + (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0), + (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0), + (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102), + (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51), + (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51), + (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0), + (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102), + (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102), + (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51), + (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0), + (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0), + (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102), + (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51), + (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51), + (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0), + (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102), + (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102), + (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51), + (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0), + (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17), + (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119), + (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221), + (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128), + (0, 128, 0), (0, 128, 128), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)) + + +# so build a prototype image to be used for palette resampling +def build_prototype_image(): + image = Image.new("L", (1, len(_Palm8BitColormapValues))) + image.putdata(list(range(len(_Palm8BitColormapValues)))) + palettedata = () + for colormapValue in _Palm8BitColormapValues: + palettedata += colormapValue + palettedata += (0, 0, 0)*(256 - len(_Palm8BitColormapValues)) + image.putpalette(palettedata) + return image + + +Palm8BitColormapImage = build_prototype_image() + +# OK, we now have in Palm8BitColormapImage, +# a "P"-mode image with the right palette +# +# -------------------------------------------------------------------- + +_FLAGS = { + "custom-colormap": 0x4000, + "is-compressed": 0x8000, + "has-transparent": 0x2000, + } + +_COMPRESSION_TYPES = { + "none": 0xFF, + "rle": 0x01, + "scanline": 0x00, + } + + +# +# -------------------------------------------------------------------- + +## +# (Internal) Image save plugin for the Palm format. + +def _save(im, fp, filename): + + if im.mode == "P": + + # we assume this is a color Palm image with the standard colormap, + # unless the "info" dict has a "custom-colormap" field + + rawmode = "P" + bpp = 8 + version = 1 + + elif (im.mode == "L" and + "bpp" in im.encoderinfo and + im.encoderinfo["bpp"] in (1, 2, 4)): + + # this is 8-bit grayscale, so we shift it to get the high-order bits, + # and invert it because + # Palm does greyscale from white (0) to black (1) + bpp = im.encoderinfo["bpp"] + im = im.point( + lambda x, shift=8-bpp, maxval=(1 << bpp)-1: maxval - (x >> shift)) + # we ignore the palette here + im.mode = "P" + rawmode = "P;" + str(bpp) + version = 1 + + elif im.mode == "L" and "bpp" in im.info and im.info["bpp"] in (1, 2, 4): + + # here we assume that even though the inherent mode is 8-bit grayscale, + # only the lower bpp bits are significant. + # We invert them to match the Palm. + bpp = im.info["bpp"] + im = im.point(lambda x, maxval=(1 << bpp)-1: maxval - (x & maxval)) + # we ignore the palette here + im.mode = "P" + rawmode = "P;" + str(bpp) + version = 1 + + elif im.mode == "1": + + # monochrome -- write it inverted, as is the Palm standard + rawmode = "1;I" + bpp = 1 + version = 0 + + else: + + raise IOError("cannot write mode %s as Palm" % im.mode) + + # + # make sure image data is available + im.load() + + # write header + + cols = im.size[0] + rows = im.size[1] + + rowbytes = int((cols + (16//bpp - 1)) / (16 // bpp)) * 2 + transparent_index = 0 + compression_type = _COMPRESSION_TYPES["none"] + + flags = 0 + if im.mode == "P" and "custom-colormap" in im.info: + flags = flags & _FLAGS["custom-colormap"] + colormapsize = 4 * 256 + 2 + colormapmode = im.palette.mode + colormap = im.getdata().getpalette() + else: + colormapsize = 0 + + if "offset" in im.info: + offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 + else: + offset = 0 + + fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) + fp.write(o8(bpp)) + fp.write(o8(version)) + fp.write(o16b(offset)) + fp.write(o8(transparent_index)) + fp.write(o8(compression_type)) + fp.write(o16b(0)) # reserved by Palm + + # now write colormap if necessary + + if colormapsize > 0: + fp.write(o16b(256)) + for i in range(256): + fp.write(o8(i)) + if colormapmode == 'RGB': + fp.write( + o8(colormap[3 * i]) + + o8(colormap[3 * i + 1]) + + o8(colormap[3 * i + 2])) + elif colormapmode == 'RGBA': + fp.write( + o8(colormap[4 * i]) + + o8(colormap[4 * i + 1]) + + o8(colormap[4 * i + 2])) + + # now convert data to raw form + ImageFile._save( + im, fp, [("raw", (0, 0)+im.size, 0, (rawmode, rowbytes, 1))]) + + if hasattr(fp, "flush"): + fp.flush() + + +# +# -------------------------------------------------------------------- + +Image.register_save("Palm", _save) + +Image.register_extension("Palm", ".palm") + +Image.register_mime("Palm", "image/palm") diff --git a/imagecrunch/PIL/PcdImagePlugin.py b/imagecrunch/PIL/PcdImagePlugin.py new file mode 100644 index 0000000..fa95b50 --- /dev/null +++ b/imagecrunch/PIL/PcdImagePlugin.py @@ -0,0 +1,66 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCD file handling +# +# History: +# 96-05-10 fl Created +# 96-05-27 fl Added draft mode (128x192, 256x384) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile +from ._binary import i8 + +__version__ = "0.1" + + +## +# Image plugin for PhotoCD images. This plugin only reads the 768x512 +# image from the file; higher resolutions are encoded in a proprietary +# encoding. + +class PcdImageFile(ImageFile.ImageFile): + + format = "PCD" + format_description = "Kodak PhotoCD" + + def _open(self): + + # rough + self.fp.seek(2048) + s = self.fp.read(2048) + + if s[:4] != b"PCD_": + raise SyntaxError("not a PCD file") + + orientation = i8(s[1538]) & 3 + self.tile_post_rotate = None + if orientation == 1: + self.tile_post_rotate = 90 + elif orientation == 3: + self.tile_post_rotate = -90 + + self.mode = "RGB" + self.size = 768, 512 # FIXME: not correct for rotated images! + self.tile = [("pcd", (0, 0)+self.size, 96*2048, None)] + + def load_end(self): + if self.tile_post_rotate: + # Handle rotated PCDs + self.im = self.im.rotate(self.tile_post_rotate) + self.size = self.im.size + + +# +# registry + +Image.register_open(PcdImageFile.format, PcdImageFile) + +Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/imagecrunch/PIL/PcfFontFile.py b/imagecrunch/PIL/PcfFontFile.py new file mode 100644 index 0000000..eba85fe --- /dev/null +++ b/imagecrunch/PIL/PcfFontFile.py @@ -0,0 +1,245 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library +# $Id$ +# +# portable compiled font file parser +# +# history: +# 1997-08-19 fl created +# 2003-09-13 fl fixed loading of unicode fonts +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from . import Image, FontFile +from ._binary import i8, i16le as l16, i32le as l32, i16be as b16, i32be as b32 + +# -------------------------------------------------------------------- +# declarations + +PCF_MAGIC = 0x70636601 # "\x01fcp" + +PCF_PROPERTIES = (1 << 0) +PCF_ACCELERATORS = (1 << 1) +PCF_METRICS = (1 << 2) +PCF_BITMAPS = (1 << 3) +PCF_INK_METRICS = (1 << 4) +PCF_BDF_ENCODINGS = (1 << 5) +PCF_SWIDTHS = (1 << 6) +PCF_GLYPH_NAMES = (1 << 7) +PCF_BDF_ACCELERATORS = (1 << 8) + +BYTES_PER_ROW = [ + lambda bits: ((bits+7) >> 3), + lambda bits: ((bits+15) >> 3) & ~1, + lambda bits: ((bits+31) >> 3) & ~3, + lambda bits: ((bits+63) >> 3) & ~7, +] + + +def sz(s, o): + return s[o:s.index(b"\0", o)] + + +## +# Font file plugin for the X11 PCF format. + +class PcfFontFile(FontFile.FontFile): + + name = "name" + + def __init__(self, fp): + + magic = l32(fp.read(4)) + if magic != PCF_MAGIC: + raise SyntaxError("not a PCF file") + + FontFile.FontFile.__init__(self) + + count = l32(fp.read(4)) + self.toc = {} + for i in range(count): + type = l32(fp.read(4)) + self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) + + self.fp = fp + + self.info = self._load_properties() + + metrics = self._load_metrics() + bitmaps = self._load_bitmaps(metrics) + encoding = self._load_encoding() + + # + # create glyph structure + + for ch in range(256): + ix = encoding[ch] + if ix is not None: + x, y, l, r, w, a, d, f = metrics[ix] + glyph = (w, 0), (l, d-y, x+l, d), (0, 0, x, y), bitmaps[ix] + self.glyph[ch] = glyph + + def _getformat(self, tag): + + format, size, offset = self.toc[tag] + + fp = self.fp + fp.seek(offset) + + format = l32(fp.read(4)) + + if format & 4: + i16, i32 = b16, b32 + else: + i16, i32 = l16, l32 + + return fp, format, i16, i32 + + def _load_properties(self): + + # + # font properties + + properties = {} + + fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) + + nprops = i32(fp.read(4)) + + # read property description + p = [] + for i in range(nprops): + p.append((i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4)))) + if nprops & 3: + fp.seek(4 - (nprops & 3), 1) # pad + + data = fp.read(i32(fp.read(4))) + + for k, s, v in p: + k = sz(data, k) + if s: + v = sz(data, v) + properties[k] = v + + return properties + + def _load_metrics(self): + + # + # font metrics + + metrics = [] + + fp, format, i16, i32 = self._getformat(PCF_METRICS) + + append = metrics.append + + if (format & 0xff00) == 0x100: + + # "compressed" metrics + for i in range(i16(fp.read(2))): + left = i8(fp.read(1)) - 128 + right = i8(fp.read(1)) - 128 + width = i8(fp.read(1)) - 128 + ascent = i8(fp.read(1)) - 128 + descent = i8(fp.read(1)) - 128 + xsize = right - left + ysize = ascent + descent + append( + (xsize, ysize, left, right, width, + ascent, descent, 0) + ) + + else: + + # "jumbo" metrics + for i in range(i32(fp.read(4))): + left = i16(fp.read(2)) + right = i16(fp.read(2)) + width = i16(fp.read(2)) + ascent = i16(fp.read(2)) + descent = i16(fp.read(2)) + attributes = i16(fp.read(2)) + xsize = right - left + ysize = ascent + descent + append( + (xsize, ysize, left, right, width, + ascent, descent, attributes) + ) + + return metrics + + def _load_bitmaps(self, metrics): + + # + # bitmap data + + bitmaps = [] + + fp, format, i16, i32 = self._getformat(PCF_BITMAPS) + + nbitmaps = i32(fp.read(4)) + + if nbitmaps != len(metrics): + raise IOError("Wrong number of bitmaps") + + offsets = [] + for i in range(nbitmaps): + offsets.append(i32(fp.read(4))) + + bitmapSizes = [] + for i in range(4): + bitmapSizes.append(i32(fp.read(4))) + + # byteorder = format & 4 # non-zero => MSB + bitorder = format & 8 # non-zero => MSB + padindex = format & 3 + + bitmapsize = bitmapSizes[padindex] + offsets.append(bitmapsize) + + data = fp.read(bitmapsize) + + pad = BYTES_PER_ROW[padindex] + mode = "1;R" + if bitorder: + mode = "1" + + for i in range(nbitmaps): + x, y, l, r, w, a, d, f = metrics[i] + b, e = offsets[i], offsets[i+1] + bitmaps.append( + Image.frombytes("1", (x, y), data[b:e], "raw", mode, pad(x)) + ) + + return bitmaps + + def _load_encoding(self): + + # map character code to bitmap index + encoding = [None] * 256 + + fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) + + firstCol, lastCol = i16(fp.read(2)), i16(fp.read(2)) + firstRow, lastRow = i16(fp.read(2)), i16(fp.read(2)) + + default = i16(fp.read(2)) + + nencoding = (lastCol - firstCol + 1) * (lastRow - firstRow + 1) + + for i in range(nencoding): + encodingOffset = i16(fp.read(2)) + if encodingOffset != 0xFFFF: + try: + encoding[i+firstCol] = encodingOffset + except IndexError: + break # only load ISO-8859-1 glyphs + + return encoding diff --git a/imagecrunch/PIL/PcxImagePlugin.py b/imagecrunch/PIL/PcxImagePlugin.py new file mode 100644 index 0000000..564713a --- /dev/null +++ b/imagecrunch/PIL/PcxImagePlugin.py @@ -0,0 +1,179 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCX file handling +# +# This format was originally used by ZSoft's popular PaintBrush +# program for the IBM PC. It is also supported by many MS-DOS and +# Windows applications, including the Windows PaintBrush program in +# Windows 3. +# +# history: +# 1995-09-01 fl Created +# 1996-05-20 fl Fixed RGB support +# 1997-01-03 fl Fixed 2-bit and 4-bit support +# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) +# 1999-02-07 fl Added write support +# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust +# 2002-07-30 fl Seek from to current position, not beginning of file +# 2003-06-03 fl Extract DPI settings (info["dpi"]) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +import logging +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, o8, o16le as o16 + +logger = logging.getLogger(__name__) + +__version__ = "0.6" + + +def _accept(prefix): + return i8(prefix[0]) == 10 and i8(prefix[1]) in [0, 2, 3, 5] + + +## +# Image plugin for Paintbrush images. + +class PcxImageFile(ImageFile.ImageFile): + + format = "PCX" + format_description = "Paintbrush" + + def _open(self): + + # header + s = self.fp.read(128) + if not _accept(s): + raise SyntaxError("not a PCX file") + + # image + bbox = i16(s, 4), i16(s, 6), i16(s, 8)+1, i16(s, 10)+1 + if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: + raise SyntaxError("bad PCX image size") + logger.debug("BBox: %s %s %s %s", *bbox) + + # format + version = i8(s[1]) + bits = i8(s[3]) + planes = i8(s[65]) + stride = i16(s, 66) + logger.debug("PCX version %s, bits %s, planes %s, stride %s", + version, bits, planes, stride) + + self.info["dpi"] = i16(s, 12), i16(s, 14) + + if bits == 1 and planes == 1: + mode = rawmode = "1" + + elif bits == 1 and planes in (2, 4): + mode = "P" + rawmode = "P;%dL" % planes + self.palette = ImagePalette.raw("RGB", s[16:64]) + + elif version == 5 and bits == 8 and planes == 1: + mode = rawmode = "L" + # FIXME: hey, this doesn't work with the incremental loader !!! + self.fp.seek(-769, 2) + s = self.fp.read(769) + if len(s) == 769 and i8(s[0]) == 12: + # check if the palette is linear greyscale + for i in range(256): + if s[i*3+1:i*3+4] != o8(i)*3: + mode = rawmode = "P" + break + if mode == "P": + self.palette = ImagePalette.raw("RGB", s[1:]) + self.fp.seek(128) + + elif version == 5 and bits == 8 and planes == 3: + mode = "RGB" + rawmode = "RGB;L" + + else: + raise IOError("unknown PCX mode") + + self.mode = mode + self.size = bbox[2]-bbox[0], bbox[3]-bbox[1] + + bbox = (0, 0) + self.size + logger.debug("size: %sx%s", *self.size) + + self.tile = [("pcx", bbox, self.fp.tell(), (rawmode, planes * stride))] + +# -------------------------------------------------------------------- +# save PCX files + + +SAVE = { + # mode: (version, bits, planes, raw mode) + "1": (2, 1, 1, "1"), + "L": (5, 8, 1, "L"), + "P": (5, 8, 1, "P"), + "RGB": (5, 8, 3, "RGB;L"), +} + + +def _save(im, fp, filename): + + try: + version, bits, planes, rawmode = SAVE[im.mode] + except KeyError: + raise ValueError("Cannot save %s images as PCX" % im.mode) + + # bytes per plane + stride = (im.size[0] * bits + 7) // 8 + # stride should be even + stride += stride % 2 + # Stride needs to be kept in sync with the PcxEncode.c version. + # Ideally it should be passed in in the state, but the bytes value + # gets overwritten. + + logger.debug("PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", + im.size[0], bits, stride) + + # under windows, we could determine the current screen size with + # "Image.core.display_mode()[1]", but I think that's overkill... + + screen = im.size + + dpi = 100, 100 + + # PCX header + fp.write( + o8(10) + o8(version) + o8(1) + o8(bits) + o16(0) + + o16(0) + o16(im.size[0]-1) + o16(im.size[1]-1) + o16(dpi[0]) + + o16(dpi[1]) + b"\0"*24 + b"\xFF"*24 + b"\0" + o8(planes) + + o16(stride) + o16(1) + o16(screen[0]) + o16(screen[1]) + + b"\0"*54 + ) + + assert fp.tell() == 128 + + ImageFile._save(im, fp, [("pcx", (0, 0)+im.size, 0, + (rawmode, bits*planes))]) + + if im.mode == "P": + # colour palette + fp.write(o8(12)) + fp.write(im.im.getpalette("RGB", "RGB")) # 768 bytes + elif im.mode == "L": + # greyscale palette + fp.write(o8(12)) + for i in range(256): + fp.write(o8(i)*3) + +# -------------------------------------------------------------------- +# registry + + +Image.register_open(PcxImageFile.format, PcxImageFile, _accept) +Image.register_save(PcxImageFile.format, _save) + +Image.register_extension(PcxImageFile.format, ".pcx") diff --git a/imagecrunch/PIL/PdfImagePlugin.py b/imagecrunch/PIL/PdfImagePlugin.py new file mode 100644 index 0000000..8538bcd --- /dev/null +++ b/imagecrunch/PIL/PdfImagePlugin.py @@ -0,0 +1,227 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PDF (Acrobat) file handling +# +# History: +# 1996-07-16 fl Created +# 1997-01-18 fl Fixed header +# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. +# 2004-02-24 fl Fixes for 1 and P images. +# +# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996-1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## +# Image plugin for PDF images (output only). +## + +from . import Image, ImageFile, ImageSequence, PdfParser +import io + +__version__ = "0.5" + + +# +# -------------------------------------------------------------------- + +# object ids: +# 1. catalogue +# 2. pages +# 3. image +# 4. page +# 5. page contents + + +def _save_all(im, fp, filename): + _save(im, fp, filename, save_all=True) + + +## +# (Internal) Image save plugin for the PDF format. + +def _save(im, fp, filename, save_all=False): + resolution = im.encoderinfo.get("resolution", 72.0) + is_appending = im.encoderinfo.get("append", False) + title = im.encoderinfo.get("title", None) + author = im.encoderinfo.get("author", None) + subject = im.encoderinfo.get("subject", None) + keywords = im.encoderinfo.get("keywords", None) + creator = im.encoderinfo.get("creator", None) + producer = im.encoderinfo.get("producer", None) + + if is_appending: + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b") + else: + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b") + + if title: + existing_pdf.info.Title = title + if author: + existing_pdf.info.Author = author + if subject: + existing_pdf.info.Subject = subject + if keywords: + existing_pdf.info.Keywords = keywords + if creator: + existing_pdf.info.Creator = creator + if producer: + existing_pdf.info.Producer = producer + + # + # make sure image data is available + im.load() + + existing_pdf.start_writing() + existing_pdf.write_header() + existing_pdf.write_comment("created by PIL PDF driver " + __version__) + + # + # pages + ims = [im] + if save_all: + append_images = im.encoderinfo.get("append_images", []) + for append_im in append_images: + append_im.encoderinfo = im.encoderinfo.copy() + ims.append(append_im) + numberOfPages = 0 + image_refs = [] + page_refs = [] + contents_refs = [] + for im in ims: + im_numberOfPages = 1 + if save_all: + try: + im_numberOfPages = im.n_frames + except AttributeError: + # Image format does not have n_frames. It is a single frame image + pass + numberOfPages += im_numberOfPages + for i in range(im_numberOfPages): + image_refs.append(existing_pdf.next_object_id(0)) + page_refs.append(existing_pdf.next_object_id(0)) + contents_refs.append(existing_pdf.next_object_id(0)) + existing_pdf.pages.append(page_refs[-1]) + + # + # catalog and list of pages + existing_pdf.write_catalog() + + pageNumber = 0 + for imSequence in ims: + im_pages = ImageSequence.Iterator(imSequence) if save_all else [imSequence] + for im in im_pages: + # FIXME: Should replace ASCIIHexDecode with RunLengthDecode (packbits) + # or LZWDecode (tiff/lzw compression). Note that PDF 1.2 also supports + # Flatedecode (zip compression). + + bits = 8 + params = None + + if im.mode == "1": + filter = "ASCIIHexDecode" + colorspace = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + bits = 1 + elif im.mode == "L": + filter = "DCTDecode" + # params = "<< /Predictor 15 /Columns %d >>" % (width-2) + colorspace = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "P": + filter = "ASCIIHexDecode" + palette = im.im.getpalette("RGB") + colorspace = [PdfParser.PdfName("Indexed"), PdfParser.PdfName("DeviceRGB"), 255, PdfParser.PdfBinary(palette)] + procset = "ImageI" # indexed color + elif im.mode == "RGB": + filter = "DCTDecode" + colorspace = PdfParser.PdfName("DeviceRGB") + procset = "ImageC" # color images + elif im.mode == "CMYK": + filter = "DCTDecode" + colorspace = PdfParser.PdfName("DeviceCMYK") + procset = "ImageC" # color images + else: + raise ValueError("cannot save mode %s" % im.mode) + + # + # image + + op = io.BytesIO() + + if filter == "ASCIIHexDecode": + if bits == 1: + # FIXME: the hex encoder doesn't support packed 1-bit + # images; do things the hard way... + data = im.tobytes("raw", "1") + im = Image.new("L", (len(data), 1), None) + im.putdata(data) + ImageFile._save(im, op, [("hex", (0, 0)+im.size, 0, im.mode)]) + elif filter == "DCTDecode": + Image.SAVE["JPEG"](im, op, filename) + elif filter == "FlateDecode": + ImageFile._save(im, op, [("zip", (0, 0)+im.size, 0, im.mode)]) + elif filter == "RunLengthDecode": + ImageFile._save(im, op, [("packbits", (0, 0)+im.size, 0, im.mode)]) + else: + raise ValueError("unsupported PDF filter (%s)" % filter) + + # + # Get image characteristics + + width, height = im.size + + existing_pdf.write_obj(image_refs[pageNumber], stream=op.getvalue(), + Type=PdfParser.PdfName("XObject"), + Subtype=PdfParser.PdfName("Image"), + Width=width, # * 72.0 / resolution, + Height=height, # * 72.0 / resolution, + Filter=PdfParser.PdfName(filter), + BitsPerComponent=bits, + DecodeParams=params, + ColorSpace=colorspace) + + # + # page + + existing_pdf.write_page(page_refs[pageNumber], + Resources=PdfParser.PdfDict( + ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], + XObject=PdfParser.PdfDict(image=image_refs[pageNumber])), + MediaBox=[0, 0, int(width * 72.0 / resolution), int(height * 72.0 / resolution)], + Contents=contents_refs[pageNumber] + ) + + # + # page contents + + page_contents = PdfParser.make_bytes( + "q %d 0 0 %d 0 0 cm /image Do Q\n" % ( + int(width * 72.0 / resolution), + int(height * 72.0 / resolution))) + + existing_pdf.write_obj(contents_refs[pageNumber], stream=page_contents) + + pageNumber += 1 + + # + # trailer + existing_pdf.write_xref_and_trailer() + if hasattr(fp, "flush"): + fp.flush() + existing_pdf.close() + +# +# -------------------------------------------------------------------- + + +Image.register_save("PDF", _save) +Image.register_save_all("PDF", _save_all) + +Image.register_extension("PDF", ".pdf") + +Image.register_mime("PDF", "application/pdf") diff --git a/imagecrunch/PIL/PdfParser.py b/imagecrunch/PIL/PdfParser.py new file mode 100644 index 0000000..c0635ef --- /dev/null +++ b/imagecrunch/PIL/PdfParser.py @@ -0,0 +1,844 @@ +import codecs +import collections +import mmap +import os +import re +import zlib +from ._util import py3 + +try: + from UserDict import UserDict # Python 2.x +except ImportError: + UserDict = collections.UserDict # Python 3.x + + +if py3: # Python 3.x + def make_bytes(s): + return s.encode("us-ascii") +else: # Python 2.x + def make_bytes(s): # pragma: no cover + return s # pragma: no cover + + +# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set on page 656 +def encode_text(s): + return codecs.BOM_UTF16_BE + s.encode("utf_16_be") + + +PDFDocEncoding = { + 0x16: u"\u0017", + 0x18: u"\u02D8", + 0x19: u"\u02C7", + 0x1A: u"\u02C6", + 0x1B: u"\u02D9", + 0x1C: u"\u02DD", + 0x1D: u"\u02DB", + 0x1E: u"\u02DA", + 0x1F: u"\u02DC", + 0x80: u"\u2022", + 0x81: u"\u2020", + 0x82: u"\u2021", + 0x83: u"\u2026", + 0x84: u"\u2014", + 0x85: u"\u2013", + 0x86: u"\u0192", + 0x87: u"\u2044", + 0x88: u"\u2039", + 0x89: u"\u203A", + 0x8A: u"\u2212", + 0x8B: u"\u2030", + 0x8C: u"\u201E", + 0x8D: u"\u201C", + 0x8E: u"\u201D", + 0x8F: u"\u2018", + 0x90: u"\u2019", + 0x91: u"\u201A", + 0x92: u"\u2122", + 0x93: u"\uFB01", + 0x94: u"\uFB02", + 0x95: u"\u0141", + 0x96: u"\u0152", + 0x97: u"\u0160", + 0x98: u"\u0178", + 0x99: u"\u017D", + 0x9A: u"\u0131", + 0x9B: u"\u0142", + 0x9C: u"\u0153", + 0x9D: u"\u0161", + 0x9E: u"\u017E", + 0xA0: u"\u20AC", +} + + +def decode_text(b): + if b[:len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: + return b[len(codecs.BOM_UTF16_BE):].decode("utf_16_be") + elif py3: # Python 3.x + return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) + else: # Python 2.x + return u"".join(PDFDocEncoding.get(ord(byte), byte) for byte in b) + + +class PdfFormatError(RuntimeError): + """An error that probably indicates a syntactic or semantic error in the PDF file structure""" + pass + + +def check_format_condition(condition, error_message): + if not condition: + raise PdfFormatError(error_message) + + +class IndirectReference(collections.namedtuple("IndirectReferenceTuple", ["object_id", "generation"])): + def __str__(self): + return "%s %s R" % self + + def __bytes__(self): + return self.__str__().encode("us-ascii") + + def __eq__(self, other): + return other.__class__ is self.__class__ and other.object_id == self.object_id and other.generation == self.generation + + def __ne__(self, other): + return not (self == other) + + def __hash__(self): + return hash((self.object_id, self.generation)) + + +class IndirectObjectDef(IndirectReference): + def __str__(self): + return "%s %s obj" % self + + +class XrefTable: + def __init__(self): + self.existing_entries = {} # object ID => (offset, generation) + self.new_entries = {} # object ID => (offset, generation) + self.deleted_entries = {0: 65536} # object ID => generation + self.reading_finished = False + + def __setitem__(self, key, value): + if self.reading_finished: + self.new_entries[key] = value + else: + self.existing_entries[key] = value + if key in self.deleted_entries: + del self.deleted_entries[key] + + def __getitem__(self, key): + try: + return self.new_entries[key] + except KeyError: + return self.existing_entries[key] + + def __delitem__(self, key): + if key in self.new_entries: + generation = self.new_entries[key][1] + 1 + del self.new_entries[key] + self.deleted_entries[key] = generation + elif key in self.existing_entries: + generation = self.existing_entries[key][1] + 1 + self.deleted_entries[key] = generation + elif key in self.deleted_entries: + generation = self.deleted_entries[key] + else: + raise IndexError("object ID " + str(key) + " cannot be deleted because it doesn't exist") + + def __contains__(self, key): + return key in self.existing_entries or key in self.new_entries + + def __len__(self): + return len(set(self.existing_entries.keys()) | set(self.new_entries.keys()) | set(self.deleted_entries.keys())) + + def keys(self): + return (set(self.existing_entries.keys()) - set(self.deleted_entries.keys())) | set(self.new_entries.keys()) + + def write(self, f): + keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) + deleted_keys = sorted(set(self.deleted_entries.keys())) + startxref = f.tell() + f.write(b"xref\n") + while keys: + # find a contiguous sequence of object IDs + prev = None + for index, key in enumerate(keys): + if prev is None or prev+1 == key: + prev = key + else: + contiguous_keys = keys[:index] + keys = keys[index:] + break + else: + contiguous_keys = keys + keys = None + f.write(make_bytes("%d %d\n" % (contiguous_keys[0], len(contiguous_keys)))) + for object_id in contiguous_keys: + if object_id in self.new_entries: + f.write(make_bytes("%010d %05d n \n" % self.new_entries[object_id])) + else: + this_deleted_object_id = deleted_keys.pop(0) + check_format_condition(object_id == this_deleted_object_id, + "expected the next deleted object " + "ID to be %s, instead found %s" % + (object_id, this_deleted_object_id)) + try: + next_in_linked_list = deleted_keys[0] + except IndexError: + next_in_linked_list = 0 + f.write(make_bytes("%010d %05d f \n" % (next_in_linked_list, self.deleted_entries[object_id]))) + return startxref + + +class PdfName: + def __init__(self, name): + if isinstance(name, PdfName): + self.name = name.name + elif isinstance(name, bytes): + self.name = name + else: + self.name = name.encode("us-ascii") + + def name_as_str(self): + return self.name.decode("us-ascii") + + def __eq__(self, other): + return (isinstance(other, PdfName) and other.name == self.name) or other == self.name + + def __hash__(self): + return hash(self.name) + + def __repr__(self): + return "PdfName(%s)" % repr(self.name) + + @classmethod + def from_pdf_stream(cls, data): + return cls(PdfParser.interpret_name(data)) + + allowed_chars = set(range(33, 127)) - set(ord(c) for c in "#%/()<>[]{}") + + def __bytes__(self): + result = bytearray(b"/") + for b in self.name: + if py3: # Python 3.x + if b in self.allowed_chars: + result.append(b) + else: + result.extend(make_bytes("#%02X" % b)) + else: # Python 2.x + if ord(b) in self.allowed_chars: + result.append(b) + else: + result.extend(b"#%02X" % ord(b)) + return bytes(result) + + __str__ = __bytes__ + + +class PdfArray(list): + def __bytes__(self): + return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" + + __str__ = __bytes__ + + +class PdfDict(UserDict): + def __setattr__(self, key, value): + if key == "data": + if hasattr(UserDict, "__setattr__"): + UserDict.__setattr__(self, key, value) + else: + self.__dict__[key] = value + else: + if isinstance(key, str): + key = key.encode("us-ascii") + self[key] = value + + def __getattr__(self, key): + try: + value = self[key] + except KeyError: + try: + value = self[key.encode("us-ascii")] + except KeyError: + raise AttributeError(key) + if isinstance(value, bytes): + return decode_text(value) + else: + return value + + def __bytes__(self): + out = bytearray(b"<<") + for key, value in self.items(): + if value is None: + continue + value = pdf_repr(value) + out.extend(b"\n") + out.extend(bytes(PdfName(key))) + out.extend(b" ") + out.extend(value) + out.extend(b"\n>>") + return bytes(out) + + if not py3: + __str__ = __bytes__ + + +class PdfBinary: + def __init__(self, data): + self.data = data + + if py3: # Python 3.x + def __bytes__(self): + return make_bytes("<%s>" % "".join("%02X" % b for b in self.data)) + else: # Python 2.x + def __str__(self): + return "<%s>" % "".join("%02X" % ord(b) for b in self.data) + + +class PdfStream: + def __init__(self, dictionary, buf): + self.dictionary = dictionary + self.buf = buf + + def decode(self): + try: + filter = self.dictionary.Filter + except AttributeError: + return self.buf + if filter == b"FlateDecode": + try: + expected_length = self.dictionary.DL + except AttributeError: + expected_length = self.dictionary.Length + return zlib.decompress(self.buf, bufsize=int(expected_length)) + else: + raise NotImplementedError("stream filter %s unknown/unsupported" % repr(self.dictionary.Filter)) + + +def pdf_repr(x): + if x is True: + return b"true" + elif x is False: + return b"false" + elif x is None: + return b"null" + elif isinstance(x, PdfName) or isinstance(x, PdfDict) or isinstance(x, PdfArray) or isinstance(x, PdfBinary): + return bytes(x) + elif isinstance(x, int): + return str(x).encode("us-ascii") + elif isinstance(x, dict): + return bytes(PdfDict(x)) + elif isinstance(x, list): + return bytes(PdfArray(x)) + elif (py3 and isinstance(x, str)) or (not py3 and isinstance(x, unicode)): + return pdf_repr(encode_text(x)) + elif isinstance(x, bytes): + return b"(" + x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") + b")" # XXX escape more chars? handle binary garbage + else: + return bytes(x) + + +class PdfParser: + """Based on https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf + Supports PDF up to 1.4 + """ + + def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): + # type: (PdfParser, str, file, Union[bytes, bytearray], int, str) -> None + if buf and f: + raise RuntimeError("specify buf or f or filename, but not both buf and f") + self.filename = filename + self.buf = buf + self.f = f + self.start_offset = start_offset + self.should_close_buf = False + self.should_close_file = False + if filename is not None and f is None: + self.f = f = open(filename, mode) + self.should_close_file = True + if f is not None: + self.buf = buf = self.get_buf_from_file(f) + self.should_close_buf = True + if not filename and hasattr(f, "name"): + self.filename = f.name + self.cached_objects = {} + if buf: + self.read_pdf_info() + else: + self.file_size_total = self.file_size_this = 0 + self.root = PdfDict() + self.root_ref = None + self.info = PdfDict() + self.info_ref = None + self.page_tree_root = {} + self.pages = [] + self.orig_pages = [] + self.pages_ref = None + self.last_xref_section_offset = None + self.trailer_dict = {} + self.xref_table = XrefTable() + self.xref_table.reading_finished = True + if f: + self.seek_end() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + return False # do not suppress exceptions + + def start_writing(self): + self.close_buf() + self.seek_end() + + def close_buf(self): + try: + self.buf.close() + except AttributeError: + pass + self.buf = None + + def close(self): + if self.should_close_buf: + self.close_buf() + if self.f is not None and self.should_close_file: + self.f.close() + self.f = None + + def seek_end(self): + self.f.seek(0, os.SEEK_END) + + def write_header(self): + self.f.write(b"%PDF-1.4\n") + + def write_comment(self, s): + self.f.write(("%% %s\n" % (s,)).encode("utf-8")) + + def write_catalog(self): + self.del_root() + self.root_ref = self.next_object_id(self.f.tell()) + self.pages_ref = self.next_object_id(0) + self.rewrite_pages() + self.write_obj(self.root_ref, + Type=PdfName(b"Catalog"), + Pages=self.pages_ref) + self.write_obj(self.pages_ref, + Type=PdfName(b"Pages"), + Count=len(self.pages), + Kids=self.pages) + return self.root_ref + + def rewrite_pages(self): + pages_tree_nodes_to_delete = [] + for i, page_ref in enumerate(self.orig_pages): + page_info = self.cached_objects[page_ref] + del self.xref_table[page_ref.object_id] + pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) + if page_ref not in self.pages: + # the page has been deleted + continue + # make dict keys into strings for passing to write_page + stringified_page_info = {} + for key, value in page_info.items(): + # key should be a PdfName + stringified_page_info[key.name_as_str()] = value + stringified_page_info["Parent"] = self.pages_ref + new_page_ref = self.write_page(None, **stringified_page_info) + for j, cur_page_ref in enumerate(self.pages): + if cur_page_ref == page_ref: + # replace the page reference with the new one + self.pages[j] = new_page_ref + # delete redundant Pages tree nodes from xref table + for pages_tree_node_ref in pages_tree_nodes_to_delete: + while pages_tree_node_ref: + pages_tree_node = self.cached_objects[pages_tree_node_ref] + if pages_tree_node_ref.object_id in self.xref_table: + del self.xref_table[pages_tree_node_ref.object_id] + pages_tree_node_ref = pages_tree_node.get(b"Parent", None) + self.orig_pages = [] + + def write_xref_and_trailer(self, new_root_ref=None): + if new_root_ref: + self.del_root() + self.root_ref = new_root_ref + if self.info: + self.info_ref = self.write_obj(None, self.info) + start_xref = self.xref_table.write(self.f) + num_entries = len(self.xref_table) + trailer_dict = {b"Root": self.root_ref, b"Size": num_entries} + if self.last_xref_section_offset is not None: + trailer_dict[b"Prev"] = self.last_xref_section_offset + if self.info: + trailer_dict[b"Info"] = self.info_ref + self.last_xref_section_offset = start_xref + self.f.write(b"trailer\n" + bytes(PdfDict(trailer_dict)) + make_bytes("\nstartxref\n%d\n%%%%EOF" % start_xref)) + + def write_page(self, ref, *objs, **dict_obj): + if isinstance(ref, int): + ref = self.pages[ref] + if "Type" not in dict_obj: + dict_obj["Type"] = PdfName(b"Page") + if "Parent" not in dict_obj: + dict_obj["Parent"] = self.pages_ref + return self.write_obj(ref, *objs, **dict_obj) + + def write_obj(self, ref, *objs, **dict_obj): + f = self.f + if ref is None: + ref = self.next_object_id(f.tell()) + else: + self.xref_table[ref.object_id] = (f.tell(), ref.generation) + f.write(bytes(IndirectObjectDef(*ref))) + stream = dict_obj.pop("stream", None) + if stream is not None: + dict_obj["Length"] = len(stream) + if dict_obj: + f.write(pdf_repr(dict_obj)) + for obj in objs: + f.write(pdf_repr(obj)) + if stream is not None: + f.write(b"stream\n") + f.write(stream) + f.write(b"\nendstream\n") + f.write(b"endobj\n") + return ref + + def del_root(self): + if self.root_ref is None: + return + del self.xref_table[self.root_ref.object_id] + del self.xref_table[self.root[b"Pages"].object_id] + + @staticmethod + def get_buf_from_file(f): + if hasattr(f, "getbuffer"): + return f.getbuffer() + elif hasattr(f, "getvalue"): + return f.getvalue() + else: + try: + return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) + except ValueError: # cannot mmap an empty file + return b"" + + def read_pdf_info(self): + self.file_size_total = len(self.buf) + self.file_size_this = self.file_size_total - self.start_offset + self.read_trailer() + self.root_ref = self.trailer_dict[b"Root"] + self.info_ref = self.trailer_dict.get(b"Info", None) + self.root = PdfDict(self.read_indirect(self.root_ref)) + if self.info_ref is None: + self.info = PdfDict() + else: + self.info = PdfDict(self.read_indirect(self.info_ref)) + check_format_condition(b"Type" in self.root, "/Type missing in Root") + check_format_condition(self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog") + check_format_condition(b"Pages" in self.root, "/Pages missing in Root") + check_format_condition(isinstance(self.root[b"Pages"], IndirectReference), "/Pages in Root is not an indirect reference") + self.pages_ref = self.root[b"Pages"] + self.page_tree_root = self.read_indirect(self.pages_ref) + self.pages = self.linearize_page_tree(self.page_tree_root) + # save the original list of page references in case the user modifies, adds or deletes some pages and we need to rewrite the pages and their list + self.orig_pages = self.pages[:] + + def next_object_id(self, offset=None): + try: + # TODO: support reuse of deleted objects + reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) + except ValueError: + reference = IndirectReference(1, 0) + if offset is not None: + self.xref_table[reference.object_id] = (offset, 0) + return reference + + delimiter = br"[][()<>{}/%]" + delimiter_or_ws = br"[][()<>{}/%\000\011\012\014\015\040]" + whitespace = br"[\000\011\012\014\015\040]" + whitespace_or_hex = br"[\000\011\012\014\015\0400-9a-fA-F]" + whitespace_optional = whitespace + b"*" + whitespace_mandatory = whitespace + b"+" + newline_only = br"[\r\n]+" + newline = whitespace_optional + newline_only + whitespace_optional + re_trailer_end = re.compile(whitespace_mandatory + br"trailer" + whitespace_optional + br"\<\<(.*\>\>)" + newline + + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional + br"$", re.DOTALL) + re_trailer_prev = re.compile(whitespace_optional + br"trailer" + whitespace_optional + br"\<\<(.*?\>\>)" + newline + + br"startxref" + newline + br"([0-9]+)" + newline + br"%%EOF" + whitespace_optional, re.DOTALL) + + def read_trailer(self): + search_start_offset = len(self.buf) - 16384 + if search_start_offset < self.start_offset: + search_start_offset = self.start_offset + m = self.re_trailer_end.search(self.buf, search_start_offset) + check_format_condition(m, "trailer end not found") + # make sure we found the LAST trailer + last_match = m + while m: + last_match = m + m = self.re_trailer_end.search(self.buf, m.start()+16) + if not m: + m = last_match + trailer_data = m.group(1) + self.last_xref_section_offset = int(m.group(2)) + self.trailer_dict = self.interpret_trailer(trailer_data) + self.xref_table = XrefTable() + self.read_xref_table(xref_section_offset=self.last_xref_section_offset) + if b"Prev" in self.trailer_dict: + self.read_prev_trailer(self.trailer_dict[b"Prev"]) + + def read_prev_trailer(self, xref_section_offset): + trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) + m = self.re_trailer_prev.search(self.buf[trailer_offset:trailer_offset+16384]) + check_format_condition(m, "previous trailer not found") + trailer_data = m.group(1) + check_format_condition(int(m.group(2)) == xref_section_offset, "xref section offset in previous trailer doesn't match what was expected") + trailer_dict = self.interpret_trailer(trailer_data) + if b"Prev" in trailer_dict: + self.read_prev_trailer(trailer_dict[b"Prev"]) + + re_whitespace_optional = re.compile(whitespace_optional) + re_name = re.compile(whitespace_optional + br"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" + delimiter_or_ws + br")") + re_dict_start = re.compile(whitespace_optional + br"\<\<") + re_dict_end = re.compile(whitespace_optional + br"\>\>" + whitespace_optional) + + @classmethod + def interpret_trailer(cls, trailer_data): + trailer = {} + offset = 0 + while True: + m = cls.re_name.match(trailer_data, offset) + if not m: + m = cls.re_dict_end.match(trailer_data, offset) + check_format_condition(m and m.end() == len(trailer_data), "name not found in trailer, remaining data: " + repr(trailer_data[offset:])) + break + key = cls.interpret_name(m.group(1)) + value, offset = cls.get_value(trailer_data, m.end()) + trailer[key] = value + check_format_condition(b"Size" in trailer and isinstance(trailer[b"Size"], int), "/Size not in trailer or not an integer") + check_format_condition(b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), "/Root not in trailer or not an indirect reference") + return trailer + + re_hashes_in_name = re.compile(br"([^#]*)(#([0-9a-fA-F]{2}))?") + + @classmethod + def interpret_name(cls, raw, as_text=False): + name = b"" + for m in cls.re_hashes_in_name.finditer(raw): + if m.group(3): + name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) + else: + name += m.group(1) + if as_text: + return name.decode("utf-8") + else: + return bytes(name) + + re_null = re.compile(whitespace_optional + br"null(?=" + delimiter_or_ws + br")") + re_true = re.compile(whitespace_optional + br"true(?=" + delimiter_or_ws + br")") + re_false = re.compile(whitespace_optional + br"false(?=" + delimiter_or_ws + br")") + re_int = re.compile(whitespace_optional + br"([-+]?[0-9]+)(?=" + delimiter_or_ws + br")") + re_real = re.compile(whitespace_optional + br"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" + delimiter_or_ws + br")") + re_array_start = re.compile(whitespace_optional + br"\[") + re_array_end = re.compile(whitespace_optional + br"]") + re_string_hex = re.compile(whitespace_optional + br"\<(" + whitespace_or_hex + br"*)\>") + re_string_lit = re.compile(whitespace_optional + br"\(") + re_indirect_reference = re.compile(whitespace_optional + br"([-+]?[0-9]+)" + whitespace_mandatory + br"([-+]?[0-9]+)" + whitespace_mandatory + br"R(?=" + delimiter_or_ws + br")") + re_indirect_def_start = re.compile(whitespace_optional + br"([-+]?[0-9]+)" + whitespace_mandatory + br"([-+]?[0-9]+)" + whitespace_mandatory + br"obj(?=" + delimiter_or_ws + br")") + re_indirect_def_end = re.compile(whitespace_optional + br"endobj(?=" + delimiter_or_ws + br")") + re_comment = re.compile(br"(" + whitespace_optional + br"%[^\r\n]*" + newline + br")*") + re_stream_start = re.compile(whitespace_optional + br"stream\r?\n") + re_stream_end = re.compile(whitespace_optional + br"endstream(?=" + delimiter_or_ws + br")") + + @classmethod + def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): + if max_nesting == 0: + return None, None + m = cls.re_comment.match(data, offset) + if m: + offset = m.end() + m = cls.re_indirect_def_start.match(data, offset) + if m: + check_format_condition(int(m.group(1)) > 0, "indirect object definition: object ID must be greater than 0") + check_format_condition(int(m.group(2)) >= 0, "indirect object definition: generation must be non-negative") + check_format_condition(expect_indirect is None or expect_indirect == IndirectReference(int(m.group(1)), int(m.group(2))), + "indirect object definition different than expected") + object, offset = cls.get_value(data, m.end(), max_nesting=max_nesting-1) + if offset is None: + return object, None + m = cls.re_indirect_def_end.match(data, offset) + check_format_condition(m, "indirect object definition end not found") + return object, m.end() + check_format_condition(not expect_indirect, "indirect object definition not found") + m = cls.re_indirect_reference.match(data, offset) + if m: + check_format_condition(int(m.group(1)) > 0, "indirect object reference: object ID must be greater than 0") + check_format_condition(int(m.group(2)) >= 0, "indirect object reference: generation must be non-negative") + return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() + m = cls.re_dict_start.match(data, offset) + if m: + offset = m.end() + result = {} + m = cls.re_dict_end.match(data, offset) + while not m: + key, offset = cls.get_value(data, offset, max_nesting=max_nesting-1) + if offset is None: + return result, None + value, offset = cls.get_value(data, offset, max_nesting=max_nesting-1) + result[key] = value + if offset is None: + return result, None + m = cls.re_dict_end.match(data, offset) + offset = m.end() + m = cls.re_stream_start.match(data, offset) + if m: + try: + stream_len = int(result[b"Length"]) + except (TypeError, KeyError, ValueError): + raise PdfFormatError("bad or missing Length in stream dict (%r)" % result.get(b"Length", None)) + stream_data = data[m.end():m.end() + stream_len] + m = cls.re_stream_end.match(data, m.end() + stream_len) + check_format_condition(m, "stream end not found") + offset = m.end() + result = PdfStream(PdfDict(result), stream_data) + else: + result = PdfDict(result) + return result, offset + m = cls.re_array_start.match(data, offset) + if m: + offset = m.end() + result = [] + m = cls.re_array_end.match(data, offset) + while not m: + value, offset = cls.get_value(data, offset, max_nesting=max_nesting-1) + result.append(value) + if offset is None: + return result, None + m = cls.re_array_end.match(data, offset) + return result, m.end() + m = cls.re_null.match(data, offset) + if m: + return None, m.end() + m = cls.re_true.match(data, offset) + if m: + return True, m.end() + m = cls.re_false.match(data, offset) + if m: + return False, m.end() + m = cls.re_name.match(data, offset) + if m: + return PdfName(cls.interpret_name(m.group(1))), m.end() + m = cls.re_int.match(data, offset) + if m: + return int(m.group(1)), m.end() + m = cls.re_real.match(data, offset) + if m: + return float(m.group(1)), m.end() # XXX Decimal instead of float??? + m = cls.re_string_hex.match(data, offset) + if m: + hex_string = bytearray([b for b in m.group(1) if b in b"0123456789abcdefABCDEF"]) # filter out whitespace + if len(hex_string) % 2 == 1: + hex_string.append(ord(b"0")) # append a 0 if the length is not even - yes, at the end + return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() + m = cls.re_string_lit.match(data, offset) + if m: + return cls.get_literal_string(data, m.end()) + #return None, offset # fallback (only for debugging) + raise PdfFormatError("unrecognized object: " + repr(data[offset:offset+32])) + + re_lit_str_token = re.compile(br"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))") + escaped_chars = { + b"n": b"\n", + b"r": b"\r", + b"t": b"\t", + b"b": b"\b", + b"f": b"\f", + b"(": b"(", + b")": b")", + b"\\": b"\\", + ord(b"n"): b"\n", + ord(b"r"): b"\r", + ord(b"t"): b"\t", + ord(b"b"): b"\b", + ord(b"f"): b"\f", + ord(b"("): b"(", + ord(b")"): b")", + ord(b"\\"): b"\\", + } + + @classmethod + def get_literal_string(cls, data, offset): + nesting_depth = 0 + result = bytearray() + for m in cls.re_lit_str_token.finditer(data, offset): + result.extend(data[offset:m.start()]) + if m.group(1): + result.extend(cls.escaped_chars[m.group(1)[1]]) + elif m.group(2): + result.append(int(m.group(2)[1:], 8)) + elif m.group(3): + pass + elif m.group(5): + result.extend(b"\n") + elif m.group(6): + result.extend(b"(") + nesting_depth += 1 + elif m.group(7): + if nesting_depth == 0: + return bytes(result), m.end() + result.extend(b")") + nesting_depth -= 1 + offset = m.end() + raise PdfFormatError("unfinished literal string") + + re_xref_section_start = re.compile(whitespace_optional + br"xref" + newline) + re_xref_subsection_start = re.compile(whitespace_optional + br"([0-9]+)" + whitespace_mandatory + br"([0-9]+)" + whitespace_optional + newline_only) + re_xref_entry = re.compile(br"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") + + def read_xref_table(self, xref_section_offset): + subsection_found = False + m = self.re_xref_section_start.match(self.buf, xref_section_offset + self.start_offset) + check_format_condition(m, "xref section start not found") + offset = m.end() + while True: + m = self.re_xref_subsection_start.match(self.buf, offset) + if not m: + check_format_condition(subsection_found, "xref subsection start not found") + break + subsection_found = True + offset = m.end() + first_object = int(m.group(1)) + num_objects = int(m.group(2)) + for i in range(first_object, first_object+num_objects): + m = self.re_xref_entry.match(self.buf, offset) + check_format_condition(m, "xref entry not found") + offset = m.end() + is_free = m.group(3) == b"f" + generation = int(m.group(2)) + if not is_free: + new_entry = (int(m.group(1)), generation) + check_format_condition(i not in self.xref_table or self.xref_table[i] == new_entry, "xref entry duplicated (and not identical)") + self.xref_table[i] = new_entry + return offset + + def read_indirect(self, ref, max_nesting=-1): + offset, generation = self.xref_table[ref[0]] + check_format_condition(generation == ref[1], "expected to find generation %s for object ID %s in xref table, instead found generation %s at offset %s" \ + % (ref[1], ref[0], generation, offset)) + value = self.get_value(self.buf, offset + self.start_offset, expect_indirect=IndirectReference(*ref), max_nesting=max_nesting)[0] + self.cached_objects[ref] = value + return value + + def linearize_page_tree(self, node=None): + if node is None: + node = self.page_tree_root + check_format_condition(node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages") + pages = [] + for kid in node[b"Kids"]: + kid_object = self.read_indirect(kid) + if kid_object[b"Type"] == b"Page": + pages.append(kid) + else: + pages.extend(self.linearize_page_tree(node=kid_object)) + return pages diff --git a/imagecrunch/PIL/PixarImagePlugin.py b/imagecrunch/PIL/PixarImagePlugin.py new file mode 100644 index 0000000..220577c --- /dev/null +++ b/imagecrunch/PIL/PixarImagePlugin.py @@ -0,0 +1,71 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIXAR raster support for PIL +# +# history: +# 97-01-29 fl Created +# +# notes: +# This is incomplete; it is based on a few samples created with +# Photoshop 2.5 and 3.0, and a summary description provided by +# Greg Coats . Hopefully, "L" and +# "RGBA" support will be added in future versions. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +from . import Image, ImageFile +from ._binary import i16le as i16 + +__version__ = "0.1" + + +# +# helpers + +def _accept(prefix): + return prefix[:4] == b"\200\350\000\000" + + +## +# Image plugin for PIXAR raster images. + +class PixarImageFile(ImageFile.ImageFile): + + format = "PIXAR" + format_description = "PIXAR raster image" + + def _open(self): + + # assuming a 4-byte magic label + s = self.fp.read(4) + if s != b"\200\350\000\000": + raise SyntaxError("not a PIXAR file") + + # read rest of header + s = s + self.fp.read(508) + + self.size = i16(s[418:420]), i16(s[416:418]) + + # get channel/depth descriptions + mode = i16(s[424:426]), i16(s[426:428]) + + if mode == (14, 2): + self.mode = "RGB" + # FIXME: to be continued... + + # create tile descriptor (assuming "dumped") + self.tile = [("raw", (0, 0)+self.size, 1024, (self.mode, 0, 1))] + + +# +# -------------------------------------------------------------------- + +Image.register_open(PixarImageFile.format, PixarImageFile, _accept) + +Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/imagecrunch/PIL/PngImagePlugin.py b/imagecrunch/PIL/PngImagePlugin.py new file mode 100644 index 0000000..8260619 --- /dev/null +++ b/imagecrunch/PIL/PngImagePlugin.py @@ -0,0 +1,870 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PNG support code +# +# See "PNG (Portable Network Graphics) Specification, version 1.0; +# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). +# +# history: +# 1996-05-06 fl Created (couldn't resist it) +# 1996-12-14 fl Upgraded, added read and verify support (0.2) +# 1996-12-15 fl Separate PNG stream parser +# 1996-12-29 fl Added write support, added getchunks +# 1996-12-30 fl Eliminated circular references in decoder (0.3) +# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) +# 2001-02-08 fl Added transparency support (from Zircon) (0.5) +# 2001-04-16 fl Don't close data source in "open" method (0.6) +# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) +# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) +# 2004-09-20 fl Added PngInfo chunk container +# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) +# 2008-08-13 fl Added tRNS support for RGB images +# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) +# 2009-03-08 fl Added zTXT support (from Lowell Alleman) +# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) +# +# Copyright (c) 1997-2009 by Secret Labs AB +# Copyright (c) 1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import logging +import re +import zlib +import struct + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16be as i16, i32be as i32, o16be as o16, o32be as o32 +from ._util import py3 + +__version__ = "0.9" + +logger = logging.getLogger(__name__) + +is_cid = re.compile(br"\w\w\w\w").match + + +_MAGIC = b"\211PNG\r\n\032\n" + + +_MODES = { + # supported bits/color combinations, and corresponding modes/rawmodes + (1, 0): ("1", "1"), + (2, 0): ("L", "L;2"), + (4, 0): ("L", "L;4"), + (8, 0): ("L", "L"), + (16, 0): ("I", "I;16B"), + (8, 2): ("RGB", "RGB"), + (16, 2): ("RGB", "RGB;16B"), + (1, 3): ("P", "P;1"), + (2, 3): ("P", "P;2"), + (4, 3): ("P", "P;4"), + (8, 3): ("P", "P"), + (8, 4): ("LA", "LA"), + (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available + (8, 6): ("RGBA", "RGBA"), + (16, 6): ("RGBA", "RGBA;16B"), +} + + +_simple_palette = re.compile(b'^\xff*\x00\xff*$') + +# Maximum decompressed size for a iTXt or zTXt chunk. +# Eliminates decompression bombs where compressed chunks can expand 1000x +MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK +# Set the maximum total text chunk size. +MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK + + +def _safe_zlib_decompress(s): + dobj = zlib.decompressobj() + plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) + if dobj.unconsumed_tail: + raise ValueError("Decompressed Data Too Large") + return plaintext + + +def _crc32(data, seed=0): + return zlib.crc32(data, seed) & 0xffffffff + + +# -------------------------------------------------------------------- +# Support classes. Suitable for PNG and related formats like MNG etc. + +class ChunkStream(object): + + def __init__(self, fp): + + self.fp = fp + self.queue = [] + + def read(self): + "Fetch a new chunk. Returns header information." + cid = None + + if self.queue: + cid, pos, length = self.queue.pop() + self.fp.seek(pos) + else: + s = self.fp.read(8) + cid = s[4:] + pos = self.fp.tell() + length = i32(s) + + if not is_cid(cid): + if not ImageFile.LOAD_TRUNCATED_IMAGES: + raise SyntaxError("broken PNG file (chunk %s)" % repr(cid)) + + return cid, pos, length + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + self.queue = self.crc = self.fp = None + + def push(self, cid, pos, length): + + self.queue.append((cid, pos, length)) + + def call(self, cid, pos, length): + "Call the appropriate chunk handler" + + logger.debug("STREAM %r %s %s", cid, pos, length) + return getattr(self, "chunk_" + cid.decode('ascii'))(pos, length) + + def crc(self, cid, data): + "Read and verify checksum" + + # Skip CRC checks for ancillary chunks if allowed to load truncated images + # 5th byte of first char is 1 [specs, section 5.4] + if ImageFile.LOAD_TRUNCATED_IMAGES and (i8(cid[0]) >> 5 & 1): + self.crc_skip(cid, data) + return + + try: + crc1 = _crc32(data, _crc32(cid)) + crc2 = i32(self.fp.read(4)) + if crc1 != crc2: + raise SyntaxError("broken PNG file (bad header checksum in %r)" + % cid) + except struct.error: + raise SyntaxError("broken PNG file (incomplete checksum in %r)" + % cid) + + def crc_skip(self, cid, data): + "Read checksum. Used if the C module is not present" + + self.fp.read(4) + + def verify(self, endchunk=b"IEND"): + + # Simple approach; just calculate checksum for all remaining + # blocks. Must be called directly after open. + + cids = [] + + while True: + try: + cid, pos, length = self.read() + except struct.error: + raise IOError("truncated PNG file") + + if cid == endchunk: + break + self.crc(cid, ImageFile._safe_read(self.fp, length)) + cids.append(cid) + + return cids + + +class iTXt(str): + """ + Subclass of string to allow iTXt chunks to look like strings while + keeping their extra information + + """ + @staticmethod + def __new__(cls, text, lang, tkey): + """ + :param cls: the class to use when creating the instance + :param text: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + """ + + self = str.__new__(cls, text) + self.lang = lang + self.tkey = tkey + return self + + +class PngInfo(object): + """ + PNG chunk container (for use with save(pnginfo=)) + + """ + + def __init__(self): + self.chunks = [] + + def add(self, cid, data): + """Appends an arbitrary chunk. Use with caution. + + :param cid: a byte string, 4 bytes long. + :param data: a byte string of the encoded data + + """ + + self.chunks.append((cid, data)) + + def add_itxt(self, key, value, lang="", tkey="", zip=False): + """Appends an iTXt chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + :param zip: compression flag + + """ + + if not isinstance(key, bytes): + key = key.encode("latin-1", "strict") + if not isinstance(value, bytes): + value = value.encode("utf-8", "strict") + if not isinstance(lang, bytes): + lang = lang.encode("utf-8", "strict") + if not isinstance(tkey, bytes): + tkey = tkey.encode("utf-8", "strict") + + if zip: + self.add(b"iTXt", key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + + zlib.compress(value)) + else: + self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + + value) + + def add_text(self, key, value, zip=False): + """Appends a text chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key, text or an + :py:class:`PIL.PngImagePlugin.iTXt` instance + :param zip: compression flag + + """ + if isinstance(value, iTXt): + return self.add_itxt(key, value, value.lang, value.tkey, zip=zip) + + # The tEXt chunk stores latin-1 text + if not isinstance(value, bytes): + try: + value = value.encode('latin-1', 'strict') + except UnicodeError: + return self.add_itxt(key, value, zip=zip) + + if not isinstance(key, bytes): + key = key.encode('latin-1', 'strict') + + if zip: + self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) + else: + self.add(b"tEXt", key + b"\0" + value) + + +# -------------------------------------------------------------------- +# PNG image stream (IHDR/IEND) + +class PngStream(ChunkStream): + + def __init__(self, fp): + + ChunkStream.__init__(self, fp) + + # local copies of Image attributes + self.im_info = {} + self.im_text = {} + self.im_size = (0, 0) + self.im_mode = None + self.im_tile = None + self.im_palette = None + + self.text_memory = 0 + + def check_text_memory(self, chunklen): + self.text_memory += chunklen + if self.text_memory > MAX_TEXT_MEMORY: + raise ValueError("Too much memory used in text chunks: %s>MAX_TEXT_MEMORY" % + self.text_memory) + + def chunk_iCCP(self, pos, length): + + # ICC profile + s = ImageFile._safe_read(self.fp, length) + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + i = s.find(b"\0") + logger.debug("iCCP profile name %r", s[:i]) + logger.debug("Compression method %s", i8(s[i])) + comp_method = i8(s[i]) + if comp_method != 0: + raise SyntaxError("Unknown compression method %s in iCCP chunk" % + comp_method) + try: + icc_profile = _safe_zlib_decompress(s[i+2:]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + icc_profile = None + else: + raise + except zlib.error: + icc_profile = None # FIXME + self.im_info["icc_profile"] = icc_profile + return s + + def chunk_IHDR(self, pos, length): + + # image header + s = ImageFile._safe_read(self.fp, length) + self.im_size = i32(s), i32(s[4:]) + try: + self.im_mode, self.im_rawmode = _MODES[(i8(s[8]), i8(s[9]))] + except: + pass + if i8(s[12]): + self.im_info["interlace"] = 1 + if i8(s[11]): + raise SyntaxError("unknown filter category") + return s + + def chunk_IDAT(self, pos, length): + + # image data + self.im_tile = [("zip", (0, 0)+self.im_size, pos, self.im_rawmode)] + self.im_idat = length + raise EOFError + + def chunk_IEND(self, pos, length): + + # end of PNG image + raise EOFError + + def chunk_PLTE(self, pos, length): + + # palette + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + self.im_palette = "RGB", s + return s + + def chunk_tRNS(self, pos, length): + + # transparency + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + if _simple_palette.match(s): + # tRNS contains only one full-transparent entry, + # other entries are full opaque + i = s.find(b"\0") + if i >= 0: + self.im_info["transparency"] = i + else: + # otherwise, we have a byte string with one alpha value + # for each palette entry + self.im_info["transparency"] = s + elif self.im_mode == "L": + self.im_info["transparency"] = i16(s) + elif self.im_mode == "RGB": + self.im_info["transparency"] = i16(s), i16(s[2:]), i16(s[4:]) + return s + + def chunk_gAMA(self, pos, length): + # gamma setting + s = ImageFile._safe_read(self.fp, length) + self.im_info["gamma"] = i32(s) / 100000.0 + return s + + def chunk_cHRM(self, pos, length): + # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 + # WP x,y, Red x,y, Green x,y Blue x,y + + s = ImageFile._safe_read(self.fp, length) + raw_vals = struct.unpack('>%dI' % (len(s) // 4), s) + self.im_info['chromaticity'] = tuple(elt/100000.0 for elt in raw_vals) + return s + + def chunk_sRGB(self, pos, length): + # srgb rendering intent, 1 byte + # 0 perceptual + # 1 relative colorimetric + # 2 saturation + # 3 absolute colorimetric + + s = ImageFile._safe_read(self.fp, length) + self.im_info['srgb'] = i8(s) + return s + + def chunk_pHYs(self, pos, length): + + # pixels per unit + s = ImageFile._safe_read(self.fp, length) + px, py = i32(s), i32(s[4:]) + unit = i8(s[8]) + if unit == 1: # meter + dpi = int(px * 0.0254 + 0.5), int(py * 0.0254 + 0.5) + self.im_info["dpi"] = dpi + elif unit == 0: + self.im_info["aspect"] = px, py + return s + + def chunk_tEXt(self, pos, length): + + # text + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + # fallback for broken tEXt tags + k = s + v = b"" + if k: + if py3: + k = k.decode('latin-1', 'strict') + v = v.decode('latin-1', 'replace') + + self.im_info[k] = self.im_text[k] = v + self.check_text_memory(len(v)) + + return s + + def chunk_zTXt(self, pos, length): + + # compressed text + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + k = s + v = b"" + if v: + comp_method = i8(v[0]) + else: + comp_method = 0 + if comp_method != 0: + raise SyntaxError("Unknown compression method %s in zTXt chunk" % + comp_method) + try: + v = _safe_zlib_decompress(v[1:]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + v = b"" + else: + raise + except zlib.error: + v = b"" + + if k: + if py3: + k = k.decode('latin-1', 'strict') + v = v.decode('latin-1', 'replace') + + self.im_info[k] = self.im_text[k] = v + self.check_text_memory(len(v)) + + return s + + def chunk_iTXt(self, pos, length): + + # international text + r = s = ImageFile._safe_read(self.fp, length) + try: + k, r = r.split(b"\0", 1) + except ValueError: + return s + if len(r) < 2: + return s + cf, cm, r = i8(r[0]), i8(r[1]), r[2:] + try: + lang, tk, v = r.split(b"\0", 2) + except ValueError: + return s + if cf != 0: + if cm == 0: + try: + v = _safe_zlib_decompress(v) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + else: + raise + except zlib.error: + return s + else: + return s + if py3: + try: + k = k.decode("latin-1", "strict") + lang = lang.decode("utf-8", "strict") + tk = tk.decode("utf-8", "strict") + v = v.decode("utf-8", "strict") + except UnicodeError: + return s + + self.im_info[k] = self.im_text[k] = iTXt(v, lang, tk) + self.check_text_memory(len(v)) + + return s + + +# -------------------------------------------------------------------- +# PNG reader + +def _accept(prefix): + return prefix[:8] == _MAGIC + + +## +# Image plugin for PNG images. + +class PngImageFile(ImageFile.ImageFile): + + format = "PNG" + format_description = "Portable network graphics" + + def _open(self): + + if self.fp.read(8) != _MAGIC: + raise SyntaxError("not a PNG file") + + # + # Parse headers up to the first IDAT chunk + + self.png = PngStream(self.fp) + + while True: + + # + # get next chunk + + cid, pos, length = self.png.read() + + try: + s = self.png.call(cid, pos, length) + except EOFError: + break + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + s = ImageFile._safe_read(self.fp, length) + + self.png.crc(cid, s) + + # + # Copy relevant attributes from the PngStream. An alternative + # would be to let the PngStream class modify these attributes + # directly, but that introduces circular references which are + # difficult to break if things go wrong in the decoder... + # (believe me, I've tried ;-) + + self.mode = self.png.im_mode + self.size = self.png.im_size + self.info = self.png.im_info + self.text = self.png.im_text # experimental + self.tile = self.png.im_tile + + if self.png.im_palette: + rawmode, data = self.png.im_palette + self.palette = ImagePalette.raw(rawmode, data) + + self.__idat = length # used by load_read() + + def verify(self): + "Verify PNG file" + + if self.fp is None: + raise RuntimeError("verify must be called directly after open") + + # back up to beginning of IDAT block + self.fp.seek(self.tile[0][2] - 8) + + self.png.verify() + self.png.close() + + self.fp = None + + def load_prepare(self): + "internal: prepare to read PNG file" + + if self.info.get("interlace"): + self.decoderconfig = self.decoderconfig + (1,) + + ImageFile.ImageFile.load_prepare(self) + + def load_read(self, read_bytes): + "internal: read more image data" + + while self.__idat == 0: + # end of chunk, skip forward to next one + + self.fp.read(4) # CRC + + cid, pos, length = self.png.read() + + if cid not in [b"IDAT", b"DDAT"]: + self.png.push(cid, pos, length) + return b"" + + self.__idat = length # empty chunks are allowed + + # read more data from this chunk + if read_bytes <= 0: + read_bytes = self.__idat + else: + read_bytes = min(read_bytes, self.__idat) + + self.__idat = self.__idat - read_bytes + + return self.fp.read(read_bytes) + + def load_end(self): + "internal: finished reading image data" + + self.png.close() + self.png = None + + +# -------------------------------------------------------------------- +# PNG writer + +_OUTMODES = { + # supported PIL modes, and corresponding rawmodes/bits/color combinations + "1": ("1", b'\x01\x00'), + "L;1": ("L;1", b'\x01\x00'), + "L;2": ("L;2", b'\x02\x00'), + "L;4": ("L;4", b'\x04\x00'), + "L": ("L", b'\x08\x00'), + "LA": ("LA", b'\x08\x04'), + "I": ("I;16B", b'\x10\x00'), + "P;1": ("P;1", b'\x01\x03'), + "P;2": ("P;2", b'\x02\x03'), + "P;4": ("P;4", b'\x04\x03'), + "P": ("P", b'\x08\x03'), + "RGB": ("RGB", b'\x08\x02'), + "RGBA": ("RGBA", b'\x08\x06'), +} + + +def putchunk(fp, cid, *data): + """Write a PNG chunk (including CRC field)""" + + data = b"".join(data) + + fp.write(o32(len(data)) + cid) + fp.write(data) + crc = _crc32(data, _crc32(cid)) + fp.write(o32(crc)) + + +class _idat(object): + # wrap output from the encoder in IDAT chunks + + def __init__(self, fp, chunk): + self.fp = fp + self.chunk = chunk + + def write(self, data): + self.chunk(self.fp, b"IDAT", data) + + +def _save(im, fp, filename, chunk=putchunk): + # save an image to disk (called by the save method) + + mode = im.mode + + if mode == "P": + + # + # attempt to minimize storage requirements for palette images + if "bits" in im.encoderinfo: + # number of bits specified by user + colors = 1 << im.encoderinfo["bits"] + else: + # check palette contents + if im.palette: + colors = max(min(len(im.palette.getdata()[1])//3, 256), 2) + else: + colors = 256 + + if colors <= 2: + bits = 1 + elif colors <= 4: + bits = 2 + elif colors <= 16: + bits = 4 + else: + bits = 8 + if bits != 8: + mode = "%s;%d" % (mode, bits) + + # encoder options + im.encoderconfig = (im.encoderinfo.get("optimize", False), + im.encoderinfo.get("compress_level", -1), + im.encoderinfo.get("compress_type", -1), + im.encoderinfo.get("dictionary", b"")) + + # get the corresponding PNG mode + try: + rawmode, mode = _OUTMODES[mode] + except KeyError: + raise IOError("cannot write mode %s as PNG" % mode) + + # + # write minimal PNG file + + fp.write(_MAGIC) + + chunk(fp, b"IHDR", + o32(im.size[0]), o32(im.size[1]), # 0: size + mode, # 8: depth/type + b'\0', # 10: compression + b'\0', # 11: filter category + b'\0') # 12: interlace flag + + chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"] + + icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + # ICC profile + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + name = b"ICC Profile" + data = name + b"\0\0" + zlib.compress(icc) + chunk(fp, b"iCCP", data) + + # You must either have sRGB or iCCP. + # Disallow sRGB chunks when an iCCP-chunk has been emitted. + chunks.remove(b"sRGB") + + info = im.encoderinfo.get("pnginfo") + if info: + chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] + for cid, data in info.chunks: + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + elif cid in chunks_multiple_allowed: + chunk(fp, cid, data) + + if im.mode == "P": + palette_byte_number = (2 ** bits) * 3 + palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] + while len(palette_bytes) < palette_byte_number: + palette_bytes += b'\0' + chunk(fp, b"PLTE", palette_bytes) + + transparency = im.encoderinfo.get('transparency', + im.info.get('transparency', None)) + + if transparency or transparency == 0: + if im.mode == "P": + # limit to actual palette size + alpha_bytes = 2**bits + if isinstance(transparency, bytes): + chunk(fp, b"tRNS", transparency[:alpha_bytes]) + else: + transparency = max(0, min(255, transparency)) + alpha = b'\xFF' * transparency + b'\0' + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + elif im.mode == "L": + transparency = max(0, min(65535, transparency)) + chunk(fp, b"tRNS", o16(transparency)) + elif im.mode == "RGB": + red, green, blue = transparency + chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) + else: + if "transparency" in im.encoderinfo: + # don't bother with transparency if it's an RGBA + # and it's in the info dict. It's probably just stale. + raise IOError("cannot use transparency for this mode") + else: + if im.mode == "P" and im.im.getpalettemode() == "RGBA": + alpha = im.im.getpalette("RGBA", "A") + alpha_bytes = 2**bits + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + + dpi = im.encoderinfo.get("dpi") + if dpi: + chunk(fp, b"pHYs", + o32(int(dpi[0] / 0.0254 + 0.5)), + o32(int(dpi[1] / 0.0254 + 0.5)), + b'\x01') + + info = im.encoderinfo.get("pnginfo") + if info: + chunks = [b"bKGD", b"hIST"] + for cid, data in info.chunks: + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + + ImageFile._save(im, _idat(fp, chunk), + [("zip", (0, 0)+im.size, 0, rawmode)]) + + chunk(fp, b"IEND", b"") + + if hasattr(fp, "flush"): + fp.flush() + + +# -------------------------------------------------------------------- +# PNG chunk converter + +def getchunks(im, **params): + """Return a list of PNG chunks representing this image.""" + + class collector(object): + data = [] + + def write(self, data): + pass + + def append(self, chunk): + self.data.append(chunk) + + def append(fp, cid, *data): + data = b"".join(data) + crc = o32(_crc32(data, _crc32(cid))) + fp.append((cid, data, crc)) + + fp = collector() + + try: + im.encoderinfo = params + _save(im, fp, None, append) + finally: + del im.encoderinfo + + return fp.data + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(PngImageFile.format, PngImageFile, _accept) +Image.register_save(PngImageFile.format, _save) + +Image.register_extension(PngImageFile.format, ".png") + +Image.register_mime(PngImageFile.format, "image/png") diff --git a/imagecrunch/PIL/PpmImagePlugin.py b/imagecrunch/PIL/PpmImagePlugin.py new file mode 100644 index 0000000..c599ba8 --- /dev/null +++ b/imagecrunch/PIL/PpmImagePlugin.py @@ -0,0 +1,157 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PPM support for PIL +# +# History: +# 96-03-24 fl Created +# 98-03-06 fl Write RGBA images (as RGB, that is) +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile + +__version__ = "0.2" + +# +# -------------------------------------------------------------------- + +b_whitespace = b'\x20\x09\x0a\x0b\x0c\x0d' + +MODES = { + # standard + b"P4": "1", + b"P5": "L", + b"P6": "RGB", + # extensions + b"P0CMYK": "CMYK", + # PIL extensions (for test purposes only) + b"PyP": "P", + b"PyRGBA": "RGBA", + b"PyCMYK": "CMYK" +} + + +def _accept(prefix): + return prefix[0:1] == b"P" and prefix[1] in b"0456y" + + +## +# Image plugin for PBM, PGM, and PPM images. + +class PpmImageFile(ImageFile.ImageFile): + + format = "PPM" + format_description = "Pbmplus image" + + def _token(self, s=b""): + while True: # read until next whitespace + c = self.fp.read(1) + if not c or c in b_whitespace: + break + if c > b'\x79': + raise ValueError("Expected ASCII value, found binary") + s = s + c + if (len(s) > 9): + raise ValueError("Expected int, got > 9 digits") + return s + + def _open(self): + + # check magic + s = self.fp.read(1) + if s != b"P": + raise SyntaxError("not a PPM file") + mode = MODES[self._token(s)] + + if mode == "1": + self.mode = "1" + rawmode = "1;I" + else: + self.mode = rawmode = mode + + for ix in range(3): + while True: + while True: + s = self.fp.read(1) + if s not in b_whitespace: + break + if s == b"": + raise ValueError("File does not extend beyond magic number") + if s != b"#": + break + s = self.fp.readline() + s = int(self._token(s)) + if ix == 0: + xsize = s + elif ix == 1: + ysize = s + if mode == "1": + break + elif ix == 2: + # maxgrey + if s > 255: + if not mode == 'L': + raise ValueError("Too many colors for band: %s" % s) + if s < 2**16: + self.mode = 'I' + rawmode = 'I;16B' + else: + self.mode = 'I' + rawmode = 'I;32B' + + self.size = xsize, ysize + self.tile = [("raw", + (0, 0, xsize, ysize), + self.fp.tell(), + (rawmode, 0, 1))] + + +# +# -------------------------------------------------------------------- + +def _save(im, fp, filename): + if im.mode == "1": + rawmode, head = "1;I", b"P4" + elif im.mode == "L": + rawmode, head = "L", b"P5" + elif im.mode == "I": + if im.getextrema()[1] < 2**16: + rawmode, head = "I;16B", b"P5" + else: + rawmode, head = "I;32B", b"P5" + elif im.mode == "RGB": + rawmode, head = "RGB", b"P6" + elif im.mode == "RGBA": + rawmode, head = "RGB", b"P6" + else: + raise IOError("cannot write mode %s as PPM" % im.mode) + fp.write(head + ("\n%d %d\n" % im.size).encode('ascii')) + if head == b"P6": + fp.write(b"255\n") + if head == b"P5": + if rawmode == "L": + fp.write(b"255\n") + elif rawmode == "I;16B": + fp.write(b"65535\n") + elif rawmode == "I;32B": + fp.write(b"2147483648\n") + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 0, (rawmode, 0, 1))]) + + # ALTERNATIVE: save via builtin debug function + # im._dump(filename) + +# +# -------------------------------------------------------------------- + + +Image.register_open(PpmImageFile.format, PpmImageFile, _accept) +Image.register_save(PpmImageFile.format, _save) + +Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm"]) diff --git a/imagecrunch/PIL/PsdImagePlugin.py b/imagecrunch/PIL/PsdImagePlugin.py new file mode 100644 index 0000000..f6e04f7 --- /dev/null +++ b/imagecrunch/PIL/PsdImagePlugin.py @@ -0,0 +1,307 @@ +# +# The Python Imaging Library +# $Id$ +# +# Adobe PSD 2.5/3.0 file handling +# +# History: +# 1995-09-01 fl Created +# 1997-01-03 fl Read most PSD images +# 1997-01-18 fl Fixed P and CMYK support +# 2001-10-21 fl Added seek/tell support (for layers) +# +# Copyright (c) 1997-2001 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +__version__ = "0.4" + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16be as i16, i32be as i32 + +MODES = { + # (photoshop mode, bits) -> (pil mode, required channels) + (0, 1): ("1", 1), + (0, 8): ("L", 1), + (1, 8): ("L", 1), + (2, 8): ("P", 1), + (3, 8): ("RGB", 3), + (4, 8): ("CMYK", 4), + (7, 8): ("L", 1), # FIXME: multilayer + (8, 8): ("L", 1), # duotone + (9, 8): ("LAB", 3) +} + + +# --------------------------------------------------------------------. +# read PSD images + +def _accept(prefix): + return prefix[:4] == b"8BPS" + + +## +# Image plugin for Photoshop images. + +class PsdImageFile(ImageFile.ImageFile): + + format = "PSD" + format_description = "Adobe Photoshop" + + def _open(self): + + read = self.fp.read + + # + # header + + s = read(26) + if s[:4] != b"8BPS" or i16(s[4:]) != 1: + raise SyntaxError("not a PSD file") + + psd_bits = i16(s[22:]) + psd_channels = i16(s[12:]) + psd_mode = i16(s[24:]) + + mode, channels = MODES[(psd_mode, psd_bits)] + + if channels > psd_channels: + raise IOError("not enough channels") + + self.mode = mode + self.size = i32(s[18:]), i32(s[14:]) + + # + # color mode data + + size = i32(read(4)) + if size: + data = read(size) + if mode == "P" and size == 768: + self.palette = ImagePalette.raw("RGB;L", data) + + # + # image resources + + self.resources = [] + + size = i32(read(4)) + if size: + # load resources + end = self.fp.tell() + size + while self.fp.tell() < end: + signature = read(4) + id = i16(read(2)) + name = read(i8(read(1))) + if not (len(name) & 1): + read(1) # padding + data = read(i32(read(4))) + if (len(data) & 1): + read(1) # padding + self.resources.append((id, name, data)) + if id == 1039: # ICC profile + self.info["icc_profile"] = data + + # + # layer and mask information + + self.layers = [] + + size = i32(read(4)) + if size: + end = self.fp.tell() + size + size = i32(read(4)) + if size: + self.layers = _layerinfo(self.fp) + self.fp.seek(end) + + # + # image descriptor + + self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) + + # keep the file open + self._fp = self.fp + self.frame = 1 + self._min_frame = 1 + + @property + def n_frames(self): + return len(self.layers) + + @property + def is_animated(self): + return len(self.layers) > 1 + + def seek(self, layer): + if not self._seek_check(layer): + return + + # seek to given layer (1..max) + try: + name, mode, bbox, tile = self.layers[layer-1] + self.mode = mode + self.tile = tile + self.frame = layer + self.fp = self._fp + return name, bbox + except IndexError: + raise EOFError("no such layer") + + def tell(self): + # return layer number (0=image, 1..max=layers) + return self.frame + + def load_prepare(self): + # create image memory if necessary + if not self.im or\ + self.im.mode != self.mode or self.im.size != self.size: + self.im = Image.core.fill(self.mode, self.size, 0) + # create palette (optional) + if self.mode == "P": + Image.Image.load(self) + + +def _layerinfo(file): + # read layerinfo block + layers = [] + read = file.read + for i in range(abs(i16(read(2)))): + + # bounding box + y0 = i32(read(4)) + x0 = i32(read(4)) + y1 = i32(read(4)) + x1 = i32(read(4)) + + # image info + info = [] + mode = [] + types = list(range(i16(read(2)))) + if len(types) > 4: + continue + + for i in types: + type = i16(read(2)) + + if type == 65535: + m = "A" + else: + m = "RGBA"[type] + + mode.append(m) + size = i32(read(4)) + info.append((m, size)) + + # figure out the image mode + mode.sort() + if mode == ["R"]: + mode = "L" + elif mode == ["B", "G", "R"]: + mode = "RGB" + elif mode == ["A", "B", "G", "R"]: + mode = "RGBA" + else: + mode = None # unknown + + # skip over blend flags and extra information + filler = read(12) + name = "" + size = i32(read(4)) + combined = 0 + if size: + length = i32(read(4)) + if length: + mask_y = i32(read(4)) + mask_x = i32(read(4)) + mask_h = i32(read(4)) - mask_y + mask_w = i32(read(4)) - mask_x + file.seek(length - 16, 1) + combined += length + 4 + + length = i32(read(4)) + if length: + file.seek(length, 1) + combined += length + 4 + + length = i8(read(1)) + if length: + # Don't know the proper encoding, + # Latin-1 should be a good guess + name = read(length).decode('latin-1', 'replace') + combined += length + 1 + + file.seek(size - combined, 1) + layers.append((name, mode, (x0, y0, x1, y1))) + + # get tiles + i = 0 + for name, mode, bbox in layers: + tile = [] + for m in mode: + t = _maketile(file, m, bbox, 1) + if t: + tile.extend(t) + layers[i] = name, mode, bbox, tile + i += 1 + + return layers + + +def _maketile(file, mode, bbox, channels): + + tile = None + read = file.read + + compression = i16(read(2)) + + xsize = bbox[2] - bbox[0] + ysize = bbox[3] - bbox[1] + + offset = file.tell() + + if compression == 0: + # + # raw compression + tile = [] + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tile.append(("raw", bbox, offset, layer)) + offset = offset + xsize*ysize + + elif compression == 1: + # + # packbits compression + i = 0 + tile = [] + bytecount = read(channels * ysize * 2) + offset = file.tell() + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tile.append( + ("packbits", bbox, offset, layer) + ) + for y in range(ysize): + offset = offset + i16(bytecount[i:i+2]) + i += 2 + + file.seek(offset) + + if offset & 1: + read(1) # padding + + return tile + +# -------------------------------------------------------------------- +# registry + + +Image.register_open(PsdImageFile.format, PsdImageFile, _accept) + +Image.register_extension(PsdImageFile.format, ".psd") diff --git a/imagecrunch/PIL/PyAccess.py b/imagecrunch/PIL/PyAccess.py new file mode 100644 index 0000000..cce2de2 --- /dev/null +++ b/imagecrunch/PIL/PyAccess.py @@ -0,0 +1,319 @@ +# +# The Python Imaging Library +# Pillow fork +# +# Python implementation of the PixelAccess Object +# +# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-2009 by Fredrik Lundh. +# Copyright (c) 2013 Eric Soroos +# +# See the README file for information on usage and redistribution +# + +# Notes: +# +# * Implements the pixel access object following Access. +# * Does not implement the line functions, as they don't appear to be used +# * Taking only the tuple form, which is used from python. +# * Fill.c uses the integer form, but it's still going to use the old +# Access.c implementation. +# + +import logging +import sys + +from cffi import FFI + + +logger = logging.getLogger(__name__) + + +defs = """ +struct Pixel_RGBA { + unsigned char r,g,b,a; +}; +struct Pixel_I16 { + unsigned char l,r; +}; +""" +ffi = FFI() +ffi.cdef(defs) + + +class PyAccess(object): + + def __init__(self, img, readonly=False): + vals = dict(img.im.unsafe_ptrs) + self.readonly = readonly + self.image8 = ffi.cast('unsigned char **', vals['image8']) + self.image32 = ffi.cast('int **', vals['image32']) + self.image = ffi.cast('unsigned char **', vals['image']) + self.xsize, self.ysize = img.im.size + + # Keep pointer to im object to prevent dereferencing. + self._im = img.im + + # Debugging is polluting test traces, only useful here + # when hacking on PyAccess + # logger.debug("%s", vals) + self._post_init() + + def _post_init(self): + pass + + def __setitem__(self, xy, color): + """ + Modifies the pixel at x,y. The color is given as a single + numerical value for single band images, and a tuple for + multi-band images + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :param color: The pixel value. + """ + if self.readonly: + raise ValueError('Attempt to putpixel a read only image') + (x, y) = self.check_xy(xy) + return self.set_pixel(x, y, color) + + def __getitem__(self, xy): + """ + Returns the pixel at x,y. The pixel is returned as a single + value for single band images or a tuple for multiple band + images + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :returns: a pixel value for single band images, a tuple of + pixel values for multiband images. + """ + + (x, y) = self.check_xy(xy) + return self.get_pixel(x, y) + + putpixel = __setitem__ + getpixel = __getitem__ + + def check_xy(self, xy): + (x, y) = xy + if not (0 <= x < self.xsize and 0 <= y < self.ysize): + raise ValueError('pixel location out of range') + return xy + + +class _PyAccess32_2(PyAccess): + """ PA, LA, stored in first and last bytes of a 32 bit word """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return (pixel.r, pixel.a) + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.a = min(color[1], 255) + + +class _PyAccess32_3(PyAccess): + """ RGB and friends, stored in the first three bytes of a 32 bit word """ + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return (pixel.r, pixel.g, pixel.b) + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.g = min(color[1], 255) + pixel.b = min(color[2], 255) + pixel.a = 255 + + +class _PyAccess32_4(PyAccess): + """ RGBA etc, all 4 bytes of a 32 bit word """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return (pixel.r, pixel.g, pixel.b, pixel.a) + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.g = min(color[1], 255) + pixel.b = min(color[2], 255) + pixel.a = min(color[3], 255) + + +class _PyAccess8(PyAccess): + """ 1, L, P, 8 bit images stored as uint8 """ + def _post_init(self, *args, **kwargs): + self.pixels = self.image8 + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # integer + self.pixels[y][x] = min(color, 255) + except TypeError: + # tuple + self.pixels[y][x] = min(color[0], 255) + + +class _PyAccessI16_N(PyAccess): + """ I;16 access, native bitendian without conversion """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast('unsigned short **', self.image) + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # integer + self.pixels[y][x] = min(color, 65535) + except TypeError: + # tuple + self.pixels[y][x] = min(color[0], 65535) + + +class _PyAccessI16_L(PyAccess): + """ I;16L access, with conversion """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast('struct Pixel_I16 **', self.image) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return pixel.l + pixel.r * 256 + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + try: + color = min(color, 65535) + except TypeError: + color = min(color[0], 65535) + + pixel.l = color & 0xFF + pixel.r = color >> 8 + + +class _PyAccessI16_B(PyAccess): + """ I;16B access, with conversion """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast('struct Pixel_I16 **', self.image) + + def get_pixel(self, x, y): + pixel = self.pixels[y][x] + return pixel.l * 256 + pixel.r + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + try: + color = min(color, 65535) + except: + color = min(color[0], 65535) + + pixel.l = color >> 8 + pixel.r = color & 0xFF + + +class _PyAccessI32_N(PyAccess): + """ Signed Int32 access, native endian """ + def _post_init(self, *args, **kwargs): + self.pixels = self.image32 + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + self.pixels[y][x] = color + + +class _PyAccessI32_Swap(PyAccess): + """ I;32L/B access, with byteswapping conversion """ + def _post_init(self, *args, **kwargs): + self.pixels = self.image32 + + def reverse(self, i): + orig = ffi.new('int *', i) + chars = ffi.cast('unsigned char *', orig) + chars[0], chars[1], chars[2], chars[3] = chars[3], chars[2], \ + chars[1], chars[0] + return ffi.cast('int *', chars)[0] + + def get_pixel(self, x, y): + return self.reverse(self.pixels[y][x]) + + def set_pixel(self, x, y, color): + self.pixels[y][x] = self.reverse(color) + + +class _PyAccessF(PyAccess): + """ 32 bit float access """ + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast('float **', self.image32) + + def get_pixel(self, x, y): + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # not a tuple + self.pixels[y][x] = color + except TypeError: + # tuple + self.pixels[y][x] = color[0] + + +mode_map = {'1': _PyAccess8, + 'L': _PyAccess8, + 'P': _PyAccess8, + 'LA': _PyAccess32_2, + 'La': _PyAccess32_2, + 'PA': _PyAccess32_2, + 'RGB': _PyAccess32_3, + 'LAB': _PyAccess32_3, + 'HSV': _PyAccess32_3, + 'YCbCr': _PyAccess32_3, + 'RGBA': _PyAccess32_4, + 'RGBa': _PyAccess32_4, + 'RGBX': _PyAccess32_4, + 'CMYK': _PyAccess32_4, + 'F': _PyAccessF, + 'I': _PyAccessI32_N, + } + +if sys.byteorder == 'little': + mode_map['I;16'] = _PyAccessI16_N + mode_map['I;16L'] = _PyAccessI16_N + mode_map['I;16B'] = _PyAccessI16_B + + mode_map['I;32L'] = _PyAccessI32_N + mode_map['I;32B'] = _PyAccessI32_Swap +else: + mode_map['I;16'] = _PyAccessI16_L + mode_map['I;16L'] = _PyAccessI16_L + mode_map['I;16B'] = _PyAccessI16_N + + mode_map['I;32L'] = _PyAccessI32_Swap + mode_map['I;32B'] = _PyAccessI32_N + + +def new(img, readonly=False): + access_type = mode_map.get(img.mode, None) + if not access_type: + logger.debug("PyAccess Not Implemented: %s", img.mode) + return None + return access_type(img, readonly) diff --git a/imagecrunch/PIL/SgiImagePlugin.py b/imagecrunch/PIL/SgiImagePlugin.py new file mode 100644 index 0000000..ef0f40e --- /dev/null +++ b/imagecrunch/PIL/SgiImagePlugin.py @@ -0,0 +1,227 @@ +# +# The Python Imaging Library. +# $Id$ +# +# SGI image file handling +# +# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. +# +# +# +# History: +# 2017-22-07 mb Add RLE decompression +# 2016-16-10 mb Add save method without compression +# 1995-09-10 fl Created +# +# Copyright (c) 2016 by Mickael Bonfill. +# Copyright (c) 2008 by Karsten Hiddemann. +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1995 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile +from ._binary import i8, o8, i16be as i16 +from ._util import py3 +import struct +import os + + +__version__ = "0.3" + + +def _accept(prefix): + return len(prefix) >= 2 and i16(prefix) == 474 + + +MODES = { + (1, 1, 1): "L", + (1, 2, 1): "L", + (2, 1, 1): "L;16B", + (2, 2, 1): "L;16B", + (1, 3, 3): "RGB", + (2, 3, 3): "RGB;16B", + (1, 3, 4): "RGBA", + (2, 3, 4): "RGBA;16B" +} + + +## +# Image plugin for SGI images. +class SgiImageFile(ImageFile.ImageFile): + + format = "SGI" + format_description = "SGI Image File Format" + + def _open(self): + + # HEAD + headlen = 512 + s = self.fp.read(headlen) + + # magic number : 474 + if i16(s) != 474: + raise ValueError("Not an SGI image file") + + # compression : verbatim or RLE + compression = i8(s[2]) + + # bpc : 1 or 2 bytes (8bits or 16bits) + bpc = i8(s[3]) + + # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) + dimension = i16(s[4:]) + + # xsize : width + xsize = i16(s[6:]) + + # ysize : height + ysize = i16(s[8:]) + + # zsize : channels count + zsize = i16(s[10:]) + + # layout + layout = bpc, dimension, zsize + + # determine mode from bits/zsize + rawmode = "" + try: + rawmode = MODES[layout] + except KeyError: + pass + + if rawmode == "": + raise ValueError("Unsupported SGI image mode") + + self.size = xsize, ysize + self.mode = rawmode.split(";")[0] + + # orientation -1 : scanlines begins at the bottom-left corner + orientation = -1 + + # decoder info + if compression == 0: + pagesize = xsize * ysize * bpc + if bpc == 2: + self.tile = [("SGI16", (0, 0) + self.size, + headlen, (self.mode, 0, orientation))] + else: + self.tile = [] + offset = headlen + for layer in self.mode: + self.tile.append( + ("raw", (0, 0) + self.size, + offset, (layer, 0, orientation))) + offset += pagesize + elif compression == 1: + self.tile = [("sgi_rle", (0, 0) + self.size, + headlen, (rawmode, orientation, bpc))] + + +def _save(im, fp, filename): + if im.mode != "RGB" and im.mode != "RGBA" and im.mode != "L": + raise ValueError("Unsupported SGI image mode") + + # Get the keyword arguments + info = im.encoderinfo + + # Byte-per-pixel precision, 1 = 8bits per pixel + bpc = info.get("bpc", 1) + + if bpc not in (1, 2): + raise ValueError("Unsupported number of bytes per pixel") + + # Flip the image, since the origin of SGI file is the bottom-left corner + orientation = -1 + # Define the file as SGI File Format + magicNumber = 474 + # Run-Length Encoding Compression - Unsupported at this time + rle = 0 + + # Number of dimensions (x,y,z) + dim = 3 + # X Dimension = width / Y Dimension = height + x, y = im.size + if im.mode == "L" and y == 1: + dim = 1 + elif im.mode == "L": + dim = 2 + # Z Dimension: Number of channels + z = len(im.mode) + + if dim == 1 or dim == 2: + z = 1 + + # assert we've got the right number of bands. + if len(im.getbands()) != z: + raise ValueError("incorrect number of bands in SGI write: %s vs %s" % + (z, len(im.getbands()))) + + # Minimum Byte value + pinmin = 0 + # Maximum Byte value (255 = 8bits per pixel) + pinmax = 255 + # Image name (79 characters max, truncated below in write) + imgName = os.path.splitext(os.path.basename(filename))[0] + if py3: + imgName = imgName.encode('ascii', 'ignore') + # Standard representation of pixel in the file + colormap = 0 + fp.write(struct.pack('>h', magicNumber)) + fp.write(o8(rle)) + fp.write(o8(bpc)) + fp.write(struct.pack('>H', dim)) + fp.write(struct.pack('>H', x)) + fp.write(struct.pack('>H', y)) + fp.write(struct.pack('>H', z)) + fp.write(struct.pack('>l', pinmin)) + fp.write(struct.pack('>l', pinmax)) + fp.write(struct.pack('4s', b'')) # dummy + fp.write(struct.pack('79s', imgName)) # truncates to 79 chars + fp.write(struct.pack('s', b'')) # force null byte after imgname + fp.write(struct.pack('>l', colormap)) + fp.write(struct.pack('404s', b'')) # dummy + + rawmode = 'L' + if bpc == 2: + rawmode = 'L;16B' + + for channel in im.split(): + fp.write(channel.tobytes('raw', rawmode, 0, orientation)) + + fp.close() + + +class SGI16Decoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer): + rawmode, stride, orientation = self.args + pagesize = self.state.xsize * self.state.ysize + zsize = len(self.mode) + self.fd.seek(512) + + for band in range(zsize): + channel = Image.new('L', (self.state.xsize, self.state.ysize)) + channel.frombytes(self.fd.read(2 * pagesize), 'raw', + 'L;16B', stride, orientation) + self.im.putband(channel.im, band) + + return -1, 0 + +# +# registry + + +Image.register_decoder("SGI16", SGI16Decoder) +Image.register_open(SgiImageFile.format, SgiImageFile, _accept) +Image.register_save(SgiImageFile.format, _save) +Image.register_mime(SgiImageFile.format, "image/sgi") +Image.register_mime(SgiImageFile.format, "image/rgb") + +Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) + +# End of file diff --git a/imagecrunch/PIL/SpiderImagePlugin.py b/imagecrunch/PIL/SpiderImagePlugin.py new file mode 100644 index 0000000..d502779 --- /dev/null +++ b/imagecrunch/PIL/SpiderImagePlugin.py @@ -0,0 +1,314 @@ +# +# The Python Imaging Library. +# +# SPIDER image file handling +# +# History: +# 2004-08-02 Created BB +# 2006-03-02 added save method +# 2006-03-13 added support for stack images +# +# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. +# Copyright (c) 2004 by William Baxter. +# Copyright (c) 2004 by Secret Labs AB. +# Copyright (c) 2004 by Fredrik Lundh. +# + +## +# Image plugin for the Spider image format. This format is is used +# by the SPIDER software, in processing image data from electron +# microscopy and tomography. +## + +# +# SpiderImagePlugin.py +# +# The Spider image format is used by SPIDER software, in processing +# image data from electron microscopy and tomography. +# +# Spider home page: +# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html +# +# Details about the Spider image format: +# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html +# + +from __future__ import print_function + +from PIL import Image, ImageFile +import os +import struct +import sys + + +def isInt(f): + try: + i = int(f) + if f-i == 0: + return 1 + else: + return 0 + except (ValueError, OverflowError): + return 0 + + +iforms = [1, 3, -11, -12, -21, -22] + + +# There is no magic number to identify Spider files, so just check a +# series of header locations to see if they have reasonable values. +# Returns no. of bytes in the header, if it is a valid Spider header, +# otherwise returns 0 + +def isSpiderHeader(t): + h = (99,) + t # add 1 value so can use spider header index start=1 + # header values 1,2,5,12,13,22,23 should be integers + for i in [1, 2, 5, 12, 13, 22, 23]: + if not isInt(h[i]): + return 0 + # check iform + iform = int(h[5]) + if iform not in iforms: + return 0 + # check other header values + labrec = int(h[13]) # no. records in file header + labbyt = int(h[22]) # total no. of bytes in header + lenbyt = int(h[23]) # record length in bytes + # print("labrec = %d, labbyt = %d, lenbyt = %d" % (labrec,labbyt,lenbyt)) + if labbyt != (labrec * lenbyt): + return 0 + # looks like a valid header + return labbyt + + +def isSpiderImage(filename): + with open(filename, 'rb') as fp: + f = fp.read(92) # read 23 * 4 bytes + t = struct.unpack('>23f', f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + t = struct.unpack('<23f', f) # little-endian + hdrlen = isSpiderHeader(t) + return hdrlen + + +class SpiderImageFile(ImageFile.ImageFile): + + format = "SPIDER" + format_description = "Spider 2D image" + _close_exclusive_fp_after_loading = False + + def _open(self): + # check header + n = 27 * 4 # read 27 float values + f = self.fp.read(n) + + try: + self.bigendian = 1 + t = struct.unpack('>27f', f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + self.bigendian = 0 + t = struct.unpack('<27f', f) # little-endian + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + raise SyntaxError("not a valid Spider file") + except struct.error: + raise SyntaxError("not a valid Spider file") + + h = (99,) + t # add 1 value : spider header index starts at 1 + iform = int(h[5]) + if iform != 1: + raise SyntaxError("not a Spider 2D image") + + self.size = int(h[12]), int(h[2]) # size in pixels (width, height) + self.istack = int(h[24]) + self.imgnumber = int(h[27]) + + if self.istack == 0 and self.imgnumber == 0: + # stk=0, img=0: a regular 2D image + offset = hdrlen + self._nimages = 1 + elif self.istack > 0 and self.imgnumber == 0: + # stk>0, img=0: Opening the stack for the first time + self.imgbytes = int(h[12]) * int(h[2]) * 4 + self.hdrlen = hdrlen + self._nimages = int(h[26]) + # Point to the first image in the stack + offset = hdrlen * 2 + self.imgnumber = 1 + elif self.istack == 0 and self.imgnumber > 0: + # stk=0, img>0: an image within the stack + offset = hdrlen + self.stkoffset + self.istack = 2 # So Image knows it's still a stack + else: + raise SyntaxError("inconsistent stack header values") + + if self.bigendian: + self.rawmode = "F;32BF" + else: + self.rawmode = "F;32F" + self.mode = "F" + + self.tile = [ + ("raw", (0, 0) + self.size, offset, + (self.rawmode, 0, 1))] + self.__fp = self.fp # FIXME: hack + + @property + def n_frames(self): + return self._nimages + + @property + def is_animated(self): + return self._nimages > 1 + + # 1st image index is zero (although SPIDER imgnumber starts at 1) + def tell(self): + if self.imgnumber < 1: + return 0 + else: + return self.imgnumber - 1 + + def seek(self, frame): + if self.istack == 0: + raise EOFError("attempt to seek in a non-stack file") + if not self._seek_check(frame): + return + self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) + self.fp = self.__fp + self.fp.seek(self.stkoffset) + self._open() + + # returns a byte image after rescaling to 0..255 + def convert2byte(self, depth=255): + (minimum, maximum) = self.getextrema() + m = 1 + if maximum != minimum: + m = depth / (maximum-minimum) + b = -m * minimum + return self.point(lambda i, m=m, b=b: i * m + b).convert("L") + + # returns a ImageTk.PhotoImage object, after rescaling to 0..255 + def tkPhotoImage(self): + from PIL import ImageTk + return ImageTk.PhotoImage(self.convert2byte(), palette=256) + + +# -------------------------------------------------------------------- +# Image series + +# given a list of filenames, return a list of images +def loadImageSeries(filelist=None): + """create a list of Image.images for use in montage""" + if filelist is None or len(filelist) < 1: + return + + imglist = [] + for img in filelist: + if not os.path.exists(img): + print("unable to find %s" % img) + continue + try: + im = Image.open(img).convert2byte() + except: + if not isSpiderImage(img): + print(img + " is not a Spider image file") + continue + im.info['filename'] = img + imglist.append(im) + return imglist + + +# -------------------------------------------------------------------- +# For saving images in Spider format + +def makeSpiderHeader(im): + nsam, nrow = im.size + lenbyt = nsam * 4 # There are labrec records in the header + labrec = 1024 / lenbyt + if 1024 % lenbyt != 0: + labrec += 1 + labbyt = labrec * lenbyt + hdr = [] + nvalues = int(labbyt / 4) + for i in range(nvalues): + hdr.append(0.0) + + if len(hdr) < 23: + return [] + + # NB these are Fortran indices + hdr[1] = 1.0 # nslice (=1 for an image) + hdr[2] = float(nrow) # number of rows per slice + hdr[5] = 1.0 # iform for 2D image + hdr[12] = float(nsam) # number of pixels per line + hdr[13] = float(labrec) # number of records in file header + hdr[22] = float(labbyt) # total number of bytes in header + hdr[23] = float(lenbyt) # record length in bytes + + # adjust for Fortran indexing + hdr = hdr[1:] + hdr.append(0.0) + # pack binary data into a string + hdrstr = [] + for v in hdr: + hdrstr.append(struct.pack('f', v)) + return hdrstr + + +def _save(im, fp, filename): + if im.mode[0] != "F": + im = im.convert('F') + + hdr = makeSpiderHeader(im) + if len(hdr) < 256: + raise IOError("Error creating Spider header") + + # write the SPIDER header + fp.writelines(hdr) + + rawmode = "F;32NF" # 32-bit native floating point + ImageFile._save(im, fp, [("raw", (0, 0)+im.size, 0, (rawmode, 0, 1))]) + + +def _save_spider(im, fp, filename): + # get the filename extension and register it with Image + ext = os.path.splitext(filename)[1] + Image.register_extension(SpiderImageFile.format, ext) + _save(im, fp, filename) + +# -------------------------------------------------------------------- + + +Image.register_open(SpiderImageFile.format, SpiderImageFile) +Image.register_save(SpiderImageFile.format, _save_spider) + +if __name__ == "__main__": + + if len(sys.argv) < 2: + print("Syntax: python SpiderImagePlugin.py [infile] [outfile]") + sys.exit() + + filename = sys.argv[1] + if not isSpiderImage(filename): + print("input image must be in Spider format") + sys.exit() + + im = Image.open(filename) + print("image: " + str(im)) + print("format: " + str(im.format)) + print("size: " + str(im.size)) + print("mode: " + str(im.mode)) + print("max, min: ", end=' ') + print(im.getextrema()) + + if len(sys.argv) > 2: + outfile = sys.argv[2] + + # perform some image operation + im = im.transpose(Image.FLIP_LEFT_RIGHT) + print( + "saving a flipped version of %s as %s " % + (os.path.basename(filename), outfile)) + im.save(outfile, SpiderImageFile.format) diff --git a/imagecrunch/PIL/SunImagePlugin.py b/imagecrunch/PIL/SunImagePlugin.py new file mode 100644 index 0000000..fd5e827 --- /dev/null +++ b/imagecrunch/PIL/SunImagePlugin.py @@ -0,0 +1,136 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Sun image file handling +# +# History: +# 1995-09-10 fl Created +# 1996-05-28 fl Fixed 32-bit alignment +# 1998-12-29 fl Import ImagePalette module +# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995-1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile, ImagePalette +from ._binary import i32be as i32 + +__version__ = "0.3" + + +def _accept(prefix): + return len(prefix) >= 4 and i32(prefix) == 0x59a66a95 + + +## +# Image plugin for Sun raster files. + +class SunImageFile(ImageFile.ImageFile): + + format = "SUN" + format_description = "Sun Raster File" + + def _open(self): + + # The Sun Raster file header is 32 bytes in length + # and has the following format: + + # typedef struct _SunRaster + # { + # DWORD MagicNumber; /* Magic (identification) number */ + # DWORD Width; /* Width of image in pixels */ + # DWORD Height; /* Height of image in pixels */ + # DWORD Depth; /* Number of bits per pixel */ + # DWORD Length; /* Size of image data in bytes */ + # DWORD Type; /* Type of raster file */ + # DWORD ColorMapType; /* Type of color map */ + # DWORD ColorMapLength; /* Size of the color map in bytes */ + # } SUNRASTER; + + # HEAD + s = self.fp.read(32) + if i32(s) != 0x59a66a95: + raise SyntaxError("not an SUN raster file") + + offset = 32 + + self.size = i32(s[4:8]), i32(s[8:12]) + + depth = i32(s[12:16]) + data_length = i32(s[16:20]) # unreliable, ignore. + file_type = i32(s[20:24]) + palette_type = i32(s[24:28]) # 0: None, 1: RGB, 2: Raw/arbitrary + palette_length = i32(s[28:32]) + + if depth == 1: + self.mode, rawmode = "1", "1;I" + elif depth == 4: + self.mode, rawmode = "L", "L;4" + elif depth == 8: + self.mode = rawmode = "L" + elif depth == 24: + if file_type == 3: + self.mode, rawmode = "RGB", "RGB" + else: + self.mode, rawmode = "RGB", "BGR" + elif depth == 32: + if file_type == 3: + self.mode, rawmode = 'RGB', 'RGBX' + else: + self.mode, rawmode = 'RGB', 'BGRX' + else: + raise SyntaxError("Unsupported Mode/Bit Depth") + + if palette_length: + if palette_length > 1024: + raise SyntaxError("Unsupported Color Palette Length") + + if palette_type != 1: + raise SyntaxError("Unsupported Palette Type") + + offset = offset + palette_length + self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) + if self.mode == "L": + self.mode = "P" + rawmode = rawmode.replace('L', 'P') + + # 16 bit boundaries on stride + stride = ((self.size[0] * depth + 15) // 16) * 2 + + # file type: Type is the version (or flavor) of the bitmap + # file. The following values are typically found in the Type + # field: + # 0000h Old + # 0001h Standard + # 0002h Byte-encoded + # 0003h RGB format + # 0004h TIFF format + # 0005h IFF format + # FFFFh Experimental + + # Old and standard are the same, except for the length tag. + # byte-encoded is run-length-encoded + # RGB looks similar to standard, but RGB byte order + # TIFF and IFF mean that they were converted from T/IFF + # Experimental means that it's something else. + # (https://www.fileformat.info/format/sunraster/egff.htm) + + if file_type in (0, 1, 3, 4, 5): + self.tile = [("raw", (0, 0)+self.size, offset, (rawmode, stride))] + elif file_type == 2: + self.tile = [("sun_rle", (0, 0)+self.size, offset, rawmode)] + else: + raise SyntaxError('Unsupported Sun Raster file type') + +# +# registry + + +Image.register_open(SunImageFile.format, SunImageFile, _accept) + +Image.register_extension(SunImageFile.format, ".ras") diff --git a/imagecrunch/PIL/TarIO.py b/imagecrunch/PIL/TarIO.py new file mode 100644 index 0000000..0e949ff --- /dev/null +++ b/imagecrunch/PIL/TarIO.py @@ -0,0 +1,56 @@ +# +# The Python Imaging Library. +# $Id$ +# +# read files from within a tar file +# +# History: +# 95-06-18 fl Created +# 96-05-28 fl Open files in binary mode +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-96. +# +# See the README file for information on usage and redistribution. +# + +from . import ContainerIO + + +## +# A file object that provides read access to a given member of a TAR +# file. + +class TarIO(ContainerIO.ContainerIO): + + def __init__(self, tarfile, file): + """ + Create file object. + + :param tarfile: Name of TAR file. + :param file: Name of member file. + """ + fh = open(tarfile, "rb") + + while True: + + s = fh.read(512) + if len(s) != 512: + raise IOError("unexpected end of tar file") + + name = s[:100].decode('utf-8') + i = name.find('\0') + if i == 0: + raise IOError("cannot find subfile") + if i > 0: + name = name[:i] + + size = int(s[124:135], 8) + + if file == name: + break + + fh.seek((size + 511) & (~511), 1) + + # Open region + ContainerIO.ContainerIO.__init__(self, fh, fh.tell(), size) diff --git a/imagecrunch/PIL/TgaImagePlugin.py b/imagecrunch/PIL/TgaImagePlugin.py new file mode 100644 index 0000000..57b6ae2 --- /dev/null +++ b/imagecrunch/PIL/TgaImagePlugin.py @@ -0,0 +1,209 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TGA file handling +# +# History: +# 95-09-01 fl created (reads 24-bit files only) +# 97-01-04 fl support more TGA versions, including compressed images +# 98-07-04 fl fixed orientation and alpha layer bugs +# 98-09-11 fl fixed orientation for runlength decoder +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# + + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, i16le as i16, o8, o16le as o16 + +__version__ = "0.3" + + +# +# -------------------------------------------------------------------- +# Read RGA file + + +MODES = { + # map imagetype/depth to rawmode + (1, 8): "P", + (3, 1): "1", + (3, 8): "L", + (3, 16): "LA", + (2, 16): "BGR;5", + (2, 24): "BGR", + (2, 32): "BGRA", +} + + +## +# Image plugin for Targa files. + +class TgaImageFile(ImageFile.ImageFile): + + format = "TGA" + format_description = "Targa" + + def _open(self): + + # process header + s = self.fp.read(18) + + idlen = i8(s[0]) + + colormaptype = i8(s[1]) + imagetype = i8(s[2]) + + depth = i8(s[16]) + + flags = i8(s[17]) + + self.size = i16(s[12:]), i16(s[14:]) + + # validate header fields + if colormaptype not in (0, 1) or\ + self.size[0] <= 0 or self.size[1] <= 0 or\ + depth not in (1, 8, 16, 24, 32): + raise SyntaxError("not a TGA file") + + # image mode + if imagetype in (3, 11): + self.mode = "L" + if depth == 1: + self.mode = "1" # ??? + elif depth == 16: + self.mode = "LA" + elif imagetype in (1, 9): + self.mode = "P" + elif imagetype in (2, 10): + self.mode = "RGB" + if depth == 32: + self.mode = "RGBA" + else: + raise SyntaxError("unknown TGA mode") + + # orientation + orientation = flags & 0x30 + if orientation == 0x20: + orientation = 1 + elif not orientation: + orientation = -1 + else: + raise SyntaxError("unknown TGA orientation") + + self.info["orientation"] = orientation + + if imagetype & 8: + self.info["compression"] = "tga_rle" + + if idlen: + self.info["id_section"] = self.fp.read(idlen) + + if colormaptype: + # read palette + start, size, mapdepth = i16(s[3:]), i16(s[5:]), i16(s[7:]) + if mapdepth == 16: + self.palette = ImagePalette.raw( + "BGR;16", b"\0"*2*start + self.fp.read(2*size)) + elif mapdepth == 24: + self.palette = ImagePalette.raw( + "BGR", b"\0"*3*start + self.fp.read(3*size)) + elif mapdepth == 32: + self.palette = ImagePalette.raw( + "BGRA", b"\0"*4*start + self.fp.read(4*size)) + + # setup tile descriptor + try: + rawmode = MODES[(imagetype & 7, depth)] + if imagetype & 8: + # compressed + self.tile = [("tga_rle", (0, 0)+self.size, + self.fp.tell(), (rawmode, orientation, depth))] + else: + self.tile = [("raw", (0, 0)+self.size, + self.fp.tell(), (rawmode, 0, orientation))] + except KeyError: + pass # cannot decode + +# +# -------------------------------------------------------------------- +# Write TGA file + + +SAVE = { + "1": ("1", 1, 0, 3), + "L": ("L", 8, 0, 3), + "LA": ("LA", 16, 0, 3), + "P": ("P", 8, 1, 1), + "RGB": ("BGR", 24, 0, 2), + "RGBA": ("BGRA", 32, 0, 2), +} + + +def _save(im, fp, filename): + + try: + rawmode, bits, colormaptype, imagetype = SAVE[im.mode] + except KeyError: + raise IOError("cannot write mode %s as TGA" % im.mode) + + rle = im.encoderinfo.get("rle", False) + + if rle: + imagetype += 8 + + if colormaptype: + colormapfirst, colormaplength, colormapentry = 0, 256, 24 + else: + colormapfirst, colormaplength, colormapentry = 0, 0, 0 + + if im.mode in ("LA", "RGBA"): + flags = 8 + else: + flags = 0 + + orientation = im.info.get("orientation", -1) + if orientation > 0: + flags = flags | 0x20 + + fp.write(b"\000" + + o8(colormaptype) + + o8(imagetype) + + o16(colormapfirst) + + o16(colormaplength) + + o8(colormapentry) + + o16(0) + + o16(0) + + o16(im.size[0]) + + o16(im.size[1]) + + o8(bits) + + o8(flags)) + + if colormaptype: + fp.write(im.im.getpalette("RGB", "BGR")) + + if rle: + ImageFile._save( + im, + fp, + [("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))]) + else: + ImageFile._save( + im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))]) + + # write targa version 2 footer + fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(TgaImageFile.format, TgaImageFile) +Image.register_save(TgaImageFile.format, _save) + +Image.register_extension(TgaImageFile.format, ".tga") diff --git a/imagecrunch/PIL/TiffImagePlugin.py b/imagecrunch/PIL/TiffImagePlugin.py new file mode 100644 index 0000000..6f032f4 --- /dev/null +++ b/imagecrunch/PIL/TiffImagePlugin.py @@ -0,0 +1,1838 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF file handling +# +# TIFF is a flexible, if somewhat aged, image file format originally +# defined by Aldus. Although TIFF supports a wide variety of pixel +# layouts and compression methods, the name doesn't really stand for +# "thousands of incompatible file formats," it just feels that way. +# +# To read TIFF data from a stream, the stream must be seekable. For +# progressive decoding, make sure to use TIFF files where the tag +# directory is placed first in the file. +# +# History: +# 1995-09-01 fl Created +# 1996-05-04 fl Handle JPEGTABLES tag +# 1996-05-18 fl Fixed COLORMAP support +# 1997-01-05 fl Fixed PREDICTOR support +# 1997-08-27 fl Added support for rational tags (from Perry Stoll) +# 1998-01-10 fl Fixed seek/tell (from Jan Blom) +# 1998-07-15 fl Use private names for internal variables +# 1999-06-13 fl Rewritten for PIL 1.0 (1.0) +# 2000-10-11 fl Additional fixes for Python 2.0 (1.1) +# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) +# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) +# 2001-12-18 fl Added workaround for broken Matrox library +# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) +# 2003-05-19 fl Check FILLORDER tag +# 2003-09-26 fl Added RGBa support +# 2004-02-24 fl Added DPI support; fixed rational write support +# 2005-02-07 fl Added workaround for broken Corel Draw 10 files +# 2006-01-09 fl Added support for float/double tags (from Russell Nelson) +# +# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from __future__ import division, print_function + +from . import Image, ImageFile, ImagePalette, TiffTags +from ._binary import i8, o8 +from ._util import py3 + +import collections +from fractions import Fraction +from numbers import Number, Rational + +import io +import itertools +import os +import struct +import sys +import warnings + +from .TiffTags import TYPES + +try: + # Python 3 + from collections.abc import MutableMapping +except ImportError: + # Python 2.7 + from collections import MutableMapping + + +__version__ = "1.3.5" +DEBUG = False # Needs to be merged with the new logging approach. + +# Set these to true to force use of libtiff for reading or writing. +READ_LIBTIFF = False +WRITE_LIBTIFF = False +IFD_LEGACY_API = True + +II = b"II" # little-endian (Intel style) +MM = b"MM" # big-endian (Motorola style) + +# +# -------------------------------------------------------------------- +# Read TIFF files + +# a few tag names, just to make the code below a bit more readable +IMAGEWIDTH = 256 +IMAGELENGTH = 257 +BITSPERSAMPLE = 258 +COMPRESSION = 259 +PHOTOMETRIC_INTERPRETATION = 262 +FILLORDER = 266 +IMAGEDESCRIPTION = 270 +STRIPOFFSETS = 273 +SAMPLESPERPIXEL = 277 +ROWSPERSTRIP = 278 +STRIPBYTECOUNTS = 279 +X_RESOLUTION = 282 +Y_RESOLUTION = 283 +PLANAR_CONFIGURATION = 284 +RESOLUTION_UNIT = 296 +SOFTWARE = 305 +DATE_TIME = 306 +ARTIST = 315 +PREDICTOR = 317 +COLORMAP = 320 +TILEOFFSETS = 324 +EXTRASAMPLES = 338 +SAMPLEFORMAT = 339 +JPEGTABLES = 347 +COPYRIGHT = 33432 +IPTC_NAA_CHUNK = 33723 # newsphoto properties +PHOTOSHOP_CHUNK = 34377 # photoshop properties +ICCPROFILE = 34675 +EXIFIFD = 34665 +XMP = 700 + +# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java +IMAGEJ_META_DATA_BYTE_COUNTS = 50838 +IMAGEJ_META_DATA = 50839 + +COMPRESSION_INFO = { + # Compression => pil compression name + 1: "raw", + 2: "tiff_ccitt", + 3: "group3", + 4: "group4", + 5: "tiff_lzw", + 6: "tiff_jpeg", # obsolete + 7: "jpeg", + 8: "tiff_adobe_deflate", + 32771: "tiff_raw_16", # 16-bit padding + 32773: "packbits", + 32809: "tiff_thunderscan", + 32946: "tiff_deflate", + 34676: "tiff_sgilog", + 34677: "tiff_sgilog24", +} + +COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()} + +OPEN_INFO = { + # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, + # ExtraSamples) => mode, rawmode + (II, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (II, 1, (1,), 1, (1,), ()): ("1", "1"), + (MM, 1, (1,), 1, (1,), ()): ("1", "1"), + (II, 1, (1,), 2, (1,), ()): ("1", "1;R"), + (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"), + + (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (II, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + + (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (II, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + + (II, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (II, 1, (1,), 1, (8,), ()): ("L", "L"), + (MM, 1, (1,), 1, (8,), ()): ("L", "L"), + (II, 1, (1,), 2, (8,), ()): ("L", "L;R"), + (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"), + + (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"), + + (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), + (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), + (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"), + (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"), + + (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"), + (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"), + (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"), + (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"), + (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"), + + (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + + (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGBX", "RGBX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGBX", "RGBXX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGBX", "RGBXXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + + (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"), + (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGBX", "RGBX;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"), + + (II, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (II, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (II, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (II, 3, (1,), 1, (8,), ()): ("P", "P"), + (MM, 3, (1,), 1, (8,), ()): ("P", "P"), + (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (II, 3, (1,), 2, (8,), ()): ("P", "P;R"), + (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"), + + (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + + (II, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), + (MM, 6, (1,), 1, (8, 8, 8), ()): ("YCbCr", "YCbCr"), + (II, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("YCbCr", "YCbCrX"), + (MM, 6, (1,), 1, (8, 8, 8, 8), (0,)): ("YCbCr", "YCbCrX"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("YCbCr", "YCbCrXXX"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("YCbCr", "YCbCrXXX"), + (II, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("YCbCr", "YCbCrXXX"), + (MM, 6, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("YCbCr", "YCbCrXXX"), + + (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), + (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), +} + +PREFIXES = [ + b"MM\x00\x2A", # Valid TIFF header with big-endian byte order + b"II\x2A\x00", # Valid TIFF header with little-endian byte order + b"MM\x2A\x00", # Invalid TIFF header, assume big-endian + b"II\x00\x2A", # Invalid TIFF header, assume little-endian +] + + +def _accept(prefix): + return prefix[:4] in PREFIXES + + +def _limit_rational(val, max_val): + inv = abs(val) > 1 + n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) + return n_d[::-1] if inv else n_d + + +## +# Wrapper for TIFF IFDs. + +_load_dispatch = {} +_write_dispatch = {} + + +class IFDRational(Rational): + """ Implements a rational class where 0/0 is a legal value to match + the in the wild use of exif rationals. + + e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used + """ + + """ If the denominator is 0, store this as a float('nan'), otherwise store + as a fractions.Fraction(). Delegate as appropriate + + """ + + __slots__ = ('_numerator', '_denominator', '_val') + + def __init__(self, value, denominator=1): + """ + :param value: either an integer numerator, a + float/rational/other number, or an IFDRational + :param denominator: Optional integer denominator + """ + self._denominator = denominator + self._numerator = value + self._val = float(1) + + if isinstance(value, Fraction): + self._numerator = value.numerator + self._denominator = value.denominator + self._val = value + + if isinstance(value, IFDRational): + self._denominator = value.denominator + self._numerator = value.numerator + self._val = value._val + return + + if denominator == 0: + self._val = float('nan') + return + + elif denominator == 1: + self._val = Fraction(value) + else: + self._val = Fraction(value, denominator) + + @property + def numerator(a): + return a._numerator + + @property + def denominator(a): + return a._denominator + + def limit_rational(self, max_denominator): + """ + + :param max_denominator: Integer, the maximum denominator value + :returns: Tuple of (numerator, denominator) + """ + + if self.denominator == 0: + return (self.numerator, self.denominator) + + f = self._val.limit_denominator(max_denominator) + return (f.numerator, f.denominator) + + def __repr__(self): + return str(float(self._val)) + + def __hash__(self): + return self._val.__hash__() + + def __eq__(self, other): + return self._val == other + + def _delegate(op): + def delegate(self, *args): + return getattr(self._val, op)(*args) + return delegate + + """ a = ['add','radd', 'sub', 'rsub','div', 'rdiv', 'mul', 'rmul', + 'truediv', 'rtruediv', 'floordiv', + 'rfloordiv','mod','rmod', 'pow','rpow', 'pos', 'neg', + 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'nonzero', + 'ceil', 'floor', 'round'] + print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) + """ + + __add__ = _delegate('__add__') + __radd__ = _delegate('__radd__') + __sub__ = _delegate('__sub__') + __rsub__ = _delegate('__rsub__') + __div__ = _delegate('__div__') + __rdiv__ = _delegate('__rdiv__') + __mul__ = _delegate('__mul__') + __rmul__ = _delegate('__rmul__') + __truediv__ = _delegate('__truediv__') + __rtruediv__ = _delegate('__rtruediv__') + __floordiv__ = _delegate('__floordiv__') + __rfloordiv__ = _delegate('__rfloordiv__') + __mod__ = _delegate('__mod__') + __rmod__ = _delegate('__rmod__') + __pow__ = _delegate('__pow__') + __rpow__ = _delegate('__rpow__') + __pos__ = _delegate('__pos__') + __neg__ = _delegate('__neg__') + __abs__ = _delegate('__abs__') + __trunc__ = _delegate('__trunc__') + __lt__ = _delegate('__lt__') + __gt__ = _delegate('__gt__') + __le__ = _delegate('__le__') + __ge__ = _delegate('__ge__') + __nonzero__ = _delegate('__nonzero__') + __ceil__ = _delegate('__ceil__') + __floor__ = _delegate('__floor__') + __round__ = _delegate('__round__') + + +class ImageFileDirectory_v2(MutableMapping): + """This class represents a TIFF tag directory. To speed things up, we + don't decode tags unless they're asked for. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v2() + ifd[key] = 'Some Data' + ifd.tagtype[key] = 2 + print(ifd[key]) + 'Some Data' + + Individual values are returned as the strings or numbers, sequences are + returned as tuples of the values. + + The tiff metadata type of each item is stored in a dictionary of + tag types in + `~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types + are read from a tiff file, guessed from the type added, or added + manually. + + Data Structures: + + * self.tagtype = {} + + * Key: numerical tiff tag number + * Value: integer corresponding to the data type from `~PIL.TiffTags.TYPES` + + .. versionadded:: 3.0.0 + """ + """ + Documentation: + + 'internal' data structures: + * self._tags_v2 = {} Key: numerical tiff tag number + Value: decoded data, as tuple for multiple values + * self._tagdata = {} Key: numerical tiff tag number + Value: undecoded byte string from file + * self._tags_v1 = {} Key: numerical tiff tag number + Value: decoded data in the v1 format + + Tags will be found in the private attributes self._tagdata, and in + self._tags_v2 once decoded. + + Self.legacy_api is a value for internal use, and shouldn't be + changed from outside code. In cooperation with the + ImageFileDirectory_v1 class, if legacy_api is true, then decoded + tags will be populated into both _tags_v1 and _tags_v2. _Tags_v2 + will be used if this IFD is used in the TIFF save routine. Tags + should be read from tags_v1 if legacy_api == true. + + """ + + def __init__(self, ifh=b"II\052\0\0\0\0\0", prefix=None): + """Initialize an ImageFileDirectory. + + To construct an ImageFileDirectory from a real file, pass the 8-byte + magic header to the constructor. To only set the endianness, pass it + as the 'prefix' keyword argument. + + :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets + endianness. + :param prefix: Override the endianness of the file. + """ + if ifh[:4] not in PREFIXES: + raise SyntaxError("not a TIFF file (header %r not valid)" % ifh) + self._prefix = prefix if prefix is not None else ifh[:2] + if self._prefix == MM: + self._endian = ">" + elif self._prefix == II: + self._endian = "<" + else: + raise SyntaxError("not a TIFF IFD") + self.reset() + self.next, = self._unpack("L", ifh[4:]) + self._legacy_api = False + + prefix = property(lambda self: self._prefix) + offset = property(lambda self: self._offset) + legacy_api = property(lambda self: self._legacy_api) + + @legacy_api.setter + def legacy_api(self, value): + raise Exception("Not allowing setting of legacy api") + + def reset(self): + self._tags_v1 = {} # will remain empty if legacy_api is false + self._tags_v2 = {} # main tag storage + self._tagdata = {} + self.tagtype = {} # added 2008-06-05 by Florian Hoech + self._next = None + self._offset = None + + def __str__(self): + return str(dict(self)) + + def named(self): + """ + :returns: dict of name|key: value + + Returns the complete tag dictionary, with named tags where possible. + """ + return dict((TiffTags.lookup(code).name, value) + for code, value in self.items()) + + def __len__(self): + return len(set(self._tagdata) | set(self._tags_v2)) + + def __getitem__(self, tag): + if tag not in self._tags_v2: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + self[tag] = handler(self, data, self.legacy_api) # check type + val = self._tags_v2[tag] + if self.legacy_api and not isinstance(val, (tuple, bytes)): + val = val, + return val + + def __contains__(self, tag): + return tag in self._tags_v2 or tag in self._tagdata + + if not py3: + def has_key(self, tag): + return tag in self + + def __setitem__(self, tag, value): + self._setitem(tag, value, self.legacy_api) + + def _setitem(self, tag, value, legacy_api): + basetypes = (Number, bytes, str) + if not py3: + basetypes += unicode, + + info = TiffTags.lookup(tag) + values = [value] if isinstance(value, basetypes) else value + + if tag not in self.tagtype: + if info.type: + self.tagtype[tag] = info.type + else: + self.tagtype[tag] = 7 + if all(isinstance(v, IFDRational) for v in values): + self.tagtype[tag] = 5 + elif all(isinstance(v, int) for v in values): + if all(v < 2 ** 16 for v in values): + self.tagtype[tag] = 3 + else: + self.tagtype[tag] = 4 + elif all(isinstance(v, float) for v in values): + self.tagtype[tag] = 12 + else: + if py3: + if all(isinstance(v, str) for v in values): + self.tagtype[tag] = 2 + else: + # Never treat data as binary by default on Python 2. + self.tagtype[tag] = 2 + + if self.tagtype[tag] == 7 and py3: + values = [value.encode("ascii", 'replace') if isinstance( + value, str) else value] + + values = tuple(info.cvt_enum(value) for value in values) + + dest = self._tags_v1 if legacy_api else self._tags_v2 + + # Three branches: + # Spec'd length == 1, Actual length 1, store as element + # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. + # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. + # Don't mess with the legacy api, since it's frozen. + if ((info.length == 1) or + (info.length is None and len(values) == 1 and not legacy_api)): + # Don't mess with the legacy api, since it's frozen. + if legacy_api and self.tagtype[tag] in [5, 10]: # rationals + values = values, + try: + dest[tag], = values + except ValueError: + # We've got a builtin tag with 1 expected entry + warnings.warn( + "Metadata Warning, tag %s had too many entries: %s, expected 1" % ( + tag, len(values))) + dest[tag] = values[0] + + else: + # Spec'd length > 1 or undefined + # Unspec'd, and length > 1 + dest[tag] = values + + def __delitem__(self, tag): + self._tags_v2.pop(tag, None) + self._tags_v1.pop(tag, None) + self._tagdata.pop(tag, None) + + def __iter__(self): + return iter(set(self._tagdata) | set(self._tags_v2)) + + def _unpack(self, fmt, data): + return struct.unpack(self._endian + fmt, data) + + def _pack(self, fmt, *values): + return struct.pack(self._endian + fmt, *values) + + def _register_loader(idx, size): + def decorator(func): + from .TiffTags import TYPES + if func.__name__.startswith("load_"): + TYPES[idx] = func.__name__[5:].replace("_", " ") + _load_dispatch[idx] = size, func + return func + return decorator + + def _register_writer(idx): + def decorator(func): + _write_dispatch[idx] = func + return func + return decorator + + def _register_basic(idx_fmt_name): + from .TiffTags import TYPES + idx, fmt, name = idx_fmt_name + TYPES[idx] = name + size = struct.calcsize("=" + fmt) + _load_dispatch[idx] = size, lambda self, data, legacy_api=True: ( + self._unpack("{}{}".format(len(data) // size, fmt), data)) + _write_dispatch[idx] = lambda self, *values: ( + b"".join(self._pack(fmt, value) for value in values)) + + list(map(_register_basic, + [(3, "H", "short"), + (4, "L", "long"), + (6, "b", "signed byte"), + (8, "h", "signed short"), + (9, "l", "signed long"), + (11, "f", "float"), + (12, "d", "double")])) + + @_register_loader(1, 1) # Basic type, except for the legacy API. + def load_byte(self, data, legacy_api=True): + return data + + @_register_writer(1) # Basic type, except for the legacy API. + def write_byte(self, data): + return data + + @_register_loader(2, 1) + def load_string(self, data, legacy_api=True): + if data.endswith(b"\0"): + data = data[:-1] + return data.decode("latin-1", "replace") + + @_register_writer(2) + def write_string(self, value): + # remerge of https://github.com/python-pillow/Pillow/pull/1416 + if sys.version_info.major == 2: + value = value.decode('ascii', 'replace') + return b"" + value.encode('ascii', 'replace') + b"\0" + + @_register_loader(5, 8) + def load_rational(self, data, legacy_api=True): + vals = self._unpack("{}L".format(len(data) // 4), data) + + def combine(a, b): return (a, b) if legacy_api else IFDRational(a, b) + return tuple(combine(num, denom) + for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(5) + def write_rational(self, *values): + return b"".join(self._pack("2L", *_limit_rational(frac, 2 ** 31)) + for frac in values) + + @_register_loader(7, 1) + def load_undefined(self, data, legacy_api=True): + return data + + @_register_writer(7) + def write_undefined(self, value): + return value + + @_register_loader(10, 8) + def load_signed_rational(self, data, legacy_api=True): + vals = self._unpack("{}l".format(len(data) // 4), data) + + def combine(a, b): return (a, b) if legacy_api else IFDRational(a, b) + return tuple(combine(num, denom) + for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(10) + def write_signed_rational(self, *values): + return b"".join(self._pack("2L", *_limit_rational(frac, 2 ** 30)) + for frac in values) + + def _ensure_read(self, fp, size): + ret = fp.read(size) + if len(ret) != size: + raise IOError("Corrupt EXIF data. " + + "Expecting to read %d bytes but only got %d. " % + (size, len(ret))) + return ret + + def load(self, fp): + + self.reset() + self._offset = fp.tell() + + try: + for i in range(self._unpack("H", self._ensure_read(fp, 2))[0]): + tag, typ, count, data = self._unpack("HHL4s", + self._ensure_read(fp, 12)) + if DEBUG: + tagname = TiffTags.lookup(tag).name + typname = TYPES.get(typ, "unknown") + print("tag: %s (%d) - type: %s (%d)" % + (tagname, tag, typname, typ), end=" ") + + try: + unit_size, handler = self._load_dispatch[typ] + except KeyError: + if DEBUG: + print("- unsupported type", typ) + continue # ignore unsupported type + size = count * unit_size + if size > 4: + here = fp.tell() + offset, = self._unpack("L", data) + if DEBUG: + print("Tag Location: %s - Data Location: %s" % + (here, offset), end=" ") + fp.seek(offset) + data = ImageFile._safe_read(fp, size) + fp.seek(here) + else: + data = data[:size] + + if len(data) != size: + warnings.warn("Possibly corrupt EXIF data. " + "Expecting to read %d bytes but only got %d." + " Skipping tag %s" % (size, len(data), tag)) + continue + + if not data: + continue + + self._tagdata[tag] = data + self.tagtype[tag] = typ + + if DEBUG: + if size > 32: + print("- value: " % size) + else: + print("- value:", self[tag]) + + self.next, = self._unpack("L", self._ensure_read(fp, 4)) + except IOError as msg: + warnings.warn(str(msg)) + return + + def save(self, fp): + + if fp.tell() == 0: # skip TIFF header on subsequent pages + # tiff header -- PIL always starts the first IFD at offset 8 + fp.write(self._prefix + self._pack("HL", 42, 8)) + + # FIXME What about tagdata? + fp.write(self._pack("H", len(self._tags_v2))) + + entries = [] + offset = fp.tell() + len(self._tags_v2) * 12 + 4 + stripoffsets = None + + # pass 1: convert tags to binary format + # always write tags in ascending order + for tag, value in sorted(self._tags_v2.items()): + if tag == STRIPOFFSETS: + stripoffsets = len(entries) + typ = self.tagtype.get(tag) + if DEBUG: + print("Tag %s, Type: %s, Value: %s" % (tag, typ, value)) + values = value if isinstance(value, tuple) else (value,) + data = self._write_dispatch[typ](self, *values) + if DEBUG: + tagname = TiffTags.lookup(tag).name + typname = TYPES.get(typ, "unknown") + print("save: %s (%d) - type: %s (%d)" % + (tagname, tag, typname, typ), end=" ") + if len(data) >= 16: + print("- value: " % len(data)) + else: + print("- value:", values) + + # count is sum of lengths for string and arbitrary data + count = len(data) if typ in [2, 7] else len(values) + # figure out if data fits into the entry + if len(data) <= 4: + entries.append((tag, typ, count, data.ljust(4, b"\0"), b"")) + else: + entries.append((tag, typ, count, self._pack("L", offset), + data)) + offset += (len(data) + 1) // 2 * 2 # pad to word + + # update strip offset data to point beyond auxiliary data + if stripoffsets is not None: + tag, typ, count, value, data = entries[stripoffsets] + if data: + raise NotImplementedError( + "multistrip support not yet implemented") + value = self._pack("L", self._unpack("L", value)[0] + offset) + entries[stripoffsets] = tag, typ, count, value, data + + # pass 2: write entries to file + for tag, typ, count, value, data in entries: + if DEBUG > 1: + print(tag, typ, count, repr(value), repr(data)) + fp.write(self._pack("HHL4s", tag, typ, count, value)) + + # -- overwrite here for multi-page -- + fp.write(b"\0\0\0\0") # end of entries + + # pass 3: write auxiliary data to file + for tag, typ, count, value, data in entries: + fp.write(data) + if len(data) & 1: + fp.write(b"\0") + + return offset + + +ImageFileDirectory_v2._load_dispatch = _load_dispatch +ImageFileDirectory_v2._write_dispatch = _write_dispatch +for idx, name in TYPES.items(): + name = name.replace(" ", "_") + setattr(ImageFileDirectory_v2, "load_" + name, _load_dispatch[idx][1]) + setattr(ImageFileDirectory_v2, "write_" + name, _write_dispatch[idx]) +del _load_dispatch, _write_dispatch, idx, name + + +# Legacy ImageFileDirectory support. +class ImageFileDirectory_v1(ImageFileDirectory_v2): + """This class represents the **legacy** interface to a TIFF tag directory. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v1() + ifd[key] = 'Some Data' + ifd.tagtype[key] = 2 + print(ifd[key]) + ('Some Data',) + + Also contains a dictionary of tag types as read from the tiff image file, + `~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. + + Values are returned as a tuple. + + .. deprecated:: 3.0.0 + """ + def __init__(self, *args, **kwargs): + ImageFileDirectory_v2.__init__(self, *args, **kwargs) + self._legacy_api = True + + tags = property(lambda self: self._tags_v1) + tagdata = property(lambda self: self._tagdata) + + @classmethod + def from_v2(cls, original): + """ Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + + """ + + ifd = cls(prefix=original.prefix) + ifd._tagdata = original._tagdata + ifd.tagtype = original.tagtype + ifd.next = original.next # an indicator for multipage tiffs + return ifd + + def to_v2(self): + """ Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + + """ + + ifd = ImageFileDirectory_v2(prefix=self.prefix) + ifd._tagdata = dict(self._tagdata) + ifd.tagtype = dict(self.tagtype) + ifd._tags_v2 = dict(self._tags_v2) + return ifd + + def __contains__(self, tag): + return tag in self._tags_v1 or tag in self._tagdata + + def __len__(self): + return len(set(self._tagdata) | set(self._tags_v1)) + + def __iter__(self): + return iter(set(self._tagdata) | set(self._tags_v1)) + + def __setitem__(self, tag, value): + for legacy_api in (False, True): + self._setitem(tag, value, legacy_api) + + def __getitem__(self, tag): + if tag not in self._tags_v1: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + for legacy in (False, True): + self._setitem(tag, handler(self, data, legacy), legacy) + val = self._tags_v1[tag] + if not isinstance(val, (tuple, bytes)): + val = val, + return val + + +# undone -- switch this pointer when IFD_LEGACY_API == False +ImageFileDirectory = ImageFileDirectory_v1 + + +## +# Image plugin for TIFF files. + +class TiffImageFile(ImageFile.ImageFile): + + format = "TIFF" + format_description = "Adobe TIFF" + _close_exclusive_fp_after_loading = False + + def _open(self): + "Open the first image in a TIFF file" + + # Header + ifh = self.fp.read(8) + + # image file directory (tag dictionary) + self.tag_v2 = ImageFileDirectory_v2(ifh) + + # legacy tag/ifd entries will be filled in later + self.tag = self.ifd = None + + # setup frame pointers + self.__first = self.__next = self.tag_v2.next + self.__frame = -1 + self.__fp = self.fp + self._frame_pos = [] + self._n_frames = None + self._is_animated = None + + if DEBUG: + print("*** TiffImageFile._open ***") + print("- __first:", self.__first) + print("- ifh: ", ifh) + + # and load the first frame + self._seek(0) + + @property + def n_frames(self): + if self._n_frames is None: + current = self.tell() + try: + while True: + self._seek(self.tell() + 1) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames + + @property + def is_animated(self): + if self._is_animated is None: + if self._n_frames is not None: + self._is_animated = self._n_frames != 1 + else: + current = self.tell() + + try: + self.seek(1) + self._is_animated = True + except EOFError: + self._is_animated = False + + self.seek(current) + return self._is_animated + + def seek(self, frame): + "Select a given frame as current image" + if not self._seek_check(frame): + return + self._seek(frame) + # Create a new core image object on second and + # subsequent frames in the image. Image may be + # different size/mode. + Image._decompression_bomb_check(self.size) + self.im = Image.core.new(self.mode, self.size) + + def _seek(self, frame): + self.fp = self.__fp + while len(self._frame_pos) <= frame: + if not self.__next: + raise EOFError("no more images in TIFF file") + if DEBUG: + print("Seeking to frame %s, on frame %s, " + "__next %s, location: %s" % + (frame, self.__frame, self.__next, self.fp.tell())) + # reset python3 buffered io handle in case fp + # was passed to libtiff, invalidating the buffer + self.fp.tell() + self.fp.seek(self.__next) + self._frame_pos.append(self.__next) + if DEBUG: + print("Loading tags, location: %s" % self.fp.tell()) + self.tag_v2.load(self.fp) + self.__next = self.tag_v2.next + self.__frame += 1 + self.fp.seek(self._frame_pos[frame]) + self.tag_v2.load(self.fp) + self.__next = self.tag_v2.next + # fill the legacy tag/ifd entries + self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) + self.__frame = frame + self._setup() + + def tell(self): + "Return the current frame number" + return self.__frame + + def _decoder(self, rawmode, layer, tile=None): + "Setup decoder contexts" + + args = None + if rawmode == "RGB" and self._planar_configuration == 2: + rawmode = rawmode[layer] + compression = self._compression + if compression == "raw": + args = (rawmode, 0, 1) + elif compression == "packbits": + args = rawmode + + return args + + def load(self): + if self.use_load_libtiff: + return self._load_libtiff() + return super(TiffImageFile, self).load() + + def load_end(self): + # allow closing if we're on the first frame, there's no next + # This is the ImageFile.load path only, libtiff specific below. + if self.__frame == 0 and not self.__next: + self._close_exclusive_fp_after_loading = True + + def _load_libtiff(self): + """ Overload method triggered when we detect a compressed tiff + Calls out to libtiff """ + + pixel = Image.Image.load(self) + + if self.tile is None: + raise IOError("cannot load this image") + if not self.tile: + return pixel + + self.load_prepare() + + if not len(self.tile) == 1: + raise IOError("Not exactly one tile") + + # (self._compression, (extents tuple), + # 0, (rawmode, self._compression, fp)) + extents = self.tile[0][1] + args = list(self.tile[0][3]) + [self.tag_v2.offset] + + # To be nice on memory footprint, if there's a + # file descriptor, use that instead of reading + # into a string in python. + # libtiff closes the file descriptor, so pass in a dup. + try: + fp = hasattr(self.fp, "fileno") and os.dup(self.fp.fileno()) + # flush the file descriptor, prevents error on pypy 2.4+ + # should also eliminate the need for fp.tell for py3 + # in _seek + if hasattr(self.fp, "flush"): + self.fp.flush() + except IOError: + # io.BytesIO have a fileno, but returns an IOError if + # it doesn't use a file descriptor. + fp = False + + if fp: + args[2] = fp + + decoder = Image._getdecoder(self.mode, 'libtiff', tuple(args), + self.decoderconfig) + try: + decoder.setimage(self.im, extents) + except ValueError: + raise IOError("Couldn't set the image") + + if hasattr(self.fp, "getvalue"): + # We've got a stringio like thing passed in. Yay for all in memory. + # The decoder needs the entire file in one shot, so there's not + # a lot we can do here other than give it the entire file. + # unless we could do something like get the address of the + # underlying string for stringio. + # + # Rearranging for supporting byteio items, since they have a fileno + # that returns an IOError if there's no underlying fp. Easier to + # deal with here by reordering. + if DEBUG: + print("have getvalue. just sending in a string from getvalue") + n, err = decoder.decode(self.fp.getvalue()) + elif hasattr(self.fp, "fileno"): + # we've got a actual file on disk, pass in the fp. + if DEBUG: + print("have fileno, calling fileno version of the decoder.") + self.fp.seek(0) + # 4 bytes, otherwise the trace might error out + n, err = decoder.decode(b"fpfp") + else: + # we have something else. + if DEBUG: + print("don't have fileno or getvalue. just reading") + # UNDONE -- so much for that buffer size thing. + n, err = decoder.decode(self.fp.read()) + + self.tile = [] + self.readonly = 0 + # libtiff closed the fp in a, we need to close self.fp, if possible + if self._exclusive_fp: + if self.__frame == 0 and not self.__next: + self.fp.close() + self.fp = None # might be shared + + if err < 0: + raise IOError(err) + + return Image.Image.load(self) + + def _setup(self): + "Setup this image object based on current tags" + + if 0xBC01 in self.tag_v2: + raise IOError("Windows Media Photo files not yet supported") + + # extract relevant tags + self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)] + self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1) + + # photometric is a required tag, but not everyone is reading + # the specification + photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0) + + fillorder = self.tag_v2.get(FILLORDER, 1) + + if DEBUG: + print("*** Summary ***") + print("- compression:", self._compression) + print("- photometric_interpretation:", photo) + print("- planar_configuration:", self._planar_configuration) + print("- fill_order:", fillorder) + + # size + xsize = self.tag_v2.get(IMAGEWIDTH) + ysize = self.tag_v2.get(IMAGELENGTH) + self.size = xsize, ysize + + if DEBUG: + print("- size:", self.size) + + sampleFormat = self.tag_v2.get(SAMPLEFORMAT, (1,)) + if (len(sampleFormat) > 1 + and max(sampleFormat) == min(sampleFormat) == 1): + # SAMPLEFORMAT is properly per band, so an RGB image will + # be (1,1,1). But, we don't support per band pixel types, + # and anything more than one band is a uint8. So, just + # take the first element. Revisit this if adding support + # for more exotic images. + sampleFormat = (1,) + + bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) + extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) + if photo in (2, 6, 8): # RGB, YCbCr, LAB + bps_count = 3 + elif photo == 5: # CMYK + bps_count = 4 + else: + bps_count = 1 + bps_count += len(extra_tuple) + # Some files have only one value in bps_tuple, + # while should have more. Fix it + if bps_count > len(bps_tuple) and len(bps_tuple) == 1: + bps_tuple = bps_tuple * bps_count + + # mode: check photometric interpretation and bits per pixel + key = (self.tag_v2.prefix, photo, sampleFormat, fillorder, + bps_tuple, extra_tuple) + if DEBUG: + print("format key:", key) + try: + self.mode, rawmode = OPEN_INFO[key] + except KeyError: + if DEBUG: + print("- unsupported format") + raise SyntaxError("unknown pixel mode") + + if DEBUG: + print("- raw mode:", rawmode) + print("- pil mode:", self.mode) + + self.info["compression"] = self._compression + + xres = self.tag_v2.get(X_RESOLUTION, 1) + yres = self.tag_v2.get(Y_RESOLUTION, 1) + + if xres and yres: + resunit = self.tag_v2.get(RESOLUTION_UNIT) + if resunit == 2: # dots per inch + self.info["dpi"] = xres, yres + elif resunit == 3: # dots per centimeter. convert to dpi + self.info["dpi"] = xres * 2.54, yres * 2.54 + elif resunit is None: # used to default to 1, but now 2) + self.info["dpi"] = xres, yres + # For backward compatibility, + # we also preserve the old behavior + self.info["resolution"] = xres, yres + else: # No absolute unit of measurement + self.info["resolution"] = xres, yres + + # build tile descriptors + x = y = l = 0 + self.tile = [] + self.use_load_libtiff = False + if STRIPOFFSETS in self.tag_v2: + # striped image + offsets = self.tag_v2[STRIPOFFSETS] + h = self.tag_v2.get(ROWSPERSTRIP, ysize) + w = self.size[0] + if READ_LIBTIFF or self._compression != 'raw': + # if DEBUG: + # print("Activating g4 compression for whole file") + + # Decoder expects entire file as one tile. + # There's a buffer size limit in load (64k) + # so large g4 images will fail if we use that + # function. + # + # Setup the one tile for the whole image, then + # use the _load_libtiff function. + + self.use_load_libtiff = True + + # libtiff handles the fillmode for us, so 1;IR should + # actually be 1;I. Including the R double reverses the + # bits, so stripes of the image are reversed. See + # https://github.com/python-pillow/Pillow/issues/279 + if fillorder == 2: + key = ( + self.tag_v2.prefix, photo, sampleFormat, 1, + self.tag_v2.get(BITSPERSAMPLE, (1,)), + self.tag_v2.get(EXTRASAMPLES, ()) + ) + if DEBUG: + print("format key:", key) + # this should always work, since all the + # fillorder==2 modes have a corresponding + # fillorder=1 mode + self.mode, rawmode = OPEN_INFO[key] + # libtiff always returns the bytes in native order. + # we're expecting image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if rawmode == 'I;16': + rawmode = 'I;16N' + if ';16B' in rawmode: + rawmode = rawmode.replace(';16B', ';16N') + if ';16L' in rawmode: + rawmode = rawmode.replace(';16L', ';16N') + + # Offset in the tile tuple is 0, we go from 0,0 to + # w,h, and we only do this once -- eds + a = (rawmode, self._compression, False) + self.tile.append( + (self._compression, + (0, 0, w, ysize), + 0, a)) + a = None + + else: + for i, offset in enumerate(offsets): + a = self._decoder(rawmode, l, i) + self.tile.append( + (self._compression, + (0, min(y, ysize), w, min(y+h, ysize)), + offset, a)) + if DEBUG: + print("tiles: ", self.tile) + y = y + h + if y >= self.size[1]: + x = y = 0 + l += 1 + a = None + elif TILEOFFSETS in self.tag_v2: + # tiled image + w = self.tag_v2.get(322) + h = self.tag_v2.get(323) + a = None + for o in self.tag_v2[TILEOFFSETS]: + if not a: + a = self._decoder(rawmode, l) + # FIXME: this doesn't work if the image size + # is not a multiple of the tile size... + self.tile.append( + (self._compression, + (x, y, x+w, y+h), + o, a)) + x = x + w + if x >= self.size[0]: + x, y = 0, y + h + if y >= self.size[1]: + x = y = 0 + l += 1 + a = None + else: + if DEBUG: + print("- unsupported data organization") + raise SyntaxError("unknown data organization") + + # Fix up info. + if ICCPROFILE in self.tag_v2: + self.info['icc_profile'] = self.tag_v2[ICCPROFILE] + + # fixup palette descriptor + + if self.mode == "P": + palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] + self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) + + +# +# -------------------------------------------------------------------- +# Write TIFF files + +# little endian is default except for image modes with +# explicit big endian byte-order + +SAVE_INFO = { + # mode => rawmode, byteorder, photometrics, + # sampleformat, bitspersample, extra + "1": ("1", II, 1, 1, (1,), None), + "L": ("L", II, 1, 1, (8,), None), + "LA": ("LA", II, 1, 1, (8, 8), 2), + "P": ("P", II, 3, 1, (8,), None), + "PA": ("PA", II, 3, 1, (8, 8), 2), + "I": ("I;32S", II, 1, 2, (32,), None), + "I;16": ("I;16", II, 1, 1, (16,), None), + "I;16S": ("I;16S", II, 1, 2, (16,), None), + "F": ("F;32F", II, 1, 3, (32,), None), + "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), + "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), + "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2), + "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), + "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), + "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), + + "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), + "I;16B": ("I;16B", MM, 1, 1, (16,), None), + "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), + "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), +} + + +def _save(im, fp, filename): + + try: + rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] + except KeyError: + raise IOError("cannot write mode %s as TIFF" % im.mode) + + ifd = ImageFileDirectory_v2(prefix=prefix) + + compression = im.encoderinfo.get('compression', + im.info.get('compression', 'raw')) + + libtiff = WRITE_LIBTIFF or compression != 'raw' + + # required for color libtiff images + ifd[PLANAR_CONFIGURATION] = getattr(im, '_planar_configuration', 1) + + ifd[IMAGEWIDTH] = im.size[0] + ifd[IMAGELENGTH] = im.size[1] + + # write any arbitrary tags passed in as an ImageFileDirectory + info = im.encoderinfo.get("tiffinfo", {}) + if DEBUG: + print("Tiffinfo Keys: %s" % list(info)) + if isinstance(info, ImageFileDirectory_v1): + info = info.to_v2() + for key in info: + ifd[key] = info.get(key) + try: + ifd.tagtype[key] = info.tagtype[key] + except: + pass # might not be an IFD, Might not have populated type + + # additions written by Greg Couch, gregc@cgl.ucsf.edu + # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com + if hasattr(im, 'tag_v2'): + # preserve tags from original TIFF image file + for key in (RESOLUTION_UNIT, X_RESOLUTION, Y_RESOLUTION, + IPTC_NAA_CHUNK, PHOTOSHOP_CHUNK, XMP): + if key in im.tag_v2: + ifd[key] = im.tag_v2[key] + ifd.tagtype[key] = im.tag_v2.tagtype[key] + + # preserve ICC profile (should also work when saving other formats + # which support profiles as TIFF) -- 2008-06-06 Florian Hoech + if "icc_profile" in im.info: + ifd[ICCPROFILE] = im.info["icc_profile"] + + for key, name in [(IMAGEDESCRIPTION, "description"), + (X_RESOLUTION, "resolution"), + (Y_RESOLUTION, "resolution"), + (X_RESOLUTION, "x_resolution"), + (Y_RESOLUTION, "y_resolution"), + (RESOLUTION_UNIT, "resolution_unit"), + (SOFTWARE, "software"), + (DATE_TIME, "date_time"), + (ARTIST, "artist"), + (COPYRIGHT, "copyright")]: + if name in im.encoderinfo: + ifd[key] = im.encoderinfo[name] + + dpi = im.encoderinfo.get("dpi") + if dpi: + ifd[RESOLUTION_UNIT] = 2 + ifd[X_RESOLUTION] = dpi[0] + ifd[Y_RESOLUTION] = dpi[1] + + if bits != (1,): + ifd[BITSPERSAMPLE] = bits + if len(bits) != 1: + ifd[SAMPLESPERPIXEL] = len(bits) + if extra is not None: + ifd[EXTRASAMPLES] = extra + if format != 1: + ifd[SAMPLEFORMAT] = format + + ifd[PHOTOMETRIC_INTERPRETATION] = photo + + if im.mode == "P": + lut = im.im.getpalette("RGB", "RGB;L") + ifd[COLORMAP] = tuple(i8(v) * 256 for v in lut) + # data orientation + stride = len(bits) * ((im.size[0]*bits[0]+7)//8) + ifd[ROWSPERSTRIP] = im.size[1] + ifd[STRIPBYTECOUNTS] = stride * im.size[1] + ifd[STRIPOFFSETS] = 0 # this is adjusted by IFD writer + # no compression by default: + ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) + + if libtiff: + if DEBUG: + print("Saving using libtiff encoder") + print("Items: %s" % sorted(ifd.items())) + _fp = 0 + if hasattr(fp, "fileno"): + try: + fp.seek(0) + _fp = os.dup(fp.fileno()) + except io.UnsupportedOperation: + pass + + # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library + # based on the data in the strip. + blocklist = [STRIPOFFSETS, STRIPBYTECOUNTS] + atts = {} + # bits per sample is a single short in the tiff directory, not a list. + atts[BITSPERSAMPLE] = bits[0] + # Merge the ones that we have with (optional) more bits from + # the original file, e.g x,y resolution so that we can + # save(load('')) == original file. + legacy_ifd = {} + if hasattr(im, 'tag'): + legacy_ifd = im.tag.to_v2() + for tag, value in itertools.chain(ifd.items(), + getattr(im, 'tag_v2', {}).items(), + legacy_ifd.items()): + # Libtiff can only process certain core items without adding + # them to the custom dictionary. It will segfault if it attempts + # to add a custom tag without the dictionary entry + # + # UNDONE -- add code for the custom dictionary + if tag not in TiffTags.LIBTIFF_CORE: + continue + if tag not in atts and tag not in blocklist: + if isinstance(value, str if py3 else unicode): + atts[tag] = value.encode('ascii', 'replace') + b"\0" + elif isinstance(value, IFDRational): + atts[tag] = float(value) + else: + atts[tag] = value + + if DEBUG: + print("Converted items: %s" % sorted(atts.items())) + + # libtiff always expects the bytes in native order. + # we're storing image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if im.mode in ('I;16B', 'I;16'): + rawmode = 'I;16N' + + a = (rawmode, compression, _fp, filename, atts) + # print(im.mode, compression, a, im.encoderconfig) + e = Image._getencoder(im.mode, 'libtiff', a, im.encoderconfig) + e.setimage(im.im, (0, 0)+im.size) + while True: + # undone, change to self.decodermaxblock: + l, s, d = e.encode(16*1024) + if not _fp: + fp.write(d) + if s: + break + if s < 0: + raise IOError("encoder error %d when writing image file" % s) + + else: + offset = ifd.save(fp) + + ImageFile._save(im, fp, [ + ("raw", (0, 0)+im.size, offset, (rawmode, stride, 1)) + ]) + + # -- helper for multi-page save -- + if "_debug_multipage" in im.encoderinfo: + # just to access o32 and o16 (using correct byte order) + im._debug_multipage = ifd + + +class AppendingTiffWriter: + fieldSizes = [ + 0, # None + 1, # byte + 1, # ascii + 2, # short + 4, # long + 8, # rational + 1, # sbyte + 1, # undefined + 2, # sshort + 4, # slong + 8, # srational + 4, # float + 8, # double + ] + + # StripOffsets = 273 + # FreeOffsets = 288 + # TileOffsets = 324 + # JPEGQTables = 519 + # JPEGDCTables = 520 + # JPEGACTables = 521 + Tags = {273, 288, 324, 519, 520, 521} + + def __init__(self, fn, new=False): + if hasattr(fn, 'read'): + self.f = fn + self.close_fp = False + else: + self.name = fn + self.close_fp = True + try: + self.f = io.open(fn, "w+b" if new else "r+b") + except IOError: + self.f = io.open(fn, "w+b") + self.beginning = self.f.tell() + self.setup() + + def setup(self): + # Reset everything. + self.f.seek(self.beginning, os.SEEK_SET) + + self.whereToWriteNewIFDOffset = None + self.offsetOfNewPage = 0 + + self.IIMM = IIMM = self.f.read(4) + if not IIMM: + # empty file - first page + self.isFirst = True + return + + self.isFirst = False + if IIMM == b"II\x2a\x00": + self.setEndian("<") + elif IIMM == b"MM\x00\x2a": + self.setEndian(">") + else: + raise RuntimeError("Invalid TIFF file header") + + self.skipIFDs() + self.goToEnd() + + def finalize(self): + if self.isFirst: + return + + # fix offsets + self.f.seek(self.offsetOfNewPage) + + IIMM = self.f.read(4) + if not IIMM: + # raise RuntimeError("nothing written into new page") + # Make it easy to finish a frame without committing to a new one. + return + + if IIMM != self.IIMM: + raise RuntimeError("IIMM of new page doesn't match IIMM of " + "first page") + + IFDoffset = self.readLong() + IFDoffset += self.offsetOfNewPage + self.f.seek(self.whereToWriteNewIFDOffset) + self.writeLong(IFDoffset) + self.f.seek(IFDoffset) + self.fixIFD() + + def newFrame(self): + # Call this to finish a frame. + self.finalize() + self.setup() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.close_fp: + self.close() + return False + + def tell(self): + return self.f.tell() - self.offsetOfNewPage + + def seek(self, offset, whence): + if whence == os.SEEK_SET: + offset += self.offsetOfNewPage + + self.f.seek(offset, whence) + return self.tell() + + def goToEnd(self): + self.f.seek(0, os.SEEK_END) + pos = self.f.tell() + + # pad to 16 byte boundary + padBytes = 16 - pos % 16 + if 0 < padBytes < 16: + self.f.write(bytes(bytearray(padBytes))) + self.offsetOfNewPage = self.f.tell() + + def setEndian(self, endian): + self.endian = endian + self.longFmt = self.endian + "L" + self.shortFmt = self.endian + "H" + self.tagFormat = self.endian + "HHL" + + def skipIFDs(self): + while True: + IFDoffset = self.readLong() + if IFDoffset == 0: + self.whereToWriteNewIFDOffset = self.f.tell() - 4 + break + + self.f.seek(IFDoffset) + numTags = self.readShort() + self.f.seek(numTags * 12, os.SEEK_CUR) + + def write(self, data): + return self.f.write(data) + + def readShort(self): + value, = struct.unpack(self.shortFmt, self.f.read(2)) + return value + + def readLong(self): + value, = struct.unpack(self.longFmt, self.f.read(4)) + return value + + def rewriteLastShortToLong(self, value): + self.f.seek(-2, os.SEEK_CUR) + bytesWritten = self.f.write(struct.pack(self.longFmt, value)) + if bytesWritten is not None and bytesWritten != 4: + raise RuntimeError("wrote only %u bytes but wanted 4" % + bytesWritten) + + def rewriteLastShort(self, value): + self.f.seek(-2, os.SEEK_CUR) + bytesWritten = self.f.write(struct.pack(self.shortFmt, value)) + if bytesWritten is not None and bytesWritten != 2: + raise RuntimeError("wrote only %u bytes but wanted 2" % + bytesWritten) + + def rewriteLastLong(self, value): + self.f.seek(-4, os.SEEK_CUR) + bytesWritten = self.f.write(struct.pack(self.longFmt, value)) + if bytesWritten is not None and bytesWritten != 4: + raise RuntimeError("wrote only %u bytes but wanted 4" % + bytesWritten) + + def writeShort(self, value): + bytesWritten = self.f.write(struct.pack(self.shortFmt, value)) + if bytesWritten is not None and bytesWritten != 2: + raise RuntimeError("wrote only %u bytes but wanted 2" % + bytesWritten) + + def writeLong(self, value): + bytesWritten = self.f.write(struct.pack(self.longFmt, value)) + if bytesWritten is not None and bytesWritten != 4: + raise RuntimeError("wrote only %u bytes but wanted 4" % + bytesWritten) + + def close(self): + self.finalize() + self.f.close() + + def fixIFD(self): + numTags = self.readShort() + + for i in range(numTags): + tag, fieldType, count = struct.unpack(self.tagFormat, + self.f.read(8)) + + fieldSize = self.fieldSizes[fieldType] + totalSize = fieldSize * count + isLocal = (totalSize <= 4) + if not isLocal: + offset = self.readLong() + offset += self.offsetOfNewPage + self.rewriteLastLong(offset) + + if tag in self.Tags: + curPos = self.f.tell() + + if isLocal: + self.fixOffsets(count, isShort=(fieldSize == 2), + isLong=(fieldSize == 4)) + self.f.seek(curPos + 4) + else: + self.f.seek(offset) + self.fixOffsets(count, isShort=(fieldSize == 2), + isLong=(fieldSize == 4)) + self.f.seek(curPos) + + offset = curPos = None + + elif isLocal: + # skip the locally stored value that is not an offset + self.f.seek(4, os.SEEK_CUR) + + def fixOffsets(self, count, isShort=False, isLong=False): + if not isShort and not isLong: + raise RuntimeError("offset is neither short nor long") + + for i in range(count): + offset = self.readShort() if isShort else self.readLong() + offset += self.offsetOfNewPage + if isShort and offset >= 65536: + # offset is now too large - we must convert shorts to longs + if count != 1: + raise RuntimeError("not implemented") # XXX TODO + + # simple case - the offset is just one and therefore it is + # local (not referenced with another offset) + self.rewriteLastShortToLong(offset) + self.f.seek(-10, os.SEEK_CUR) + self.writeShort(4) # rewrite the type to LONG + self.f.seek(8, os.SEEK_CUR) + elif isShort: + self.rewriteLastShort(offset) + else: + self.rewriteLastLong(offset) + + +def _save_all(im, fp, filename): + encoderinfo = im.encoderinfo.copy() + encoderconfig = im.encoderconfig + append_images = list(encoderinfo.get("append_images", [])) + if not hasattr(im, "n_frames") and not append_images: + return _save(im, fp, filename) + + cur_idx = im.tell() + try: + with AppendingTiffWriter(fp) as tf: + for ims in [im]+append_images: + ims.encoderinfo = encoderinfo + ims.encoderconfig = encoderconfig + if not hasattr(ims, "n_frames"): + nfr = 1 + else: + nfr = ims.n_frames + + for idx in range(nfr): + ims.seek(idx) + ims.load() + _save(ims, tf, filename) + tf.newFrame() + finally: + im.seek(cur_idx) + + +# +# -------------------------------------------------------------------- +# Register + +Image.register_open(TiffImageFile.format, TiffImageFile, _accept) +Image.register_save(TiffImageFile.format, _save) +Image.register_save_all(TiffImageFile.format, _save_all) + +Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"]) + +Image.register_mime(TiffImageFile.format, "image/tiff") diff --git a/imagecrunch/PIL/TiffTags.py b/imagecrunch/PIL/TiffTags.py new file mode 100644 index 0000000..427f3a4 --- /dev/null +++ b/imagecrunch/PIL/TiffTags.py @@ -0,0 +1,448 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF tags +# +# This module provides clear-text names for various well-known +# TIFF tags. the TIFF codec works just fine without it. +# +# Copyright (c) Secret Labs AB 1999. +# +# See the README file for information on usage and redistribution. +# + +## +# This module provides constants and clear-text names for various +# well-known TIFF tags. +## + +from collections import namedtuple + + +class TagInfo(namedtuple("_TagInfo", "value name type length enum")): + __slots__ = [] + + def __new__(cls, value=None, name="unknown", type=None, length=None, enum=None): + return super(TagInfo, cls).__new__( + cls, value, name, type, length, enum or {}) + + def cvt_enum(self, value): + return self.enum.get(value, value) + + +def lookup(tag): + """ + :param tag: Integer tag number + :returns: Taginfo namedtuple, From the TAGS_V2 info if possible, + otherwise just populating the value and name from TAGS. + If the tag is not recognized, "unknown" is returned for the name + + """ + + return TAGS_V2.get(tag, TagInfo(tag, TAGS.get(tag, 'unknown'))) + + +## +# Map tag numbers to tag info. +# +# id: (Name, Type, Length, enum_values) +# +# The length here differs from the length in the tiff spec. For +# numbers, the tiff spec is for the number of fields returned. We +# agree here. For string-like types, the tiff spec uses the length of +# field in bytes. In Pillow, we are using the number of expected +# fields, in general 1 for string-like types. + + +BYTE = 1 +ASCII = 2 +SHORT = 3 +LONG = 4 +RATIONAL = 5 +UNDEFINED = 7 +SIGNED_RATIONAL = 10 +DOUBLE = 12 + +TAGS_V2 = { + + 254: ("NewSubfileType", LONG, 1), + 255: ("SubfileType", SHORT, 1), + 256: ("ImageWidth", LONG, 1), + 257: ("ImageLength", LONG, 1), + 258: ("BitsPerSample", SHORT, 0), + 259: ("Compression", SHORT, 1, + {"Uncompressed": 1, "CCITT 1d": 2, "Group 3 Fax": 3, "Group 4 Fax": 4, + "LZW": 5, "JPEG": 6, "PackBits": 32773}), + + 262: ("PhotometricInterpretation", SHORT, 1, + {"WhiteIsZero": 0, "BlackIsZero": 1, "RGB": 2, "RGB Palette": 3, + "Transparency Mask": 4, "CMYK": 5, "YCbCr": 6, "CieLAB": 8, + "CFA": 32803, # TIFF/EP, Adobe DNG + "LinearRaw": 32892}), # Adobe DNG + 263: ("Threshholding", SHORT, 1), + 264: ("CellWidth", SHORT, 1), + 265: ("CellLength", SHORT, 1), + 266: ("FillOrder", SHORT, 1), + 269: ("DocumentName", ASCII, 1), + + 270: ("ImageDescription", ASCII, 1), + 271: ("Make", ASCII, 1), + 272: ("Model", ASCII, 1), + 273: ("StripOffsets", LONG, 0), + 274: ("Orientation", SHORT, 1), + 277: ("SamplesPerPixel", SHORT, 1), + 278: ("RowsPerStrip", LONG, 1), + 279: ("StripByteCounts", LONG, 0), + + 280: ("MinSampleValue", LONG, 0), + 281: ("MaxSampleValue", SHORT, 0), + 282: ("XResolution", RATIONAL, 1), + 283: ("YResolution", RATIONAL, 1), + 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), + 285: ("PageName", ASCII, 1), + 286: ("XPosition", RATIONAL, 1), + 287: ("YPosition", RATIONAL, 1), + 288: ("FreeOffsets", LONG, 1), + 289: ("FreeByteCounts", LONG, 1), + + 290: ("GrayResponseUnit", SHORT, 1), + 291: ("GrayResponseCurve", SHORT, 0), + 292: ("T4Options", LONG, 1), + 293: ("T6Options", LONG, 1), + 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), + 297: ("PageNumber", SHORT, 2), + + 301: ("TransferFunction", SHORT, 0), + 305: ("Software", ASCII, 1), + 306: ("DateTime", ASCII, 1), + + 315: ("Artist", ASCII, 1), + 316: ("HostComputer", ASCII, 1), + 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), + 318: ("WhitePoint", RATIONAL, 2), + 319: ("PrimaryChromaticities", SHORT, 6), + + 320: ("ColorMap", SHORT, 0), + 321: ("HalftoneHints", SHORT, 2), + 322: ("TileWidth", LONG, 1), + 323: ("TileLength", LONG, 1), + 324: ("TileOffsets", LONG, 0), + 325: ("TileByteCounts", LONG, 0), + + 332: ("InkSet", SHORT, 1), + 333: ("InkNames", ASCII, 1), + 334: ("NumberOfInks", SHORT, 1), + 336: ("DotRange", SHORT, 0), + 337: ("TargetPrinter", ASCII, 1), + 338: ("ExtraSamples", SHORT, 0), + 339: ("SampleFormat", SHORT, 0), + + 340: ("SMinSampleValue", DOUBLE, 0), + 341: ("SMaxSampleValue", DOUBLE, 0), + 342: ("TransferRange", SHORT, 6), + + 347: ("JPEGTables", UNDEFINED, 1), + + # obsolete JPEG tags + 512: ("JPEGProc", SHORT, 1), + 513: ("JPEGInterchangeFormat", LONG, 1), + 514: ("JPEGInterchangeFormatLength", LONG, 1), + 515: ("JPEGRestartInterval", SHORT, 1), + 517: ("JPEGLosslessPredictors", SHORT, 0), + 518: ("JPEGPointTransforms", SHORT, 0), + 519: ("JPEGQTables", LONG, 0), + 520: ("JPEGDCTables", LONG, 0), + 521: ("JPEGACTables", LONG, 0), + + 529: ("YCbCrCoefficients", RATIONAL, 3), + 530: ("YCbCrSubSampling", SHORT, 2), + 531: ("YCbCrPositioning", SHORT, 1), + 532: ("ReferenceBlackWhite", LONG, 0), + + 700: ('XMP', BYTE, 1), + + 33432: ("Copyright", ASCII, 1), + 34377: ('PhotoshopInfo', BYTE, 1), + + # FIXME add more tags here + 34665: ("ExifIFD", SHORT, 1), + 34675: ('ICCProfile', UNDEFINED, 1), + 34853: ('GPSInfoIFD', BYTE, 1), + + # MPInfo + 45056: ("MPFVersion", UNDEFINED, 1), + 45057: ("NumberOfImages", LONG, 1), + 45058: ("MPEntry", UNDEFINED, 1), + 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check + 45060: ("TotalFrames", LONG, 1), + 45313: ("MPIndividualNum", LONG, 1), + 45569: ("PanOrientation", LONG, 1), + 45570: ("PanOverlap_H", RATIONAL, 1), + 45571: ("PanOverlap_V", RATIONAL, 1), + 45572: ("BaseViewpointNum", LONG, 1), + 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), + 45574: ("BaselineLength", RATIONAL, 1), + 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), + 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), + 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), + 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), + 45579: ("YawAngle", SIGNED_RATIONAL, 1), + 45580: ("PitchAngle", SIGNED_RATIONAL, 1), + 45581: ("RollAngle", SIGNED_RATIONAL, 1), + + 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), + 50780: ("BestQualityScale", RATIONAL, 1), + 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one + 50839: ("ImageJMetaData", UNDEFINED, 1) # see Issue #2006 +} + +# Legacy Tags structure +# these tags aren't included above, but were in the previous versions +TAGS = {347: 'JPEGTables', + 700: 'XMP', + + # Additional Exif Info + 32932: 'Wang Annotation', + 33434: 'ExposureTime', + 33437: 'FNumber', + 33445: 'MD FileTag', + 33446: 'MD ScalePixel', + 33447: 'MD ColorTable', + 33448: 'MD LabName', + 33449: 'MD SampleInfo', + 33450: 'MD PrepDate', + 33451: 'MD PrepTime', + 33452: 'MD FileUnits', + 33550: 'ModelPixelScaleTag', + 33723: 'IptcNaaInfo', + 33918: 'INGR Packet Data Tag', + 33919: 'INGR Flag Registers', + 33920: 'IrasB Transformation Matrix', + 33922: 'ModelTiepointTag', + 34264: 'ModelTransformationTag', + 34377: 'PhotoshopInfo', + 34735: 'GeoKeyDirectoryTag', + 34736: 'GeoDoubleParamsTag', + 34737: 'GeoAsciiParamsTag', + 34850: 'ExposureProgram', + 34852: 'SpectralSensitivity', + 34855: 'ISOSpeedRatings', + 34856: 'OECF', + 34864: 'SensitivityType', + 34865: 'StandardOutputSensitivity', + 34866: 'RecommendedExposureIndex', + 34867: 'ISOSpeed', + 34868: 'ISOSpeedLatitudeyyy', + 34869: 'ISOSpeedLatitudezzz', + 34908: 'HylaFAX FaxRecvParams', + 34909: 'HylaFAX FaxSubAddress', + 34910: 'HylaFAX FaxRecvTime', + 36864: 'ExifVersion', + 36867: 'DateTimeOriginal', + 36868: 'DateTImeDigitized', + 37121: 'ComponentsConfiguration', + 37122: 'CompressedBitsPerPixel', + 37724: 'ImageSourceData', + 37377: 'ShutterSpeedValue', + 37378: 'ApertureValue', + 37379: 'BrightnessValue', + 37380: 'ExposureBiasValue', + 37381: 'MaxApertureValue', + 37382: 'SubjectDistance', + 37383: 'MeteringMode', + 37384: 'LightSource', + 37385: 'Flash', + 37386: 'FocalLength', + 37396: 'SubjectArea', + 37500: 'MakerNote', + 37510: 'UserComment', + 37520: 'SubSec', + 37521: 'SubSecTimeOriginal', + 37522: 'SubsecTimeDigitized', + 40960: 'FlashPixVersion', + 40961: 'ColorSpace', + 40962: 'PixelXDimension', + 40963: 'PixelYDimension', + 40964: 'RelatedSoundFile', + 40965: 'InteroperabilityIFD', + 41483: 'FlashEnergy', + 41484: 'SpatialFrequencyResponse', + 41486: 'FocalPlaneXResolution', + 41487: 'FocalPlaneYResolution', + 41488: 'FocalPlaneResolutionUnit', + 41492: 'SubjectLocation', + 41493: 'ExposureIndex', + 41495: 'SensingMethod', + 41728: 'FileSource', + 41729: 'SceneType', + 41730: 'CFAPattern', + 41985: 'CustomRendered', + 41986: 'ExposureMode', + 41987: 'WhiteBalance', + 41988: 'DigitalZoomRatio', + 41989: 'FocalLengthIn35mmFilm', + 41990: 'SceneCaptureType', + 41991: 'GainControl', + 41992: 'Contrast', + 41993: 'Saturation', + 41994: 'Sharpness', + 41995: 'DeviceSettingDescription', + 41996: 'SubjectDistanceRange', + 42016: 'ImageUniqueID', + 42032: 'CameraOwnerName', + 42033: 'BodySerialNumber', + 42034: 'LensSpecification', + 42035: 'LensMake', + 42036: 'LensModel', + 42037: 'LensSerialNumber', + 42112: 'GDAL_METADATA', + 42113: 'GDAL_NODATA', + 42240: 'Gamma', + 50215: 'Oce Scanjob Description', + 50216: 'Oce Application Selector', + 50217: 'Oce Identification Number', + 50218: 'Oce ImageLogic Characteristics', + + # Adobe DNG + 50706: 'DNGVersion', + 50707: 'DNGBackwardVersion', + 50708: 'UniqueCameraModel', + 50709: 'LocalizedCameraModel', + 50710: 'CFAPlaneColor', + 50711: 'CFALayout', + 50712: 'LinearizationTable', + 50713: 'BlackLevelRepeatDim', + 50714: 'BlackLevel', + 50715: 'BlackLevelDeltaH', + 50716: 'BlackLevelDeltaV', + 50717: 'WhiteLevel', + 50718: 'DefaultScale', + 50719: 'DefaultCropOrigin', + 50720: 'DefaultCropSize', + 50721: 'ColorMatrix1', + 50722: 'ColorMatrix2', + 50723: 'CameraCalibration1', + 50724: 'CameraCalibration2', + 50725: 'ReductionMatrix1', + 50726: 'ReductionMatrix2', + 50727: 'AnalogBalance', + 50728: 'AsShotNeutral', + 50729: 'AsShotWhiteXY', + 50730: 'BaselineExposure', + 50731: 'BaselineNoise', + 50732: 'BaselineSharpness', + 50733: 'BayerGreenSplit', + 50734: 'LinearResponseLimit', + 50735: 'CameraSerialNumber', + 50736: 'LensInfo', + 50737: 'ChromaBlurRadius', + 50738: 'AntiAliasStrength', + 50740: 'DNGPrivateData', + 50778: 'CalibrationIlluminant1', + 50779: 'CalibrationIlluminant2', + 50784: 'Alias Layer Metadata' + } + + +def _populate(): + for k, v in TAGS_V2.items(): + # Populate legacy structure. + TAGS[k] = v[0] + if len(v) == 4: + for sk, sv in v[3].items(): + TAGS[(k, sv)] = sk + + TAGS_V2[k] = TagInfo(k, *v) + + +_populate() +## +# Map type numbers to type names -- defined in ImageFileDirectory. + +TYPES = {} + +# was: +# TYPES = { +# 1: "byte", +# 2: "ascii", +# 3: "short", +# 4: "long", +# 5: "rational", +# 6: "signed byte", +# 7: "undefined", +# 8: "signed short", +# 9: "signed long", +# 10: "signed rational", +# 11: "float", +# 12: "double", +# } + +# +# These tags are handled by default in libtiff, without +# adding to the custom dictionary. From tif_dir.c, searching for +# case TIFFTAG in the _TIFFVSetField function: +# Line: item. +# 148: case TIFFTAG_SUBFILETYPE: +# 151: case TIFFTAG_IMAGEWIDTH: +# 154: case TIFFTAG_IMAGELENGTH: +# 157: case TIFFTAG_BITSPERSAMPLE: +# 181: case TIFFTAG_COMPRESSION: +# 202: case TIFFTAG_PHOTOMETRIC: +# 205: case TIFFTAG_THRESHHOLDING: +# 208: case TIFFTAG_FILLORDER: +# 214: case TIFFTAG_ORIENTATION: +# 221: case TIFFTAG_SAMPLESPERPIXEL: +# 228: case TIFFTAG_ROWSPERSTRIP: +# 238: case TIFFTAG_MINSAMPLEVALUE: +# 241: case TIFFTAG_MAXSAMPLEVALUE: +# 244: case TIFFTAG_SMINSAMPLEVALUE: +# 247: case TIFFTAG_SMAXSAMPLEVALUE: +# 250: case TIFFTAG_XRESOLUTION: +# 256: case TIFFTAG_YRESOLUTION: +# 262: case TIFFTAG_PLANARCONFIG: +# 268: case TIFFTAG_XPOSITION: +# 271: case TIFFTAG_YPOSITION: +# 274: case TIFFTAG_RESOLUTIONUNIT: +# 280: case TIFFTAG_PAGENUMBER: +# 284: case TIFFTAG_HALFTONEHINTS: +# 288: case TIFFTAG_COLORMAP: +# 294: case TIFFTAG_EXTRASAMPLES: +# 298: case TIFFTAG_MATTEING: +# 305: case TIFFTAG_TILEWIDTH: +# 316: case TIFFTAG_TILELENGTH: +# 327: case TIFFTAG_TILEDEPTH: +# 333: case TIFFTAG_DATATYPE: +# 344: case TIFFTAG_SAMPLEFORMAT: +# 361: case TIFFTAG_IMAGEDEPTH: +# 364: case TIFFTAG_SUBIFD: +# 376: case TIFFTAG_YCBCRPOSITIONING: +# 379: case TIFFTAG_YCBCRSUBSAMPLING: +# 383: case TIFFTAG_TRANSFERFUNCTION: +# 389: case TIFFTAG_REFERENCEBLACKWHITE: +# 393: case TIFFTAG_INKNAMES: + +# some of these are not in our TAGS_V2 dict and were included from tiff.h + +LIBTIFF_CORE = {255, 256, 257, 258, 259, 262, 263, 266, 274, 277, + 278, 280, 281, 340, 341, 282, 283, 284, 286, 287, + 296, 297, 321, 320, 338, 32995, 322, 323, 32998, + 32996, 339, 32997, 330, 531, 530, 301, 532, 333, + # as above + 269 # this has been in our tests forever, and works + } + +LIBTIFF_CORE.remove(320) # Array of short, crashes +LIBTIFF_CORE.remove(301) # Array of short, crashes +LIBTIFF_CORE.remove(532) # Array of long, crashes + +LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes +LIBTIFF_CORE.remove(322) # We don't have support for tiled images in libtiff +LIBTIFF_CORE.remove(323) # Tiled images +LIBTIFF_CORE.remove(333) # Ink Names either + +# Note to advanced users: There may be combinations of these +# parameters and values that when added properly, will work and +# produce valid tiff images that may work in your application. +# It is safe to add and remove tags from this set from Pillow's point +# of view so long as you test against libtiff. diff --git a/imagecrunch/PIL/WalImageFile.py b/imagecrunch/PIL/WalImageFile.py new file mode 100644 index 0000000..6602cc8 --- /dev/null +++ b/imagecrunch/PIL/WalImageFile.py @@ -0,0 +1,128 @@ +# encoding: utf-8 +# +# The Python Imaging Library. +# $Id$ +# +# WAL file handling +# +# History: +# 2003-04-23 fl created +# +# Copyright (c) 2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +# NOTE: This format cannot be automatically recognized, so the reader +# is not registered for use with Image.open(). To open a WAL file, use +# the WalImageFile.open() function instead. + +# This reader is based on the specification available from: +# https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml +# and has been tested with a few sample files found using google. + +from . import Image +from ._binary import i32le as i32 + +try: + import builtins +except ImportError: + import __builtin__ + builtins = __builtin__ + + +def open(filename): + """ + Load texture from a Quake2 WAL texture file. + + By default, a Quake2 standard palette is attached to the texture. + To override the palette, use the putpalette method. + + :param filename: WAL file name, or an opened file handle. + :returns: An image instance. + """ + # FIXME: modify to return a WalImageFile instance instead of + # plain Image object ? + + def imopen(fp): + # read header fields + header = fp.read(32+24+32+12) + size = i32(header, 32), i32(header, 36) + offset = i32(header, 40) + + # load pixel data + fp.seek(offset) + + Image._decompression_bomb_check(size) + im = Image.frombytes("P", size, fp.read(size[0] * size[1])) + im.putpalette(quake2palette) + + im.format = "WAL" + im.format_description = "Quake2 Texture" + + # strings are null-terminated + im.info["name"] = header[:32].split(b"\0", 1)[0] + next_name = header[56:56+32].split(b"\0", 1)[0] + if next_name: + im.info["next_name"] = next_name + + return im + + if hasattr(filename, "read"): + return imopen(filename) + else: + with builtins.open(filename, "rb") as fp: + return imopen(fp) + + +quake2palette = ( + # default palette taken from piffo 0.93 by Hans Häggström + b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" + b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" + b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" + b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" + b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" + b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" + b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" + b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" + b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" + b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" + b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" + b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" + b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" + b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" + b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" + b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" + b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" + b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" + b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" + b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" + b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" + b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" + b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" + b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" + b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" + b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" + b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" + b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" + b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" + b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" + b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" + b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" + b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" + b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" + b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" + b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" + b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" + b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" + b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" + b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" + b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" + b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" + b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" + b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" + b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" + b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" + b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" + b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" +) diff --git a/imagecrunch/PIL/WebPImagePlugin.py b/imagecrunch/PIL/WebPImagePlugin.py new file mode 100644 index 0000000..39a8f2e --- /dev/null +++ b/imagecrunch/PIL/WebPImagePlugin.py @@ -0,0 +1,316 @@ +from . import Image, ImageFile, _webp +from io import BytesIO + + +_VALID_WEBP_MODES = { + "RGBX": True, + "RGBA": True, + } + +_VALID_WEBP_LEGACY_MODES = { + "RGB": True, + "RGBA": True, + } + +_VP8_MODES_BY_IDENTIFIER = { + b"VP8 ": "RGB", + b"VP8X": "RGBA", + b"VP8L": "RGBA", # lossless + } + + +def _accept(prefix): + is_riff_file_format = prefix[:4] == b"RIFF" + is_webp_file = prefix[8:12] == b"WEBP" + is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER + + return is_riff_file_format and is_webp_file and is_valid_vp8_mode + + +class WebPImageFile(ImageFile.ImageFile): + + format = "WEBP" + format_description = "WebP image" + + def _open(self): + if not _webp.HAVE_WEBPANIM: + # Legacy mode + data, width, height, self.mode, icc_profile, exif = \ + _webp.WebPDecode(self.fp.read()) + if icc_profile: + self.info["icc_profile"] = icc_profile + if exif: + self.info["exif"] = exif + self.size = width, height + self.fp = BytesIO(data) + self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] + self._n_frames = 1 + return + + # Use the newer AnimDecoder API to parse the (possibly) animated file, + # and access muxed chunks like ICC/EXIF/XMP. + self._decoder = _webp.WebPAnimDecoder(self.fp.read()) + + # Get info from decoder + width, height, loop_count, bgcolor, frame_count, mode = \ + self._decoder.get_info() + self.size = width, height + self.info["loop"] = loop_count + bg_a, bg_r, bg_g, bg_b = \ + (bgcolor >> 24) & 0xFF, \ + (bgcolor >> 16) & 0xFF, \ + (bgcolor >> 8) & 0xFF, \ + bgcolor & 0xFF + self.info["background"] = (bg_r, bg_g, bg_b, bg_a) + self._n_frames = frame_count + self.mode = mode + self.tile = [] + + # Attempt to read ICC / EXIF / XMP chunks from file + icc_profile = self._decoder.get_chunk("ICCP") + exif = self._decoder.get_chunk("EXIF") + xmp = self._decoder.get_chunk("XMP ") + if icc_profile: + self.info["icc_profile"] = icc_profile + if exif: + self.info["exif"] = exif + if xmp: + self.info["xmp"] = xmp + + # Initialize seek state + self._reset(reset=False) + self.seek(0) + + def _getexif(self): + from .JpegImagePlugin import _getexif + return _getexif(self) + + @property + def n_frames(self): + return self._n_frames + + @property + def is_animated(self): + return self._n_frames > 1 + + def seek(self, frame): + if not _webp.HAVE_WEBPANIM: + return super(WebPImageFile, self).seek(frame) + + # Perform some simple checks first + if frame >= self._n_frames: + raise EOFError("attempted to seek beyond end of sequence") + if frame < 0: + raise EOFError("negative frame index is not valid") + + # Set logical frame to requested position + self.__logical_frame = frame + + def _reset(self, reset=True): + if reset: + self._decoder.reset() + self.__physical_frame = 0 + self.__loaded = -1 + self.__timestamp = 0 + + def _get_next(self): + # Get next frame + ret = self._decoder.get_next() + self.__physical_frame += 1 + + # Check if an error occurred + if ret is None: + self._reset() # Reset just to be safe + self.seek(0) + raise EOFError("failed to decode next frame in WebP file") + + # Compute duration + data, timestamp = ret + duration = timestamp - self.__timestamp + self.__timestamp = timestamp + + # libwebp gives frame end, adjust to start of frame + timestamp -= duration + return data, timestamp, duration + + def _seek(self, frame): + if self.__physical_frame == frame: + return # Nothing to do + if frame < self.__physical_frame: + self._reset() # Rewind to beginning + while self.__physical_frame < frame: + self._get_next() # Advance to the requested frame + + def load(self): + if _webp.HAVE_WEBPANIM: + if self.__loaded != self.__logical_frame: + self._seek(self.__logical_frame) + + # We need to load the image data for this frame + data, timestamp, duration = self._get_next() + self.info["timestamp"] = timestamp + self.info["duration"] = duration + self.__loaded = self.__logical_frame + + # Set tile + self.fp = BytesIO(data) + self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] + + return super(WebPImageFile, self).load() + + def tell(self): + if not _webp.HAVE_WEBPANIM: + return super(WebPImageFile, self).tell() + + return self.__logical_frame + + +def _save_all(im, fp, filename): + encoderinfo = im.encoderinfo.copy() + append_images = list(encoderinfo.get("append_images", [])) + + # If total frame count is 1, then save using the legacy API, which + # will preserve non-alpha modes + total = 0 + for ims in [im]+append_images: + total += 1 if not hasattr(ims, "n_frames") else ims.n_frames + if total == 1: + _save(im, fp, filename) + return + + background = encoderinfo.get("background", (0, 0, 0, 0)) + duration = im.encoderinfo.get("duration", 0) + loop = im.encoderinfo.get("loop", 0) + minimize_size = im.encoderinfo.get("minimize_size", False) + kmin = im.encoderinfo.get("kmin", None) + kmax = im.encoderinfo.get("kmax", None) + allow_mixed = im.encoderinfo.get("allow_mixed", False) + verbose = False + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + method = im.encoderinfo.get("method", 0) + icc_profile = im.encoderinfo.get("icc_profile", "") + exif = im.encoderinfo.get("exif", "") + xmp = im.encoderinfo.get("xmp", "") + if allow_mixed: + lossless = False + + # Sensible keyframe defaults are from gif2webp.c script + if kmin is None: + kmin = 9 if lossless else 3 + if kmax is None: + kmax = 17 if lossless else 5 + + # Validate background color + if (not isinstance(background, (list, tuple)) or len(background) != 4 or + not all(v >= 0 and v < 256 for v in background)): + raise IOError("Background color is not an RGBA tuple clamped " + "to (0-255): %s" % str(background)) + + # Convert to packed uint + bg_r, bg_g, bg_b, bg_a = background + background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) + + # Setup the WebP animation encoder + enc = _webp.WebPAnimEncoder( + im.size[0], im.size[1], + background, + loop, + minimize_size, + kmin, kmax, + allow_mixed, + verbose + ) + + # Add each frame + frame_idx = 0 + timestamp = 0 + cur_idx = im.tell() + try: + for ims in [im]+append_images: + # Get # of frames in this image + if not hasattr(ims, "n_frames"): + nfr = 1 + else: + nfr = ims.n_frames + + for idx in range(nfr): + ims.seek(idx) + ims.load() + + # Make sure image mode is supported + frame = ims + if ims.mode not in _VALID_WEBP_MODES: + alpha = ims.mode == 'P' and 'A' in ims.im.getpalettemode() + frame = ims.convert('RGBA' if alpha else 'RGBX') + + # Append the frame to the animation encoder + enc.add( + frame.tobytes(), + timestamp, + frame.size[0], frame.size[1], + frame.mode, + lossless, + quality, + method + ) + + # Update timestamp and frame index + if isinstance(duration, (list, tuple)): + timestamp += duration[frame_idx] + else: + timestamp += duration + frame_idx += 1 + + finally: + im.seek(cur_idx) + + # Force encoder to flush frames + enc.add( + None, + timestamp, + 0, 0, "", lossless, quality, 0 + ) + + # Get the final output from the encoder + data = enc.assemble(icc_profile, exif, xmp) + if data is None: + raise IOError("cannot write file as WebP (encoder returned None)") + + fp.write(data) + + +def _save(im, fp, filename): + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + icc_profile = im.encoderinfo.get("icc_profile", "") + exif = im.encoderinfo.get("exif", "") + xmp = im.encoderinfo.get("xmp", "") + + if im.mode not in _VALID_WEBP_LEGACY_MODES: + alpha = im.mode == 'P' and 'A' in im.im.getpalettemode() + im = im.convert('RGBA' if alpha else 'RGB') + + data = _webp.WebPEncode( + im.tobytes(), + im.size[0], + im.size[1], + lossless, + float(quality), + im.mode, + icc_profile, + exif, + xmp + ) + if data is None: + raise IOError("cannot write file as WebP (encoder returned None)") + + fp.write(data) + + +Image.register_open(WebPImageFile.format, WebPImageFile, _accept) +Image.register_save(WebPImageFile.format, _save) +if _webp.HAVE_WEBPANIM: + Image.register_save_all(WebPImageFile.format, _save_all) +Image.register_extension(WebPImageFile.format, ".webp") +Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/imagecrunch/PIL/WmfImagePlugin.py b/imagecrunch/PIL/WmfImagePlugin.py new file mode 100644 index 0000000..2135844 --- /dev/null +++ b/imagecrunch/PIL/WmfImagePlugin.py @@ -0,0 +1,170 @@ +# +# The Python Imaging Library +# $Id$ +# +# WMF stub codec +# +# history: +# 1996-12-14 fl Created +# 2004-02-22 fl Turned into a stub driver +# 2004-02-23 fl Added EMF support +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +# WMF/EMF reference documentation: +# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf +# http://wvware.sourceforge.net/caolan/index.html +# http://wvware.sourceforge.net/caolan/ora-wmf.html + +from __future__ import print_function + +from . import Image, ImageFile +from ._binary import i16le as word, si16le as short, i32le as dword, si32le as _long +from ._util import py3 + + +__version__ = "0.2" + +_handler = None + +if py3: + long = int + + +def register_handler(handler): + """ + Install application-specific WMF image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +if hasattr(Image.core, "drawwmf"): + # install default handler (windows only) + + class WmfHandler(object): + + def open(self, im): + im.mode = "RGB" + self.bbox = im.info["wmf_bbox"] + + def load(self, im): + im.fp.seek(0) # rewind + return Image.frombytes( + "RGB", im.size, + Image.core.drawwmf(im.fp.read(), im.size, self.bbox), + "raw", "BGR", (im.size[0]*3 + 3) & -4, -1 + ) + + register_handler(WmfHandler()) + +# +# -------------------------------------------------------------------- +# Read WMF file + + +def _accept(prefix): + return ( + prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or + prefix[:4] == b"\x01\x00\x00\x00" + ) + + +## +# Image plugin for Windows metafiles. + +class WmfStubImageFile(ImageFile.StubImageFile): + + format = "WMF" + format_description = "Windows Metafile" + + def _open(self): + + # check placable header + s = self.fp.read(80) + + if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00": + + # placeable windows metafile + + # get units per inch + inch = word(s, 14) + + # get bounding box + x0 = short(s, 6) + y0 = short(s, 8) + x1 = short(s, 10) + y1 = short(s, 12) + + # normalize size to 72 dots per inch + size = (x1 - x0) * 72 // inch, (y1 - y0) * 72 // inch + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + self.info["dpi"] = 72 + + # print(self.mode, self.size, self.info) + + # sanity check (standard metafile header) + if s[22:26] != b"\x01\x00\t\x00": + raise SyntaxError("Unsupported WMF file format") + + elif dword(s) == 1 and s[40:44] == b" EMF": + # enhanced metafile + + # get bounding box + x0 = _long(s, 8) + y0 = _long(s, 12) + x1 = _long(s, 16) + y1 = _long(s, 20) + + # get frame (in 0.01 millimeter units) + frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) + + # normalize size to 72 dots per inch + size = x1 - x0, y1 - y0 + + # calculate dots per inch from bbox and frame + xdpi = 2540 * (x1 - y0) // (frame[2] - frame[0]) + ydpi = 2540 * (y1 - y0) // (frame[3] - frame[1]) + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + if xdpi == ydpi: + self.info["dpi"] = xdpi + else: + self.info["dpi"] = xdpi, ydpi + + else: + raise SyntaxError("Unsupported file format") + + self.mode = "RGB" + self.size = size + + loader = self._load() + if loader: + loader.open(self) + + def _load(self): + return _handler + + +def _save(im, fp, filename): + if _handler is None or not hasattr(_handler, "save"): + raise IOError("WMF save handler not installed") + _handler.save(im, fp, filename) + +# +# -------------------------------------------------------------------- +# Registry stuff + + +Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) +Image.register_save(WmfStubImageFile.format, _save) + +Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"]) diff --git a/imagecrunch/PIL/XVThumbImagePlugin.py b/imagecrunch/PIL/XVThumbImagePlugin.py new file mode 100644 index 0000000..a7d39ed --- /dev/null +++ b/imagecrunch/PIL/XVThumbImagePlugin.py @@ -0,0 +1,80 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XV Thumbnail file handler by Charles E. "Gene" Cash +# (gcash@magicnet.net) +# +# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, +# available from ftp://ftp.cis.upenn.edu/pub/xv/ +# +# history: +# 98-08-15 cec created (b/w only) +# 98-12-09 cec added color palette +# 98-12-28 fl added to PIL (with only a few very minor modifications) +# +# To do: +# FIXME: make save work (this requires quantization support) +# + +from . import Image, ImageFile, ImagePalette +from ._binary import i8, o8 + +__version__ = "0.1" + +_MAGIC = b"P7 332" + +# standard color palette for thumbnails (RGB332) +PALETTE = b"" +for r in range(8): + for g in range(8): + for b in range(4): + PALETTE = PALETTE + (o8((r*255)//7)+o8((g*255)//7)+o8((b*255)//3)) + + +def _accept(prefix): + return prefix[:6] == _MAGIC + + +## +# Image plugin for XV thumbnail images. + +class XVThumbImageFile(ImageFile.ImageFile): + + format = "XVThumb" + format_description = "XV thumbnail image" + + def _open(self): + + # check magic + if not _accept(self.fp.read(6)): + raise SyntaxError("not an XV thumbnail file") + + # Skip to beginning of next line + self.fp.readline() + + # skip info comments + while True: + s = self.fp.readline() + if not s: + raise SyntaxError("Unexpected EOF reading XV thumbnail file") + if i8(s[0]) != 35: # ie. when not a comment: '#' + break + + # parse header line (already read) + s = s.strip().split() + + self.mode = "P" + self.size = int(s[0]), int(s[1]) + + self.palette = ImagePalette.raw("RGB", PALETTE) + + self.tile = [ + ("raw", (0, 0)+self.size, + self.fp.tell(), (self.mode, 0, 1) + )] + + +# -------------------------------------------------------------------- + +Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/imagecrunch/PIL/XbmImagePlugin.py b/imagecrunch/PIL/XbmImagePlugin.py new file mode 100644 index 0000000..b43fbef --- /dev/null +++ b/imagecrunch/PIL/XbmImagePlugin.py @@ -0,0 +1,96 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XBM File handling +# +# History: +# 1995-09-08 fl Created +# 1996-11-01 fl Added save support +# 1997-07-07 fl Made header parser more tolerant +# 1997-07-22 fl Fixed yet another parser bug +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) +# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) +# 2004-02-24 fl Allow some whitespace before first #define +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +import re +from . import Image, ImageFile + +__version__ = "0.6" + +# XBM header +xbm_head = re.compile( + br"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" + b"(?P" + b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" + b")?" + b"[\\000-\\377]*_bits\\[\\]" +) + + +def _accept(prefix): + return prefix.lstrip()[:7] == b"#define" + + +## +# Image plugin for X11 bitmaps. + +class XbmImageFile(ImageFile.ImageFile): + + format = "XBM" + format_description = "X11 Bitmap" + + def _open(self): + + m = xbm_head.match(self.fp.read(512)) + + if m: + + xsize = int(m.group("width")) + ysize = int(m.group("height")) + + if m.group("hotspot"): + self.info["hotspot"] = ( + int(m.group("xhot")), int(m.group("yhot")) + ) + + self.mode = "1" + self.size = xsize, ysize + + self.tile = [("xbm", (0, 0)+self.size, m.end(), None)] + + +def _save(im, fp, filename): + + if im.mode != "1": + raise IOError("cannot write mode %s as XBM" % im.mode) + + fp.write(("#define im_width %d\n" % im.size[0]).encode('ascii')) + fp.write(("#define im_height %d\n" % im.size[1]).encode('ascii')) + + hotspot = im.encoderinfo.get("hotspot") + if hotspot: + fp.write(("#define im_x_hot %d\n" % hotspot[0]).encode('ascii')) + fp.write(("#define im_y_hot %d\n" % hotspot[1]).encode('ascii')) + + fp.write(b"static char im_bits[] = {\n") + + ImageFile._save(im, fp, [("xbm", (0, 0)+im.size, 0, None)]) + + fp.write(b"};\n") + + +Image.register_open(XbmImageFile.format, XbmImageFile, _accept) +Image.register_save(XbmImageFile.format, _save) + +Image.register_extension(XbmImageFile.format, ".xbm") + +Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/imagecrunch/PIL/XpmImagePlugin.py b/imagecrunch/PIL/XpmImagePlugin.py new file mode 100644 index 0000000..a5cca0e --- /dev/null +++ b/imagecrunch/PIL/XpmImagePlugin.py @@ -0,0 +1,129 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XPM File handling +# +# History: +# 1996-12-29 fl Created +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# + + +import re +from . import Image, ImageFile, ImagePalette +from ._binary import i8, o8 + +__version__ = "0.2" + +# XPM header +xpm_head = re.compile(b"\"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)") + + +def _accept(prefix): + return prefix[:9] == b"/* XPM */" + + +## +# Image plugin for X11 pixel maps. + +class XpmImageFile(ImageFile.ImageFile): + + format = "XPM" + format_description = "X11 Pixel Map" + + def _open(self): + + if not _accept(self.fp.read(9)): + raise SyntaxError("not an XPM file") + + # skip forward to next string + while True: + s = self.fp.readline() + if not s: + raise SyntaxError("broken XPM file") + m = xpm_head.match(s) + if m: + break + + self.size = int(m.group(1)), int(m.group(2)) + + pal = int(m.group(3)) + bpp = int(m.group(4)) + + if pal > 256 or bpp != 1: + raise ValueError("cannot read this XPM file") + + # + # load palette description + + palette = [b"\0\0\0"] * 256 + + for i in range(pal): + + s = self.fp.readline() + if s[-2:] == b'\r\n': + s = s[:-2] + elif s[-1:] in b'\r\n': + s = s[:-1] + + c = i8(s[1]) + s = s[2:-2].split() + + for i in range(0, len(s), 2): + + if s[i] == b"c": + + # process colour key + rgb = s[i+1] + if rgb == b"None": + self.info["transparency"] = c + elif rgb[0:1] == b"#": + # FIXME: handle colour names (see ImagePalette.py) + rgb = int(rgb[1:], 16) + palette[c] = (o8((rgb >> 16) & 255) + + o8((rgb >> 8) & 255) + + o8(rgb & 255)) + else: + # unknown colour + raise ValueError("cannot read this XPM file") + break + + else: + + # missing colour key + raise ValueError("cannot read this XPM file") + + self.mode = "P" + self.palette = ImagePalette.raw("RGB", b"".join(palette)) + + self.tile = [("raw", (0, 0)+self.size, self.fp.tell(), ("P", 0, 1))] + + def load_read(self, bytes): + + # + # load all image data in one chunk + + xsize, ysize = self.size + + s = [None] * ysize + + for i in range(ysize): + s[i] = self.fp.readline()[1:xsize+1].ljust(xsize) + + return b"".join(s) + +# +# Registry + + +Image.register_open(XpmImageFile.format, XpmImageFile, _accept) + +Image.register_extension(XpmImageFile.format, ".xpm") + +Image.register_mime(XpmImageFile.format, "image/xpm") diff --git a/imagecrunch/PIL/__init__.py b/imagecrunch/PIL/__init__.py new file mode 100644 index 0000000..a07280e --- /dev/null +++ b/imagecrunch/PIL/__init__.py @@ -0,0 +1,74 @@ +"""Pillow {} (Fork of the Python Imaging Library) + +Pillow is the friendly PIL fork by Alex Clark and Contributors. + https://github.com/python-pillow/Pillow/ + +Pillow is forked from PIL 1.1.7. + +PIL is the Python Imaging Library by Fredrik Lundh and Contributors. +Copyright (c) 1999 by Secret Labs AB. + +Use PIL.__version__ for this Pillow version. +PIL.VERSION is the old PIL version and will be removed in the future. + +;-) +""" + +from . import _version + +# VERSION is deprecated and will be removed in Pillow 6.0.0. +# PILLOW_VERSION is deprecated and will be removed after that. +# Use __version__ instead. +VERSION = '1.1.7' # PIL Version +PILLOW_VERSION = __version__ = _version.__version__ + +del _version + +__doc__ = __doc__.format(__version__) # include version in docstring + + +_plugins = ['BlpImagePlugin', + 'BmpImagePlugin', + 'BufrStubImagePlugin', + 'CurImagePlugin', + 'DcxImagePlugin', + 'DdsImagePlugin', + 'EpsImagePlugin', + 'FitsStubImagePlugin', + 'FliImagePlugin', + 'FpxImagePlugin', + 'FtexImagePlugin', + 'GbrImagePlugin', + 'GifImagePlugin', + 'GribStubImagePlugin', + 'Hdf5StubImagePlugin', + 'IcnsImagePlugin', + 'IcoImagePlugin', + 'ImImagePlugin', + 'ImtImagePlugin', + 'IptcImagePlugin', + 'JpegImagePlugin', + 'Jpeg2KImagePlugin', + 'McIdasImagePlugin', + 'MicImagePlugin', + 'MpegImagePlugin', + 'MpoImagePlugin', + 'MspImagePlugin', + 'PalmImagePlugin', + 'PcdImagePlugin', + 'PcxImagePlugin', + 'PdfImagePlugin', + 'PixarImagePlugin', + 'PngImagePlugin', + 'PpmImagePlugin', + 'PsdImagePlugin', + 'SgiImagePlugin', + 'SpiderImagePlugin', + 'SunImagePlugin', + 'TgaImagePlugin', + 'TiffImagePlugin', + 'WebPImagePlugin', + 'WmfImagePlugin', + 'XbmImagePlugin', + 'XpmImagePlugin', + 'XVThumbImagePlugin'] diff --git a/imagecrunch/PIL/_binary.py b/imagecrunch/PIL/_binary.py new file mode 100644 index 0000000..767c13b --- /dev/null +++ b/imagecrunch/PIL/_binary.py @@ -0,0 +1,94 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Binary input/output support routines. +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1995-2003 by Fredrik Lundh +# Copyright (c) 2012 by Brian Crowell +# +# See the README file for information on usage and redistribution. +# + +from struct import unpack_from, pack +from ._util import py3 + +if py3: + def i8(c): + return c if c.__class__ is int else c[0] + + def o8(i): + return bytes((i & 255,)) +else: + def i8(c): + return ord(c) + + def o8(i): + return chr(i & 255) + + +# Input, le = little endian, be = big endian +def i16le(c, o=0): + """ + Converts a 2-bytes (16 bits) string to an unsigned integer. + + c: string containing bytes to convert + o: offset of bytes to convert in string + """ + return unpack_from("H", c, o)[0] + + +def i32be(c, o=0): + return unpack_from(">I", c, o)[0] + + +# Output, le = little endian, be = big endian +def o16le(i): + return pack("H", i) + + +def o32be(i): + return pack(">I", i) diff --git a/imagecrunch/PIL/_imaging.cp37-win32.pyd b/imagecrunch/PIL/_imaging.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..e4d59378f060b67f3a52eaac3b5fd9251001b1b2 GIT binary patch literal 1297408 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

3p7%OJPzdrRq$)K>Y(ccAS+ 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

NmD>u4P!mR|1Ue$dL1niu1=H6#xNs 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 z∾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

~4EMk_kcoTc*!1>MFrLWa4V>-2)l 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�*hi3@XaVa6UI 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¨ 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�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Ы88Li9IbhEayI`DG_F2bj#^ml;6! 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,C#&Fk8le=@|txmJS>o1tT3BAjv&9TZ<(?H(QG( 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%0AQ(h^U50OH{2_4Rv53 zRKKof>qh%h?f7gvuI{v5#=rH&t?{=Yfe!~I zx`Suk0^OQ+YdtREZ;x)xzqOKGA1BzZ^|3DaxLeyfONGd$sTxAxxhAu{UZ zT3)n}16z{c3cnS{zC4i-d=Hg-QAgY_3!Syn|3$rZo%D( zyVb&hx1QW;xb^zh+nVt;%WHnCv8B?|d~pciTx0gthiuTTPc@?$65C!gkkjMiG+i~K zM5&tTHFMcV!`NQ6K~x%+^9}c)noTv^sU13X#((I61Ot+g5@EtrPJZ74H-3#vjaN+w z#=76QSl8Fa*%PPcSWPl+HC3fmz;pb`XCQTnP)%jc4T2pv;?NXV3sm#C<~d_+^aru1 zrnv?RZV|~va;-pmc?63Ew*|LH+#YwEv$b9XJO(tZ0rm}>G{y$qo^*RQ4J5hF8yYOT z+OgWXlVZDC3UEw_2i`WhExKKB=ZibyJCS#)?({JUpdxfzdK-+TMEQHx4hS~=ZZml!?_F)!kKa&cOLTAM7bL_>n7U=e++l|dol?*~~FQ0ZD55c;_4pgP!ndXPbenyrL@AFC+b8@@YxkKyRjNxS%_??mU7p1=7kX zpFRRu+h@Awo%TC#sg8}IJ2n<
vnhuxjfuUGkOuX3g6?)P_>vg;t+2HjnCcRhn0 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 literal 0 HcmV?d00001 diff --git a/imagecrunch/PIL/_imagingmath.cp37-win32.pyd b/imagecrunch/PIL/_imagingmath.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..8e031db6743f17fa4e5b5afd5eb90b179847c53a GIT binary patch literal 17408 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 TBc@kOgZ$Y6pub%IM=kJQ7h7{q literal 0 HcmV?d00001 diff --git a/imagecrunch/PIL/_imagingmorph.cp37-win32.pyd b/imagecrunch/PIL/_imagingmorph.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..faa96efdc652db329625878b9968ef4a5e09ea5d GIT binary patch literal 10240 zcmeHNeRLDom4C7&ER2bi#BQ9#fYORUig6{6jBO;v1}rd%0fE18zzAcHkz84Jq!F>R zkeJF&P{szjCEJ`W?1n;4X*b=S`lRZcd1< zJ2ccg<@K#^CR^rrro1@~c zyA6~~l{)oyKqHz(!Hvo|g|P|h^mWMEK_KViNnxe%7#7jG>rh4AHpZGjJ(z&Z&Dbch z-TbU&Y#*eYvM`o&^V}GG1oNe1aME+1dxp8}pQ6>pYc>oz!6h1Vxq!aLiN6SS&9X3O0hK*y_drK4i({z>uC& zk{9ItZD1tZ*;+K>yBBTDQ_9%li^m~l&5gsQIo z#~G}}=sm?Tqtrf;u@)xH!WpUSj)l{>*!iDenKT8mwz%H;o@Pt^yAl2>i#VTgAqNdT zKg8^Sju48vR1LoFn6O0p36f7*hwPL#qw_v*VMgyhbW+tMh_362h3}I-!VH*A-n}&Y zEX`V!SydpVPyQKfIN-W^O_pV;42148hMx6=%uQoV9Ese|gsC;s8dYE6b~&8Uk^*DJ zIpQnQSD}M^TGp+c&y4Vl^lRYpr|RF8!|zCkXhpmwO&Z1EWJ`v3gv@^!9J`6VC-%6O ziw&9#SfnMW!nrN$PqxbZueeb|39j$DQbo8J<2S z9+N6b3+X5p%i(iUUQ&;CMGvFbXv2Qz$+%4!J#yGk>?92yr$|hKi%A98VjmUKBXWwM z6YGt`Wnw`L&cm?ha#$C2og2QpvX-3iinIfQe-vY|T$t&}P0@JF(Io&3$~ zRDVxXZ93 z;bHN(G!a|IaTp?-GBjbG^d#JKW7z?uOr$@9k{c`tMb=Cx4S{l2E(YF-S{9SD%ow`m zEE7OIiQ0U@jO|+PkhUR8Fi+Q#Qup$Gd)6+1y^~i{pS6QKOB zzXGO|D?nGKfa#?QnC$@AxlPv&AiCI|CIxEucmexd`aJ^SJ#So<{iBXGoneAQ#HriX)V{Rz-%4M25n++-uL|0pSHky7e~ZH_4%%N0ryW^_$>Cc-O`m-0 zBF2sl87B=!6@{<-+!IwaU2{FYw?&+kbu2tli6O%n=YYcN?LzgDv-F_Em9g|IFfX%jd3Ne43?_VWWM=9` z`)T1$aY=^#fsA0fIA5PSKf^v4%!vGWru}sIJubEe*8X_-Kc(f^6ICrWKNfG=O{KQx z#hut$bZdvT_EQ3s6@NNnIB*MiM)G58;`=pg;!=*XNJx`5pd1WmOM2jL$w}%X`AC*D z2grU+97Xw62kWoF;t^gW-P%vvem$QYJbeuueLNvW$(hm6LKC z4vDxVQ#scHvR$sul*2i4I9qxVY;|?@aj9G37c#uh!UX9hBFCixg=pwL1W5Xj(7N;g zj2>G=HtAV7?YQm;7HFhzP*vQ48R)3Zk3r&-Dw2+M8)@C}`Td$i+GTV(4`US*()Mf4 zZz0c#VSUeK)RAkN@Z-`bTmxs^i@NbyRiFDv0L(FXpC|S1Qc+=Her))`-3832l>cRr)6ra%(s>ja{oHfUy+rF(0+y&W&v6}Tqd|NqlUsDsX{dCv zMensxWnPA}MK$>Fl7|>;F2>f(7_Q�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 literal 0 HcmV?d00001 diff --git a/imagecrunch/PIL/_imagingtk.cp37-win32.pyd b/imagecrunch/PIL/_imagingtk.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..fed76bf6930db57940738ed1e433f0ec57e6c354 GIT binary patch literal 12800 zcmeHNe|%KcmA{kBkO2Z2F{wdA8S6yiYT`_0CWK@r2_%D{0VgB`BEk?dFU*8wCY^Z? zfkH(mQO8HrBKBjuYDKhlE#0N9x}a7ECWWLMm0CZ_7Ir_evg@OXZA1#_qO;#~-%Ngh z?RNLm{iD0y&)gs9+;h)4_uO;Oz3;tQa@#{JoiV0GP9zxHkD5{yFaLC**DyAH_Dj>* z^OIk{dcUUj^{X3v{;;t#6kH!_?l87A2LeISxK1#Jq=3;MFxK2!Z|n$qg`#QGrkIkf zugm-1!H#Vo?M!8_Zrx4+@SNO{hl9L6ovhD1yq?2;v4fZDi*{ z)OTL>38%mFs*fIS=kWBMYW*>Xm-$G#q;`+itP=<_DpDG&f~7Es#*Nl0xZTFsT3`oJKTq9m#?DiH zaazk*1LQCZV|f?%jf0KouNnuFo}BM^+_-j;C~Oh|KmHXIq#w;SsW)0Y8KGiP$lEM7 zGxoJ9K!GRAM7~IoDu^yp$=FIV2oRiC0qSw7im_NxC>&}5j?WcyhLIS%0eM`iB7PyE zJqSWR_qFIG-HMRMr7Ff2j03-H{x>YJ-@T9-;sc|pQ5H@5HccXDtC<-hz1p5yQ)XQo zYji7bC6GF`33DQ6JMYU~gK<4Irc8GmONb^zTLNXa@*K!yJt!mnnz}?z7t!`7BE5Ot zv8+W0I@n(Hc=SqLGTrsL)wsRYPXwoQ|;}o$^am zSue(hW+x;=LeeYbr%gkK$TkDZdL)J(x1z-^Yg&CMleHOq%*G5#a57_UOv#5YHg(0M z3~TJv&oNB70=({Xz5i3qeXBo+2p3qydEN!*&+2{&y+?EefE8121zlH6T%x?D2eb~Z zr+fp2uNQOj#ZV~qQ^C5aJ0@MHoI?+YjlNf?cR%&s$a__WP`(8n67M8*u?5Tk%P7YH$M0YL zK|*?8*+(PdZ5hgGGzQu-eMXvoCn$Ckd3Wqitu;2ZY|$Qqlw4?fpX=n<%+sV=N+x~hH! z8Q~4(0WeCuBacL-lig>tx?<3ZcPaZngU_YVe>aML07mENNJ1l7!S2R-H%($A@b!(< zx)TF;lenmBusbGZaje{@m`Kv{!R~~pizL#eCRI$`m>6-PswSAGFB~dKX*i5|lZHbk zdC9O0|2O;YHZV9Wewie&1Qw3;=Eh|~v7W^|k`|T^D|(2GV>3jyWojgyaxcs?Htff6 znMiLYIX6hK6gf9QX)sLW6rkaotYxu8juB0FBFBtsHL<#D*aUHHS11o)l`uVBTUyiW z*X`-6#(bysQkfH@a@H$U+V@lGd>&=%j+{YWO?#VHv-a^yx0hG>&+@A9X;hCrs5^#A zcCkGJyw>hHin_<8-*bZC?h_Xhi6gpPv^7k_c2nn`x8VavbbTmE?<2Yav}nT}(H%>+ z+O#V-#MqJTCjisVQDK?Kj%cm!Jm72OJxeZFUBgz_1?xd#r;2S{@!HaV zuX_1aEK8#NO;OwZhIFm6lY(7e`I}P4fm_izG#%I}(=NM-v4ew#seMtd@VQ@lqFmE8 zqw6~(;v}zQ(qz7d2DGscXnB1KqE8|x6PP$}EAPUmn&SIMfR8J+pF-dwZA7n)F48I= zka&X901MQ8XrP7%50UUH*#;*{vPYmLCVMtRGJY z%}8-((qIO(y0*lDZ zDJ*I`gGZ5}4?(Pa6)0t>ya4z2?Gq646CE0vOi}3Tr^6Z3^mymLmILMls zR>zenrx!DQ45ysZOX#>Vz>!&9FQX=Xh-uTQpQ40_$TmHbG7jrzVt_{3OY!hK=z)&f z;utvYP=P5JcNdKtI<-%ebhymz&RmRQV#Yqrsr$%svZU`miwN?$M!Hk^3^5YMxE2xP zYpOm)!~oOD@@0~GvsF-BSR5O=WjBLo_ef_}LzAs=qjDepj~fi}HwEyZNIPf_&UzvMQ?TIWGDGf1m< zJ5b%Vp8&cLOSK0mO1I9t4~}4vD&SoQsPFoN?mFcG1VcLd#5s{oCbsqJWF*_C8JaD- zhGk~$zpE5%V_Ca!PEfo{5){XjSrAU%s+@v-!69oqS$(oKc7R;%Ue%!6owNo_oV0yg zCX=w(dL@e=GkPThbyE`=e*YrSjD@;-#JZW)bbVkIF~7sC;}ol`m|i@@Jb+w(fZ3XX~+4{m6&v zu?M>!LnXVk(e7Pn^ibnTG>&k&6#wL^3vKRb_d~q*S<)l{y)XjG9C1CHgB$M=*ItT+ zQP=Z{96h2y8|zt_ICs3q^(@v~oxzpIvBsar)kC1ibsmw6P64=5X4i2^k4a<8u%=bC z@R9sHGGn~H@zoJ4GrUYi`N!eh6>aEACC(kl~plyn>10=YBcC{0!FoIi0WEyp)S^FDTL}$^Mo^2=Uv!0SaUKP!V z-l2`&s<-w>S7ger6Y{o`*j#s=3y4Cy>{9IhfUp?)%C15CO+rAzS|E0-Lwi=Ah^Av! z(Xe*vk*V09x9FqwnNl^lBGB~FjLnU>^{F0UT( ztik;V+p1NazxIfZ<_gvl-pA5A9BExz-!f4&R@a57l(Uh0S*~N#_mcrK5$0J)!TGogztvDr-^E5hf$D5pNb?Wh; z)P@VPZ_r3r|M|?&h+7!Usv>6t**AvV{UqmIkYK#EhWMw{8Hfz~_%5;bMr%yo<&7(_ z>?G|YUmmVPjfr<S#Etr4Tp=eG4k;kOcm)g-0Ep!0H-Tq^EjJ1DHDeqi`hYL)xN4o?UoJ4Y_hdxpn z0u=XS8#Bm@7S>?EYS`iFWbddY)y717Ho}f))RiEs?x8h;Duy*l5uPLypPuWS!%aVe z6Z<-jfjRU^dul-m&~S-8!O3Thb)SveZvgW(aCYlJkJd%=P}rq9UZmd&`O_76Xdab2 zX9a|0CS^V}!ewS(D)TU;wtLpV43C3`te!GMWVm3=pGBi<2c>u?5?*|(OU`&7u`YbR)n3N>KtX!dQTp0((S^wvP>T>zmA zX$vK7I6PI2q3vUws32v4OXr_Xb9bzex0*`DBJk>>JzwH`6x9lqWy%1alm!+gdDbU3 zYC%ILkdKiOj!XG&-;?7~}QL zf_UVcH!!IHIu1;rO*wy3$a6{R1B0Nt-%xg$bY<6D;*9&I}zJ>~(7X-oGh7zOL^-~l8Po=}%npc?^nU>H4Fmm$o^ zhqGpH2Q~YXy!)X~KVB1AV=vJ;(%qj`a|mJYhM`56^BM3OT@ZDB#|-=8hpL5+Ko*4p z)CD9CwJBK}sg5`)+Aw)(cAF+zYs!`zbC=ac8%#!dVJRe;IjpP z`eH&9up+%iES{NDz-N_VbvD?v*!<)t@DkO7_d71bBgo-2yvboO2#$p=Qz=lm-1xRq z{Jh-+*Lsv(tB+i(Uz$lCDDU7@;JpL9@9HHk@rVX5A>{emI=L!0aTL@zUeuQc*ulAV zJ{XFjWum=Y3XbF^$6#IShv#Zcxpao=N5Vk--7Wd{Q!|J=qkSaDM zL+HCQh0hz+@Y!WDLPRo}9U4M3>oOGpb4ft69#_LB-ts&W@5x(D(Uaczct~=s$pBC3 zzMR@5Ie9Q*6)BcySo=?%!OD*whjd=vs2+!1rmivh3sm_#zDRzwkROU4W_5i?tWpP~ z%8DP1T_$CW)w$pDsf>IvD}FqJ)l}C->$v94_U3r$bZagH5|+7S)y@ds40bXC(r5%%Z;9q{rk5Oh|#hK*HlTyQ#XNmblY5JpMh; z)DhsU&FZ(mB0qhUGx29~=%Ic>Gn-pl*W-I{3a(z(U|Lx{pT^+>hDxL2@PY`haVFpv zbGqJ%I8N6$0f);T(!fLZX7m+HzmI} z(wfoQsdT0-Tef)DVR~%XnxYq5OpE7pId}z<I0sMAHK=s> zuEe$zjte$zLX&L=ZY|*iRhdD+PZF%!y%s?f$$e6`V>XDqscl2zjm4G zuPONLi~3zNCiagX-*h=MY(gf!sqx3gjbEON2V!LEr-Ux9!%tuV4d7IM7Vuu=eaJ`g zt$6@74kdp_^Ll?^y||&MrPDgM@D6{#T3pn**~{FU7YF>JXN&;U1KjIr9AXiyiF*wz zNX8MuokbhZ`g|=2rc_382)MV$jokrU6>x@eV;@5t+X|d<9PSn1a4}{l$Bq40;Bcv9 z!{czQjIou#eNp;rjLBN&3P>I9P_RV^hnEDsQo8`(bl1;!FD|O7t!0OG9`|O?(qKTS z7ei8u2+M2Sn^i(jbx3Fy1^DO-z|{r=>pkllb4;;k+tL?@lRz-E5Yv}J=oG?GfmLbiBq6lfEreQwp^oN2i%=cJ zgdiyUQcV|oS?)M&gAca!0?B?u*!s<3QRrxZE#`-ztUxVxm8QlYZe9n76W99Jg_=W~ ztDD=~!|b+n+C%>4cK;TkzSbWW7l9qy2yJVGb<+CvLMWx>Ev{utUA5SH+=ltg;|Ysi zkGQ#0@c09*L627mi=p6VPdk_(uCWfGBP^h0XC8su&!bv1Wb?EHJ34{^)>yr4`O=2P zOI#M4S>=k|?rCnpD*J=$Jgriog{7-<{K4cP&&JkHEUDPa9$=6cXzA!=(=MS2Cu!W_>2zcc4gax0cl`pJ^rZ$s7RG`(r9xLPtG{dFt@HB_kZ{#x} zE~>FoT|!`^KNJjf&_c2jm3NW?&c6xqNhH%VW+FQXEs`jBCUjf@c|^xpbEm(sBTNCV z5H=`;dHun{c1xk9P&Lmb{p8!@2`=V5uckKecG%jHmdb2=yiI|B40ZllG5i zzE+bugHvbkt$utu*g)<*{=~&!zHp~yv(!877ukTuUz|)d28m>tlkM>|MhX>fUr-Dh z@u#rGINk*&g;ACn8Ff+QM6fk>a*_@yEE=&vD5@~FuGwo0G$W`b+g^XTv%Pt<5z!_X z+RXnh$7<2H?4|{j=M&umjG_M_Qagns$y^2CQnJHADbyldDz?+VNodE}WON$yJMn+G zJN#bJM}T(<^9la-J~0V^SEpZWN%iq@^$4uV?qF*xA|eMcR{hc6>qPn&B}F?vYqaTa zl$${rmOAOo6A<0${NvZ4q|y^%M1Jt8R{wz69>jb{+2w~>LrZ(|$gM`;#gPVD!p-mO z6awC5LRf0&wr$wp;oRMlxB!2`+W<0_!a;(%P%3VrKj2N7ZWn5Rc zk3*uVVfX_N&UW>A<69FuIpnC^)X{FlsT0NycFwUBndcaVKugezqslpFdBeiO(mBSk z2q$cA$1&)fvsnnwsjQeb#nBuN3mxm)Hygnq5O&UyLV>byi%;li4i|R#TSCEbuvIL? z)uF68+)=dAGRFv4_O~KlG>(@>tZq#40`LVo{=Y^cGK&b>8uLuE-P~*rn~#|@EZG*j zrOZ-qS!oe0Ke4=PdC&5Di>7#Hv8VX!#g7zgtq$ut>jCQ_>+9CHt!J#CTA6Kr` zHq&Ob&9N2P>^6t3+IEYr-nPoN-qvZ8Y~QeT+a9!i&-M?t*KB>ZQ?~OqjeWZPTKihN z-@e6ukA0{8QTr42=j^7E4@z?9E}eVF+e6_x`-$c^}QYqAag$epy{vpzP(cSlO@2-YdIMmQnt<~QRKJnDGD@wDSP$3Dl4j#nJ-I{w8m-I?pOJ1d<_ zo%PP!oGnhDGw2kZ-*oPB?r}cn{3qu>JAdOm?flf4UXfXGWyLiW){63qnu?Z+aK+Y& zyDJ{5I9PGA;&jC)6`xmJQTf%%>ne*Y7gXL{xvH|O^4pc)uY9rc)yk8V@HQi!X;Ep+ zdUKZ9Vy-aPnwOhf%wIR(Y3?!q!2F{5XXcaUG|Oa*!D6#iTW+>&uxzp1W%<74N0tH0 z=N4OWdGX@nrN!SZ-d+4&ake$j+F%V?AGZF``ik|iHO-c5E3+-O)!A;d`D~)?UfBJ+ zwz%!rHpO 2: + from tkinter import _tkinter as tk +else: + from Tkinter import tkinter as tk + +if hasattr(sys, 'pypy_find_executable'): + # Tested with packages at https://bitbucket.org/pypy/pypy/downloads. + # PyPies 1.6, 2.0 do not have tkinter built in. PyPy3-2.3.1 gives an + # OSError trying to import tkinter. Otherwise: + try: # PyPy 5.1, 4.0.0, 2.6.1, 2.6.0 + TKINTER_LIB = tk.tklib_cffi.__file__ + except AttributeError: + # PyPy3 2.4, 2.1-beta1; PyPy 2.5.1, 2.5.0, 2.4.0, 2.3, 2.2, 2.1 + TKINTER_LIB = tk.tkffi.verifier.modulefilename +else: + TKINTER_LIB = tk.__file__ diff --git a/imagecrunch/PIL/_util.py b/imagecrunch/PIL/_util.py new file mode 100644 index 0000000..6618c62 --- /dev/null +++ b/imagecrunch/PIL/_util.py @@ -0,0 +1,29 @@ +import os, sys + +py3 = sys.version_info.major >= 3 + +if py3: + def isStringType(t): + return isinstance(t, str) + + def isPath(f): + return isinstance(f, (bytes, str)) +else: + def isStringType(t): + return isinstance(t, basestring) + + def isPath(f): + return isinstance(f, basestring) + + +# Checks if an object is a string, and that it points to a directory. +def isDirectory(f): + return isPath(f) and os.path.isdir(f) + + +class deferred_error(object): + def __init__(self, ex): + self.ex = ex + + def __getattr__(self, elt): + raise self.ex diff --git a/imagecrunch/PIL/_version.py b/imagecrunch/PIL/_version.py new file mode 100644 index 0000000..b42628d --- /dev/null +++ b/imagecrunch/PIL/_version.py @@ -0,0 +1,2 @@ +# Master version for Pillow +__version__ = '5.2.0' diff --git a/imagecrunch/PIL/_webp.cp37-win32.pyd b/imagecrunch/PIL/_webp.cp37-win32.pyd new file mode 100644 index 0000000000000000000000000000000000000000..5086304a949f1d5b2b70fb96f5a13a890e853a75 GIT binary patch literal 436736 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%0DoWKKy|q(fHOALj>oEv*I#z>2b$8sU-| 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 z z*svUTN|eb?cU{b-22G%B6%hTbKDW9F2HgBNFB)L zxU;i3?(e&%ayjmYTxKrE9iwVcq0Z;Hn@<|YT{slS6`xP-{|EbYkU|?t{eb)oyPeG> zuF}8M=l7O01{6iVqKBy3%&H@`10@=7%;tX9nioGB6`MRmEEymzCA_ zHXc9Q+B>)-sY^v2QHE0)*a9g6W`KX_-=-x^X0%=i-2-}gHj>~tDgn6uR1H$Uq$<65WwE_3SdR8Relz=x-Z z8CQxK*IrQleF41p)!(UUX6&iI%Y5td!W?E?Y0S7rEX&z%Km9kxiPl5=v(?{nvWH{F z?{)8Tnen;r4X^%gc+Qyd-?DVhSAQSmLss)nUOM$Rn#GL2$4k1A%Z&frW#%&DyH(AQ z>hBxJjTx^RiWy7gO-*$@IA8spo%%4Z96y#}*;jvSQhX<*@V<_nO zaaAJt@1=zY1~S_3?j6Huzfs4E|Hi$~X2t*g?krY(asIn1m;b(V_T;g2Eu;Tliaj}S zK>W8C{(EK?w6QiZr3!eJb-XOgviPrOPd3fW*^_106_LG=Vb`}OFUz(kUzWb>+mpqo zpw8HnjaOZ|J-N;C1Yf&_uV`nw3XUs#^5M6`ZxL-~cpJ4N;%z)FyF9MTIGjZ}N51ej zz~8kfKdOC9XLe;T^IeOw(Ehi~Qhy_h^82P686A?PzA?>bssBbS%BTOzSkYjM@)Kmk z%fzy^#vh~|+i}D=TR4z;Xw9Cw8sUK4{ zL$cJreacws@D}Bhe`!59pQSEK9pY6+#r0WgeX25I)c4{R<fWb3z5hJF93s?>k~4iFry z-%9@ic1Uz+w>(I-o#C;WK2+N?9j9jL8j4zTA1Y5w`DDi_9%CIZXZWkzV>JE>Yh9N3 zGjol)pypYJI+fwBdoN?Jw$65kCH8FE>oZku*BE|pctPWH-P}qL42@A#*|M!;@XE?^ zlA0(H0{<_@9%Jk{i5ZJUnmCWiVkKCHQl9wsC5+EJqF}RZ6FN3~_)?YI!zMJ))TTCH z!99E-FEI_Tw_wa}23OU%KeTnk)*JJ|it}{Yxu(m$07@{-g)^bg<_sl;wsk}WzAHeW zlvgtUFpV|h_hd<*)hp?<6Vv)^#CCDD30a=m#dZ3uzl&Q|fxtpVF;!H-wlI~1sU)+D z`)^C19ol2+g4?;+qu(KYHujF|v&(+V%y)R>a*dRhv~d|2o$oRAQO962%vX*!-gfSo zH1nP7^jU8^*VAWfa`oA{7u08;%O6Ug9qcWYYh11|eb#)6oId*}|G}763=kfS7tqL zsqqwaoVUy=v$fgEY|oz!qs&H}GW&#kpUrrat8*Feh54=T9|dW8=l63zMej2DEDQV+ z_H*C#eWbE{l54e}>+kI{hgqIdFz?IMZKcGStJC29+y$4xgXx67pL&fAbT5?w+t=F9&Czq;-Oqi8os{3*&t_?n< zJE4VQr$mS-g;8)Pb;<6OFewB zZDbkgShsQ~l1lzcsj2C_NII{SROuPLEhiPRa+RcZoL1fxQZ4qjid5sv%A1jXTjRZb z_#m^({i4BJ;>T|N86sL<)APxO`7ESyf5e+ocu7gc?$)l66$d^8V++Q+=C!`Sb)xf; z1|~MI;`~X9a5%rO`!4ZZ3twYXSjOx$ooPh)ZR*P3@N8Vg(7zThs!rWqUh#;eYXal^ zgZ&2FW9BFI-@dB*A&YhIXb@lVcd~!ctp2sdhV0+R(*3K=^hq7gJf*JKnAO8~vVXBj z?*RN(X7}zLhTk7#`qvg25`LNatsQ25AN}q1FE0yzzrp-|^6uZ#{C2++@QY{n?wy_A z`j2Pk_ieA=w{rV;Y5Gf+Kg>I~A9wfWZ2jd@_TwbCzk9yp-SZvqp6@WvPVbC$`0Y5j z{QvBH$Aq-E>G|h7u5j1( zVUTu`y&KoUOS+M(o&3OM=4vP3RW&n)I^Xerwaykx#wIxEe8+9B2j|-am!%@S$|xwA z-MHz_;q>CWaUV!KoDR7gM?4GFKkRN?i+i7~oILu4v~u#V$WJHHv5YdQEj48>6^2}#3(zc@!7O+jb!8=~c0`z_fs>TBMS{_S6x)jt=X zDt;?Q$(s0Q!|~no=09Y1$z(Eg|7@;2AfRa?IzY^-roFM&QzJw32d2m0Y<+2@AHO#| zZ$~J+s3jDhxib`=!})Md%M)HLcASH71cN66jRo?@-7%K34!-H0jvi`^ z5sapX=-ahV@=H}KiHW28J65`GETIcMgd$&4D)}{O!r168>+uc{J-qJWoPCc*!0R4f_jFmu%Pk&P&sE`<1hJL< zq4M<_9*|f`Y#t0MMd z?Q`#49_nW<=t%!qm*;=H_Bii)#=9C;5)X*kacz3RiHX(i_pxU})EZPnOpaegKTtid zsTpz$@f)*7R5`9es@}D>!jDPTbCv3K;nWyGrKFT}tkO^#3eQg_?umrLvsi$OS%^0QS#J@h zz$c!V?yU7_sOmyJ2q6tm3F;v1WhK>8cvT-Cun-CT#(?co1F+?g1%(8ob+KKnoqsHr z=lG(Re`=}QkYfoko_a>M8`3O+3iM2k#a$I^k82kB zCbu32v*LKDsH~8AtKJ>j_I>UtaZs*k$8)i;x-FFWE}(9DvoQ3v*-CtB+dqv8j|gr1 zv?gHwK%gVAkAfwMd1n*FKdCuRhU#}SYaPEPe(Es=DdkV+$fOn5 zbAQ-6Aym9^(1j`_Sbc^O#@zf#HVt9-Tsek z!o8`344yXa&T9ok1Rt~@vbHi}tR7;mT_Yb=i{J>| zs}(=e;?}xLr9|6Pumj zR&tCoU`-vv?-}p192sycuZ}P<>4oerG4j{G2uDAk^^Z3^6&92H38gGW9+$XjQy2|v7esl%jdi13}oYL|K;QB&#pfY zUv;1MXN%(myN$XCc6Fyi;aG%M2rIzL`@2(244i1ej{Pjkkc26`=RD* zpO+{Kni>wc_WJ3klY2!X+xho|SODWP3AX22$*I}mc1EP;Fet71g6sq*EjxkMHDd$w zh3lS?u0TJ~w+1EcI$>Mz7^`+5mBc+Gd>R=}*e?1|Qya~X*LeI&nVf#K zoqQLGQQ~~l=@LZ0N?uKFp|4RATzo4hAd7}QrKztlv~8qBN05s}Rl;vM66QE}+bIPr z6AdE>fLE-Gv^ZrFMqZs#@g&7`WVJD>N+ z?Q5RTx9{r=jI5I9xiqS&t&~nu?9|UG4)|2tsTZ2sXz%40c}3RChpPK{IVDuI6gBEb zj1SWh4;gA%b!#Y*WSoiM771m6!-=)JHJPJDGb?!A>>>hIRvZRW;~0LJ94hw4A9`p` zf9Rnpf1ob{uK@jVp@*hUPs}R}J#Vrh^8;Rl@DO}mg zwbTy;Hw8MrQZRXcSNLBBu!wAWQ-ALXgdQ+4bb0fQ{S+;vToK_df>!dqoBC9!VYGeG zMcMt!o5w`Bg0^Yz2s&9zf5Pf8xIQtoZ60G?yr^kU$-`XpH+jEQy)vnKrA_^X8@~WT zm8p{z-Ts{0iKG%?!IZ}i|Rw6#0?-_Q*UYLYawAD%_gSSBns+jgcD!=lnN(i4kQYuSNG~` z6rF+_KPgh%^sFXmRzGEV4(i2C?!{hSXw6LckSRblP5Y7&#vK-gPD~3^m!Lt-IyY2C zZgHYM%zXj76I15UyF%Usk-fWBN8)o(_kx>fI;fDk8r1Y1HmGnxRj6oAH+QqSY;GJ- z2i<^C(lO(NXM|h4Z}U2}pBFoAySk(fc=kO;8q`st?^g zNqww%vVy1_TopuKq5uQw=;iU^qC{lG@`|G6`O$ur)m@G+YC_M8ci(hc5hzQ{@-xA$ zeD1rM6ov-OoBTSEDV&d@x$!QI7pxk`_)AHb0GZN?Rt*Xq2->;_X3Mt&5Q2_2?PXQl z&A`kP$ltfm!A+~Om9@r-e)(bU;lwCWy_@QwW-QP@=9Pjd_w0iZcQpKv)`P|q8xZZe z5@9kzPXiPRE@_vZta~aL=yj{Bp+z^1G_(hLt6#nQtJFA-&T@xzz4}_QuR@nL&n*jT zanh3#U{%^xDEw5hz+To0>m{#ZU+95RfmT*bOIOjS+=BVBezag(mN$=zw^F|FFDLJ= z*!`D*Ue*1+11un7MwKcQXyJyPOf;8fHti|Q(f^uG*V^rjuX7tYq*nTEMTd9&N^!+2 z0->%0<-S919w->YAxOe8>L6qJp{Qg<(hGQ#9~BGN8Od?*@k9Jp>aD(ckKR@WEh;UFPzo7x;04S6EWK&pGvodi$oKf%M|58*E)?Nog(e^d4%t9=R; zEX&kB&E?jRTjNzfHC=su>L#!HF!k)rRR3C5^=ehshpl>rW7?Qiy~~Y}8}q84>s7za z`kVUI8>n-8YBYut8qs+vLFjRQsm7n{TD4G;0gqRgKiShtG|7TXx0R`q)VCn@XVe`k z-&`i^9J9;Bx>3jm3ua94tSWXn6IUwwcSCg|`mb>J8imTgS=PeWWPG!%U41J5ep%9G ze7~$)8Cv(oQ9GB3o^`fLM5W&=?4Ga{y;9%7CPQ)4FxGT{cDik9%~9cB(lR?)G>O*_TcJf?5BHi!4=N)b1_ZXgJ(c|z4gPgcBQH$|;Lw(C5A z4CqGNxlqR06^O%>?Sx3L0KfIwUF{jD(U;svk$x4}fNawl-}z zR?P~ux)t1vJV{N;hCx@Urn5DEJu&1F=^O|U<`FPgw7Zwww`2Et>9tzm8XH<%B`~aL z=Mk~oGlOYx*5Zn8frd^x&}alJ40L8LA%6whfX#B~8Y*(LB)~rg%|X|2gFtZaM3!EW z;=T3~qFkscoghm7GyGeo7G$;)(EKhKp|O5y0_|yqe}{+bjR538qWRV+y>B%y`>2t* zRcvB6qfCOmMvh(NF2b~FJV+TPhdC;$2_xVdKt+z+bTNGnRuCtLO@!{()hBLbU7@1d zO1^%Hf3Jp$Vv$f$y?5)!V0v}=^f;m=$C=dMm>zfiTC0@%6dXO~WV+E~=(5q^6>S;9 zEW5VM;v z_+pnhzjL$r?b{vSS5KcmK7WD{j#ikEk(uOLn5|@xn9OJG1w5d8c1aUr?iT0HourDk zk^6qgDZT>v1MMMInXlAON$nh?)Q?H!6)M$2DmFGSNCR&hnIu2?`zmpQRQOt@Qlxf# zRH@UX+9xX2O{%f%{O^CLvc)Q~lT^!lmHNK&!Yb?V%afg(PTwV;np=bO=1(5LwE(kT z68?#%_G4-A6?;+GnrC3&yIxvyQ2H@gH44e6KI-&MQ)k!-cCv!>s9NvML`f06$wye( zZ)!<|x2OVXiHUE$H&v+@2u3VHl2rzL(Ljm)SV+RDbx1;S6dYznm13ll97F_hL?JWM zNgB#?!cYws#8P#Z4@v@itFJE!-Cx5rVLRX!Wo#wEu2Jy~#cT|q^B1F|msHEpSe^lc!@D| zw$2==V@N|C;2-*?HkoEh2z=Ytl+2$MXb9x#_W>a%CrK%nPpaD0Szw5 z(yM2uo2gHI$!kWkWlN@+0xI;IaU$yi3e@B_Q|LFd(VD3jEV7ze<~8H#{CzLE0ZHMP z`2%?~1DKgX8E#6`UvDluVFO(~E$ABAT&8)kc4YVger6TXUXs~`vO)I^T9U-M&suR7 zfELoeT3GIMf7aO#%Ni};zt7k+0_?C%r~6ato2LBB2%z;s#`nu~L6jhQ=qRho9hS=SYa8qY3jY0$2hB7lFgK?~uYQ;B^0E zndxKN3@A*K5@rlgM`Yx&;W?PT!c%);9GcP8rv9`y?G1aC$RVv9;!d^<114Q%*#&aV z0%kT4Uv?IkOgY&J_K|Hi6!vJ%{v&)dYm*EKSkz?}aQ%5nb^%IZAE+mkPpp}q(YxY6 zn{kehyanfwN1M#`VK~R##yQqw_r^|KeJh;fMOH#n+lUHXI$5%OI{{v}uhXlhgi@K_W zM{7qLfqVP%#9t6k*`)WT-5?^7A6 zBMB1-2XO_clQ40sp#+p^;UJzpM^!$N9Z(!d{Rzfkt zmp{&JA07fJvgC&nSVE5cFlyv5^274w>HSa>B{mzM@ff{!3p}jwr3s|W49C0-QR1Ft zMwBQtE}Gsh@LI?cC1j||v~oG3M2XjoLJ3C@D!-YGC?SJYRx_6;O8nEa8Bt;Z zEnP&E(6$1?S4Na@^3*kM59xxU#0***+IZ!0T5ePfm7irznN0EaHWQE|Bu`L@6DY)Y zD;<|w_O2Xp-o64f^IbXO{|Y(cqZgMWo?&gK<%nDRxT%JARR>C)5NPa+ky$tz5 zBIUS1j{Hz;@`FT5Uw)9VIL_pU=Y$HL{7{^hA51RIk{vGNDDe=I!zGK7COPDy!UZJ< z-HAGG>-myHiIW^`gxh{EjSil?pz~e0Yz{i#_3v=CaObXJ zd4=!X;m&u>+liY@JI4$1y7k9WXaZGvXelo)58eLi^3YP8$IvF1vPpfK9JHRXrDmC3 z_3P!KJCb&5_o`H={Bi6{c*a9qdr(+nSfqL||JnI1wo7YY;`unws2@FOwkw|rh3`!A ztItrJdhp@J|8B_vY4Ty)#jATt+7;eGi|E@*>b0|6?cS)I#&2i2v{@W}e|iwse;bJg zVV*9x)03sNdOKZS^=fE72I!?6mN{fYiXGNCc#-l(U@Tb&0AidyseO)rIHq3Z2HnH9 zX%A45pYO^;I$30=*yR4(1E4UNk)SxfF(mvWT(I~$&bR>s8wWr$cTt9fVqMp3?yf!N zj;dj?_)MYn-Aji*#)X=jeT2(Zf!~ksVVZq>i&0+e_*T!SoJ**4N~IoPgzjvU>U>lE zgJqNQ3yhh*Il`5DeyccsRBnA?JHI7?(!pR%y2Hdo5U}^C%$jr61Ws`}cj-Ge@>))%SZJ_Q)19av>jhkp=H4*l<4Z9@v;i z|Kt|n)0v{5>F}03W{-M@xAuk-|4D+o4sU%{3IFg`gonhu%;By19NzjL?(o*V?(o(J zDFLx99P;oMX9_Rn@D~1g!F%6<(_8m~$^QmVZ|&9Tt$TA%Z}FIWdh6Z`p5EGIm$b18UO|t!Knim{06B9$fZg%DlL{S|k-3u(8oj0_Z1)o5TL!h+ zVr^FCU6u42XWNSt$qdEsg(_8L*XmPqw(4SiW>x+vS2_L0RO(1?7etW$_?1t}s{EWP z$55%`Ug397c;R@B`Ru_V&da>5^IfycHrnB??eEPxEQ18@^q?_Zp2x(~V6~Dc2T7OGDR~!>-pHjdvlrFMZ7su~tA#1eIZ&zCSLqtpmwPT)7=TUr)J39&u2bcT1bDt$D} zM59XUye~$3$HRPSw;hSsA~u*iOJ(CzM4g1YrJX3q=TdB#jOlSMc%K%F~S^k-GGqqpPUp|)lkXOA7-#ataXZvSr^IFws z{4-Z&Rqt|#@|VW}E7ihXhgi7zJj+>Lry??r13DFv<(WCvgF&SSvLQX?Yf>wySaYvU zB4*EaiMExs7^qj6P{J~i^}Eq!IY)i%gSWd3=N0b+7#!)n-EpbEEU-#_xx@cbaFHXp zTiB){o8C0G(rA&bMsM~+v3Z760uLJ z@+NhsUqDerTSk`Jx7si@MU;=Du732>u17+s%XmyjAS^ZnBY@UP`&j*RU2`I8x@$!` zMEi4*B!KR9XpvHrtUcLZXj}bOV!YQRLvr=_{k_WTFYco9mg_pj&Mn;`inM<+J=gv6lv3ue z_?h$l4dt&`f3r%+OR;-)ZVAu6D}OTWxaRB!e^%z*Y=5$_=V%Cm%byIV0NbDaCOEG( z%hsja0j^ zNAtd@Gud=nl6Y9_nB+3;_kPz-teKGL@vJy%D=hT8Hf)_A6NfZ=IJ}_JsJ`b$=D5d3 zd1U<1qy?V^I99Uar)7=SS&@JI(^_~iPUjswlZide@6wKF$aLAa zH+;58si)m3BP{8NcHVHT4cF~1j*n;fsyZ1eS^y_ip8FtddE$SV9@BkGe{-#R!**rU z-Y~vS=IB(F_bI<8BmKVlocax`8m`B0PsTmT+(wC`5De0xnZ>e=L$Ek`!o+0&<+qMgZWXEkrJ^{=HwgPMr4sr{CEw-JK^;>;$g%O zG#&3Irf_MVdKS9>cFi6)LD}rJCP!!jCo+45%-;TnKT6zG>h?7KfU?LlF&l)A5iW-LZQbqbbu-kZUO72XyR6 z)D$Ly-%x*%rGumBFp`|c2PSJ`^JusL{dq)5ahzslDxujs}o?;l0c=K0Tpii7yg#q zeHH8FzF;Lt7-38CBOS`z_%cH>Ok+sn2)6oFbA4GJT7PCTP!zcS2f5L&lmw07a5Ttt zbapUI>-6K+>G$3jyjNi=)#F#Z9&2qdKi1<7-&;&)AGgjP_{bsG*+rpmT5q{;inX99 zQPxrVUCC6;OH4^%^Bhp;f=&IAji3LQQhJ@3UrG=p&1v{^NkZdvhr(m%4@<&2+0O5y zWUG&Ur=ef#f&P<%5d+__PAJi|I}$j+rQX$t8h(_hDXl(q&-JeU;wr!XF>YweO^l+Y}yUE4ntp$L+h@zCdP;g^_<@T=v_E@ zKkGNRVF^&pGp0cVo(c6Yz&?m6AswQ3#KsxSe!;xNnh_xIn8fF_02O&gC*oR1fS-@} ztiY%~y-~C*#Q|FZMjxHtTixC8$fAnYEiDaxaHE1m!B!#G$>u5j1KwyIJ{C_tqR|!` zvTbSEaMyVqQy8eFbiFu!*bau3IDdbgnkW%TT+U+K41mmb6%65&Pq$$YF*Y*fo%944 zdXC9D!33=!@8}hThYGY3tWQhzQL2%kF|Oj(Ew49R6(v~`*gcP12Cs{zI_Yhb;;y*} zt8F8R`&D|ouVfaG$2G&GXp6Rsk?5aFA`@7nC1>va56BPn%U7RB>t~5&9`IN2epW3>{ zkS%&=tGhCX9%*$Gzspv)mTzdwmsza1tY|okvDL0Ww&_3~%MBEMbaIOkD4yJschGA2 zq7NBWfKjKfVB>VAg@dG8^NFp5Q{rj`bf_EfojEViN`1!5!(Tpr(=qC;#*GEY!3aVHxN+Q4o}DG+Fzg*|zpJHvr4>g@49#wu~4i1H-p>k0kR!1k4W}S{Y0b_|%3bb+* zYP3#g&O}SsJ*AhtIT{_sp9qEyi#v5R^4_MF5}K<%eCJESp#jYWwY zWkQG_Zc>CpmW&^)Ne+ryRfIxhObYl*kX;>#x`Pp{0ypWuomB56rsJAd0t`)zn z3~$Y2%3&FHQJgP{$wjQN=0y;SE9XZ)m-_B!+_3z0;f-gf!G2PV@njEVN=_t@3Tn{yXE@UbOWYa(h)uJoZ+y9vE?dn0jwfhkTf1M6A3JRh?PYXBJ&X4!D zo(aScJ7|Z$kOO6GLQtvBJwn_cfVlg9U^cI3$&`5q;B^v%@d}4fgA4JNLUip+{)WF_ zEI`f!ke_i~8-yO7KZdR|I9;QVS)8Jxf2E;qegrNZyAsc$D4s?27Q_ddQJZ8Ifmf}ID;oo)2|REOLa!lBj9r~t3)xvpg42E~j;ACb zwW!g;t1ckU*Pz55V9}~1&Ecg(gfrTViP|AavPx?A+HpoX%f_Cea;Tq+f3!>+)X$Sk z-L>ip8`A7G`%PO@=Db?VH*7pB@)4!<1?M)OA%op*8fGh--dZ10ws~%WkSyvESWWBe z?RY2k+3`rO8t@KgxO`z zEPfRqb24<9@WmF54Jrc#JH<=SfyxR9Mkn#72-|J-SoA0+jr~(zGDZG$XolSQxr~7N zbX3zF5gjygT(B(;nC?)x${`a#v!&?9tufj$VEPWK8pv%dtVsm)kmarbi_C>tRL!Q& zaE2n*p-|CH%qp1ePProX`yr=p()`#wJXshj`V+zSxlqvxjpmI|(U+r5+`*#j6TX7o z!;!~%sh@w^qx$|frO`(@X|G-Y=~|t~zZ&o>#uRFWDQ2mJpw)0Um$T-ve6rP_4ke)9 zma~FDrwzyKerCexoiGMBpYNh)<5dQc)%5%rh;WjhQ&5}~FP}Bi6gy28Z5>0>?&4QO zppVxLsnA31%R`SmlK-86{f-Ddv@d|j{m9P)p@;SdI#9*uysZ^P32<15Mcy% z6F`eqJXC#Afzs~~5T`EJDfQ4EGCkAxbQ|XDps2}7(*HBUr?C>cmxp?JZg9;V99*7{ zFI3zwAEnyWh1SFci~Hqib#;yF(uK>Tk90qPK4LLh!!q8KtBZ-7O_(UD=;a0w8H|v> zbktSS){N0I^}MvW`p|lrKZrMpQ~h z;Zb}XcF}-S1c@zCpF?2{sF(!OSU7bo)fqkr6&aZ$N z#TTey`1TDe8iXN9HS!$2e9^VfW3rtra9_jhC9OU;NEs@x-WR(6LFZ0BQPWV}zJ45G zX@lRo8O7+^n$L-d%}nDzxM@@r(&C57X8wXsqbt??jbr{6x%sPQ{t|Nvv4xe|Y%zas zzT$o98PoKJKh9i)3vABn&f0`c4Y`TOZv^1n4)E#d?Z{2=tJnA0*?vZ`6gIV#k-QGT zm+B3JWd>*rTD$W2^3ZaI%=D#Y@@M&A-7^Icu6A>RIg5C)l**Z?b7@9xND{6lGSr8&`1MhT8BrS+K_mUT(qDoi68kfKAY6=rv4E;n4jLyXh(u)X$%;GB;h{&rBB=-h1=K z!TCW`wifZN+@0ID6_>6AQBO;MVMneru&=& zxV1pM4-l^S6@vq6w%8h0^Ckvp&Yf~|Ip{6r>}?n2rDY6y4G8_${+ou?uPM{PZ5H|| zh$+Yh=q!n| zjG(@Kz*El^fvLn)^lQLVG;|sw%S`f4J(nKtYw80NHZvV?=$p~9;7(0%Is<`%OFJXM zxWpQa1nv|JnJyT3q#Ij-5&hXCy2&lEUKJ4|y!zFKU(ou2^_8?D{?xRmKwYTlFu;iA znfc1=gjuo%CTyh>{>?iMBXr&g00|_Y6{s}?15NRRVn~60GqnQ&KR!EA=wV!RE6qp= z2*L{jMEghJtEfDEMr1UCZjvXL9?45v8f^tm}?q;pgw@p7{aSJSPCWi%~P~hP)G+YU`c4p3R@F4@tO7iL%06J6fMD8Bmrd} zi$DHKMK>rUya^L%emzzg`i-lEvscpp;`j4s3{)^)%y67I7U$e#=cCq>0T^>@oIy9V zZ8}cJ@?4+eZ8m^Fcj$q(z&!Q>+nHHx+D{)DV?aTG<@U+oAKk`=D79lm*>y>fi`v+8*1 z)?dw8-;CIfPy~gNR3}BZ7o+G5TZ{-ZXW7i03&D7$;bEFA(ZW=O`f(Kp#9wdrWFtc3 zOE%g8{x@MgZc5Y7ce1}}v*$b3-@hH)UsD7pvq5le-j6Xk@0yvvyfs<4ytQ{^=z)DW z`}j}aX-$T&BxB}?>>O}H5$r*V`lM9T77{7r7q!Aw=E6*pX3TZ#f%AgdyhFm(GZ?%c zmN~b5$MVn%7*WqMEo)wN+Rh7zMQf$ki<_8fql+C*Gx+`xEDtVbdd8_OH$9}nOwsn} zywun1$ZD?kq4NG}QqlEF)sre+s?;h{jZ2iO zRk@f_%Sh!}Dn=^0*jeZ|ot8t7e^_y|#omu^E|bIKy!o|_{IFmZraydpUNrTEf&9Gq z4?Rc1VEm`%byxjHD4}aI%-$Fe{-_2-OKdLNMpo3TD$tshN)?WzaCn%#=j_F(v% zcD?HL#)eOg1QXXh7YG$?v+BvbN|~V|?|b|a9@;iTEf37t z##JcWX562Zmg}{j|L3G3NqTJR4R72xlTmE@G<;zI(yHM`QyokC2e|i4e1YX}r{mUk z=I3qNBZ&D{3+=}i-g2t~WKRCoHINZR#Bi2>SYpcP|7DsiBE9G>)t4p;J^}uY7@wE- zmm2A5OqCHhCUv#X)=N-g%gHhBfK>^c6dseSPa3|28GtZ$QPo zDo>Te%B+*gP*_qd5_%tsKDyDlZhEX=wB04AbxEAAPrT!G`Z7Lh-9qW=nG~^ZokP^< zqu`q3$Xpwkx;4*{=pWzhIy))pI;%?t*S^4?l~@kXJIu2g7De6GCjFp) zlNzboFoHjPv!vZ7pFeUxUE&mjUoq;F+|1dqwT0;jmDA~^h(SwLws8kp)cq>y?TwbU zIvSHM?P}01$eCIqSQ~7|Vd-;zEjsi-EzhYId0%@yX^gqFSIZ08wX|3*Ozu*wgkE1< zEl*irvT8|swYXVe;?x)2$b1s%X&+w$*`@8Y&urG5cQL9hb zN(P5sSU{San?H#|C%P9HEm$CRFPk5-t82CU~Od=5bo zfcL#g@_BxV*>c*>nlDM=l|yTw)DkuU5j&Q?Le5*ZWpw*V9yzFq@UaRMJ$G%?TD<)w zo@wq5s(6v?BuUwpyKS!h9`n%)BLxMc1}}_N()CuflDFqT8Nat9-B@(lntIH%ox?nZ zShOY?AkDh#qXTv$Ss&wA^CDrvyZAl9+a)P8mg!FKb37e1YkeJdkEMP5+e?gMEd9_F zEHH2I!F_m>S%;N3u2I3 zumlh&^u{^nB?jQm;a703n7U$gSEdRLP@0*{`FRZ+U(FLc11AR=j$-uJpH38UN~c z>j9uPv|x}5wA!V^l4~ENhZtgb6C<^RfAuX0C!Ty-l$VH6X_+nQHA;$08+cL0z8+Y6d z(O%d6e7zH4?#He#jf{{Z7WuT>lmdQ<>0u509&)LKZDq|_sQjtPXuP(k+-~Oyia!Cs zb&Pw~a&C%#2(q}E*|TZc$7o55W6Aw!g_-w|-0P0v#@3#t;WM&h zJg@r&qtjN5;PS0{K2}-s8onM?P0C;Q6m+%WTVd}d@M-vZB@YgSyK3+XIKXfjc0I$7 z4lr!kB{gf@@dJ3GQq7e*6{A=~>w4AVaVptS>}otq#-3Keff5KEvO+ZMm}@U>Cko1c z?ASEEg0D1uXNvpkExu~_&UzlW#}Q9vL2m1P`YJJJM7%o@{E7g^<&5L>;(isR!$hg6 z8J&R$vg@8!MrS)hG;0$skO($uu#~tK9ayS(a9|OpG<-*-pT63?CAhOvB$# zbuAt%;9)m~pB5zkej~YCzqOdZt)~jNe(N3*4iBrC7hJY$G%rEySR77@p5wQK-?RLJ zqS3eb#n2HQ0nEll0{b*`9VfSL{To%fwUNK%SQNUfm%Hud4)@Z6+h)Cd&R(`;UWT(? zCdp3RI0CGXw;T3uy{}1GOdJ%LsbeK{+q8YnO6EfYxUTaimO(GsETgU8_EUlx?WV6QYgT?>ud?=7 z*5A8QiGo=H8fs0A*t%(pE0rji8Q5(Ze`h7{Rd#`mW3OdDV%h(NzxUDh;;oxrvWyq) z?+f<#g#F!Xf7|$L_lW{TlMljXXiD6d2hkMQ`3q<#Yv4U_p3m~jAq8$*mQQ-FoRG_V z&FeIWi)@$R;xV+>Odv>C(y$N0-r5`RB!Tn4HF}-%y#xY@FmkM?Q=v<*E4`nPT^|fu zmXdNO5EP1AsK34d^BMvH?}3052(BAaAm9T@1ce)aDSYg@&65ahIPmB5+e5(EM(0PF z^M6iz8G*q1a^Cni?bfC}{kexaG%H9$NQkimlhIUt`D<734-;J8yKC0K%;gpPLJvWy zB*J)NT86V7ot~7}@L`rqan~PD-tV7pd9dJ7l_d`_5WeVRoL!%=!O@5JY8<>6 z!50!)Uh9G?n@E%HPxjj_uj^jj8ArDaB)+VRh{K^7Z?GVPiEk8YTt`BiWm%%mG1NWV z)%~`xE*t14zeSywgD4q%?OH@XraCx#n14~E&2GBugW1RcNM?v-X6jGeD@&c>0W$vk zXlO((KD^JvO+LyXfq{YZ5EXn%NWVbq6#rnr4Ju&;THvPM|eBai4t+5j&fd8DBE zMlOZ6B%1(U=BVZyxzW}#N4u|Y#JeD4KP->m%IUP%P3Ih#H$N1W;Gc1jeruPn*nDhn%zII0H`NDvZ*>AQi)N?Foec=`k7LFq*6+ zJ}LesrzVt|No)xj8&#+ z%l)tD48=C{B5!yFoz0XtssbI|HS5m=1Ju#by2yTB3AARR%!S4SpZ~vZJg86wGVGua zAu3EO<6U!EEA7WdWD^=IR6R!*WykJ=)b^c%l9;W13FBM>lGlkaa4OZ-2^P`c#{jqsi%SVFOEc6>$PoUA>IP@cglkxLaMt#si~yG z_bN3*Z#OAbOls$LrNX4PZ&NBrD)tSf<|=QaQc+UfUsY;0spwrw)#&Y?Dpf@){O3wd zA(gaLrOJI%c@s(P{0~Z%ld80D%ar$J<&~0ZkNYPN-3r)rdM8vRXGk=MhrXUyxNoox2&@p{-tN?s4DI^*#0O`f7Gv|@QX zxSxTmG}=&jvjs5XV+ki!<2fk4xlF|o=H=c{HJ1|ZE=>Gc3!`x2+|8vra>O)zIuxFTSWz{e#ZfgL z;bKXp6x&dEL}IPP4aAO7{Gg0H7`CscMRc7+`J-6tgJdvYPq4lu z^KVHdVjpMgKTp~95E68d@J*Gbf|!BG4j_k~fk2c78)Na{H5{BA zjGU}C7*4ZFbKxWy3075CB%P2ZK=w;AtoI6{UW8}S^-BU2V;u@oQj9X7S~Lh&+8XUb z?EDg9()z;yt@6U!MMhtiexWV>a1=Oy90?OJe}yE`zpl|%YSnmlZQ-z0;}OhGw403f z1cQr2fZa*5j@vxf0e~gQ1Kd7g+5>2}_BisakY~x`R9DZ@QEX$p*U0yttmtd zWJ9meY|OhHEurd)tfd;MH%K~w`?{^Mc@KyJjJMQePmsE>GOa!E@`@b2!4NVFq_%nu zr0k>GIz_$t5<&#J7~l&P#enG`JuC};g-&=v144tc3YJw8- z6(@=HCdleB!Ho%!2t{@0pu&hlchLMQI#x9v>9lHm5($U{M${yEX_e4dd{!PEJ#8!@ z-dBy+TRkwsH(7Etd3hp|laHd`mi!?JsQbH0Ndl_;OQj?Mwfsk=B(a1oPZG=a?>ISy zYmI#21m`(SgbVGoK`owtCGpYF+2X{MNPJc}eh>RX@8`KNKJ^0}qJ&!O#QOb&Z%jKz-WYE{=b$V9SxOd?55d!Dn08(8rZ*~iqp%#^;&oHJWra{A#@W0SV}pBmY2 zYko%A)KJmvve}`ch3v@{%`KZq?4Dc9KKsDz8RJ3^6o0mbz7cGxU^a&JApOGPz+Pvc zvZm6-lE9&WqQUG9#G}^bh{hhDeV>j8nooZ9w1SO42&p=@1o%3u%FqK-<^5!W- zxzwxmT3O`Qzn2dSLqBV2zPXSN7Bo*Q(2=>qwn%|wtLCU57s}Va+C~;I+l}872IP_I z{_9-%)cI$(*zQ)Kq4<3*#80^+KC`5{_sfNTWSKxqb=xhW&-DISn_tzvq3ONzZ_m3u zKh^lm*@5^mq{=Ow8?L-Rkr zH#d}6)SBBcVf)`Hmd(L~w|LGt4Z--lg7{O3n+hL$EB^3f$%^*Gtls8%1|fu@GSyoQo3`>|y9@83@5 z*5K$_19J+Me^0lb$Bky6adGp^;zhSTJTMba+uMBU^WZ^)Pg6s%cYT36XkJ3|=cOLu zq?|RnA;1u*BrvmhK7O#p(bUc(`FZ&b#f;g8$ZLNt^lSC~%N4+>Vovbp+wYPsC&6LZ(_ZgF0peb+5>*pJ$nZNwV^ukZDm%+D1irrI*`x)ncBthoEsK$c8 zhASt-RBnCB>XG#ai}+QVpuc|l>;P+!ISLhx3Kh+y6Su?{y0d6FNHqj28Vcv%k~&7k zZtw+y)%<}w3kTK}rXJ`(O&P_wn*;Hg1QC-Puw?eV&)Wi)%6Okdou zY<*c%LqT4{)$uvO`$lceAD9_z{r$qGnFYPdzUO4yOdC4$o&!+9hc06oXJ;f5)|xn3 zMU_6xwVnjO_=x8G_;jt8`1D}K^uoZj!scng`1IoDX~kLKIC!f%h?+D%zB*X3x-d>O zmU9(z3ZV_Gjmbx<+c*3vFuk(6@5`eXFJi~~iw`FXZs8g~h5p}iYy9`YhJrv_Gbd`q35Wo)@nc|0S^RMP;h&TO|B5FcOR|qper4(* zJ*r^*fQmlW)io9utI)P9sY#zSFN8-d3VQpi06g)T5!J1sugh~j-oRn(cKHZ2Adm#i@$iAj}G<@H<7MK9DOiq z9DhG?bpClZ9vFRvkh3fCm#FB-pILBY*NAvW^ZT3Lyyxx-pu}yObhjEovfkn*_p>gp4N- z(p}zG_O-3ouDk2*_P^M!gTF|6@wz&A_`}ZAx(Bqs;IMsDIx*GyP}kEg4L`ix zV7Q-c_z2$AX!zmZSSR!D-o0e;t+$PlWv1;+)#_qhuC%{AH@7NNu6a(mUp3NI9%~)# zpV)Rmed_y8x%9aJ+%S7|e((+7$j@9KSkLCx)u)Q|Od>9kY~$K^eJVKies)ku{eHZB zeNHn*>8bXW*%>J}%-wTj~z13`@Q!nw_|#~WH48EpNO zdcELiywtAJ5Q8IC+qxh!C>j}T z`R%PF1`wn?_f}t*){%WJza2+Q0u?Qms~TgG-5^W@r+t2Solo5sP{W`)pil{H>#I|1 zeCD>dl0P?G$>cGY>s^j``dmY5johoI>yG)WS|S1-8 z&$Ztrt}o=sa#+oGCyyBg`^WVlvY+omW_41{_t5=9vITS=ZQd(BLrJREE=v8h%+IJk zJh}i5oyi=EE<8NCh?iJu2eT}Kz)Cmys&OqRU5lsJ1Zz^?9hb5UfRj=yDe_FMm&C?U z3tpc)Uoktbg@ib+8p>&&T9+!(U@(S6_ei8ar#Yy)gq8=Q>2<10NZ1Jp4NGYFi%L(1 zYF|MWW`NOjceybCU_n(-ZIbL~3Q_iKzrPodr0+56QZAaC z-Xz%&o%y0mfAM|R6jr4aVO0i@cEg6%6(x_?(pdC5UpSeUnBN~OKdjt}v*F2P%3~eN zO;k2YaEcBtmEcqzTqZ$N2Uke&LLFQs!Rb1Z+pQMKLfz>{&a~Do&1ovDQCkJYov*BOt9BumVV~+RZ~(upZ|lfO zmyWeJ2|+Dj`hEjpj%ie{F?SM|Eg$)3R)e~!mR0+loa6akoK51ixpHZDIToswf6-lz z^>yW6c9&y!Uinuts%JG=$6RHurVELf-HrWk2h1_F5WUU)*bd^9#$z>;=`gWoXz>uBSid_WPD1qTn6Zi8Z&+U*BDwmpk_MAa8kN zZ@s*^*prd{n4MW3HT&Y*x^vYghdIr@T*5Ns%EXL%sB=d7YUPgDg|m+-m7M%~x02Xt5_fz*-@v>=^jRwA#_KJnDE z8h@bI4@Sw#hq2nT^wll&RdDd$8_n)&Z{aNKqiHR}#q7Fg>}OTChQ@Z!B$BVszEw}l z<@JWMuX((F>FleE*C<{j0dnGQeVqrB+-Fb>L5|APSL@o5}c}o%Oq&(;0g&|sDrB{ zI9&%Qfm8aH(Sfuj7>LO8%j0N2~sA9x= z62??jMLAaRl=HpNcT7AYAmHT{Q@H19r(~ynn*Out`I5f$_oo|@?mahM=F{hE>UQQJ zEFi3*XuW#m19Q7?@zHnK?@5#glRv*8u^?*hxHDM)WLo?I3>NeiKR<&1sYJV=M1M(g zp7YsDe8wky`PqVx5(_Hu?6Kp{&&mh-%47S7f~rKjpwH14m*?5{7|RpJ0&_?CXO|}` z76fOh@`^;|6G~@FRGtzlev$L`AFv;e>hmIVd)F~)K_z^rxeXVnlg%A{Xuo@xCpzxz zm2!6&cUHPa#Sb@HO!SMK#>?^ye2)M!OxM^Mm~MpRBtL7yuOXCaZ&ES+p z8MFq2oxSV+17S{=SNuFOox7jcVia9E3`*ONKY(M`>=prcu!)=3Eun{au+INM=wSll z(WTI4iJ?{Nb65-IBvbj!nYZsxA@RB9`ioy-VNjyl;|M`2v5a5d*)n$zZirC;lURDI zEFDDDr;spCWozo|7A3wXsi~vrMn$TW2?2-uLa-41k}P!!4)~b$@faG zKzfF3aG2Xz70W_AwLUrO7IbV)RJs#&Y)u%8A3c%p-AehD-b9@*HCm`G1>DpeRQqX1 zKz*2)=U07+xE%lNGTf+jzuw7xO)~_H?Ss8;`qSpO4&@{&16&E(<^-lBL=sqtEsMeXswOuZ65QX=iD6T!Zht5i1JQRgw%nPBE@4y_Fq11O|SzrmQp@=KlcgVe-@^hPSR2!=)Z|lq&qviT_#!S~e*O^bwzG|y_ zmq%goiGmYb6(;bri;52x9Nb#mSI`%E)|~%dWPlZFWJioo+a@IR6TcQhIkJ#o8|Z)E zFJ>P?Xyd0!%~0Bpdnb>lKM!x{PaX{g2&e}_K_2xiEUQ&zK+W?fdb9_TK^!&E;+!!; zJS2puIwlF}abj}U+6GdgwkFv}c&wJ#gk$1@@;$L7^q`X(YyK2FG`+XdTB(&Dp?%1O_`osY&GHUmf8Gh?36;N~-*$_8$PL8_>d@<}K~!K{X=8(JRRbE3U&~u`k*aG@FJmioKi{d3lIc8p>z5(K?$RPH&?YHP zW)E4vuPCy9;cC7}Ric|Uw>@)jMebO>VPQQL_g3U_-m{mY1D)ySNn|Y8cdy|eOFRXE za=%D#`kq>{>CVZVr2{gt=|Beo+gPu|y*fOLR#g*{Xo7{(K-=i-W#sXSs%@Qg`XMsV zh`1|B{S|B&#O?dLIeP_0{plGMjAJ^wpG*)USdjXP(_}3o`UzeLmJyT&5iBJrvn#<8 zf||37LZT-m?IU(IvFjzs80WPK{p1fcr0kB+DKLZv1>M(CW_jO)~fR;i;@{Ge3)fNm8$Xsw_&NGT!Ia96-$ zT(rS}uw?c9rdCu6i@9L8?(_4*pURS02~-CME|td*Lh|Nn3@rnQtEO{zC>*B&wl555 zsrk@R;c1Ojw1V`)46r+p22^090x_x9R#rjVeh567+Zb4^1fDn!` z{V)YFj;6nya56w>5+7*@nfLt(!a>Ugk+nh7x|ASAwNUB9R0`(GfKyAPTNt8w-znmt zeAnwh3%k#>oz9o8$n>f4Q#R|NAv0uJ&wYl zQdZ81>aNCA$Gfr;VVBnIER)%Vi-l=}fKs;P7{NLu=8ytN*_s0^I^-uLpiGnp2np{@ zlzRyYAlbYlBydc$%XDS83#W|NB|ew>wcHg{qv|clR?1)m$hT~;Tn$Ui;F0;l`f2tfVL8(rE0~C-I9O80-@%faLQN=pR?*?LjHT5g`Dnq1 z1mE<-Yzut`J{V}Zbln8GqU5gWN<)PK9zq`X4*d&7@$D)=6Xv;EK*X~t1H`pF1*k1N zW6;rhvJ;FG6e2-AVkX02{J`;@M7+zZ)N<6A>OFJE(UG4?SC_Lmk@fVWEn@EAWY)G9 zTyeM~t^ua8+EaZaM`8KNe8xJ4;XtC|)6V-su ze4AM@uw?P!QCS1FAFqZ8&hitX4-i}{lu;29e%RmyLj)TM>Q$G-G2G^aQD4^8yXN@p z7N-5V{yoC6Wz=$-fd}`62JEdy#p%fqVQJ7^sxA%%r%$^O~SIlQ&Q~O`uF}2<{ zE@8LvbKp}fS5FSu=Gd)`G>#RU!9Xdp-bR*`_NXLmQ2SzM z=C^ARHV#<>vJ?xs-j($_)E7{5a$FPBKRiTlu&9aGEoA6dr2Y~%E)$u(&VVz{L34JB z3u%_K^SoE6n`>@^M~;)^vIiRi}ii zg__1MqO9YES>h71pyC=$S4i7>n@<>41^tTFn>)(p6oFt_NY(kV1p^*lO)K`_3kk`3 zK0`6I->;h{rwfEQ_GrX5m5A(+O#kOkXapnMdc#$-(xp1O)`MSH#iqu%%q4}g?-)+? zV*>>yhP^e!1r`AgF<+!GwrD^BUPs_9@p`BGG%^PB7lS$7*Om9m4o#sRKe82&?P5nr zw63Znqzw?grfJni}FUz3b?-P14Ci;Ww*+)`n`?{ z10Z-Zv-2!}J(wzSC5zt%U~-ir_6^{Q@$xyw%O!N-W8+0s68Jp;N4tSQj{WO@=AoZ+Ge*aKQ|3UQO?Fa_pMk`i0_bqf?5rOJe4p z3ASgS)KIXWg8b$lSSxavYk6*7>QbaFbI-h7yXKf0wT)+Vwxn&0I_XkzzSPT=Kks7R zAp@DZN^Ik_&M8-+bn{ZSt-Qjh9fxvBr{ z)7KH^|iF?Y>Dwz;O4c$|3w<_pDrNc)it!s7Sx1x3vty4|B~;Qy6!E8&C`A z$?G(>_yd7Xd%tkYcnw6NN8Pi|s2j+eoU;0(0tp6;IB|HD4-2IL*kHgx_o`4)mfy)( z(+I2wgC84g8iTJe*o1rpRt^E;tTy%LMj3BHedmrhHmVv!F}Rjn#3`O05#o3Xm&?(E zuDV`{W~q6qnxv8;S6ME`g>Mf}RFig7S`MQRp(;6)&-jrB-;M*5j67MPdc12XM|F5x zcx1?=5Vg@XwV?$OUKW*deP(c2#K=&l1sJld%jtaE?2ug-HP2lv&C-W)9?zjhiiu|R z`^+k>GOJ+E7>D^RACwbVvQ8fSP-zdX=*1%Stv^w zurxU*H3yg5e7cnB0W8GYlOpF+axHHa(tfE$kB_!~#Ll}sL1AMw4`G^m$Rlh8Fs zJ%Sog)|n_rq9Wp!ih^XSXh-&={164nuyJq2B$OiiQHXd%Aws6CN+gQDF24b-+Mwd7qqo>8yp%o_rwjV2q$2A-WQXAw*uvw;C|U)zpIqh+*VlR{I~qZR zv#pWC>n=oJyYFs~wwfzZDLPpsovpI^^H`j=YzJnto-Jj7Hqy0*t+{}JB^cJvV#i(B z{XnSzi7a8)K3Wh)w?{Mx^RK&IBg}XAUyxc0>VoU)TP6{XYc$>r8?T{AXZ=^{mBvFq3_js{&J6cD-3sVpNTtsvLfyZP}GPK&!Pe9V3#EFUu=s4IzsBsL8|&G&OLYB&_uCOEL{qUf@ofXb(NvV^5*wZN z0hw_Siv77lPMtf@gF&LVF}TOib)ph!KOUv1v+`FNZ+cC|!i6A;%4PEC3DxodM@7hA zjZSdY?R{=S_SQyF4r^N4o;+163liH{m^?NCmGA?OP5{kc@d4ZM=*_*`BAuWvr#I#n zQ5%Z_cm)Mn&!p88p{0b(9Z~Mo?gibl7;fNi8GkFbT0eK$B`glV)yn~ms`Qc_7);2Y;Uh%9GFj5%*lbFAWv=U{09;u^ZKOL?`{T5Y$UAyGm3{%Yo zDp|lKEIFcw%6tU~w8q5gJen2JdXjZw!L#O$+;cNNMA9zsmV@F&YyTM?YLsstlsLpq zn0upn->=DHKM;DBNIQU~Yt-s>(Xhe{f872Z=_`z>1kI;_6@DkPWXLuy zU8?ry3y~&M)7TroUNV|h`y$U!mZ)V*%&KRYE6UXGh!C}~4$x=Z;wp4vHzbxA%Gf|w zFI$ADExNx>zd`P5^S-YL1ZXkUhaF}j0(*ftxdaq{8$`m#i1RTSY9nu1AI_#Fft|Cd zjBZw_!{+=$d>L{*&ufc{GS3^#H;Y7TgXg;pl3jChrY|yZX%|3YUJ*I6ZW2@f;N1p# zv6tm*>S~c%@!<1&zV}XF8OTbL6v++WE{#HZf=8?0$X$gw zbzdGGYbdt{v@9T$Lm3=8V1W>j%~-JMs?roLve2ed*p(g#l)1F{73RtR)nEKUXD_cs zXmjkq;!jJD25Q8zZ{qh+3_{m6t^s)+{hq8W{nly5SaI)A8yOh@%k)vU6}EAE_m+;Q ziHocX1zQ%&dHC($mGMG~{ir^@zrLj_mql5ZxuY&m^)*eDk+2^Yaga(@El+q>%r&3v zn>@-Wfho%PGN1I^BBCdaBe}ucGgS(2{bz1oPRm)gH@~` z*5z0?^ZWY!PrAmY7R;#Pf} zctVP!!O0JqPv#c6WPxCAFNFDJmJ&x@qnT~W%7#T~s6=)PTfMOw*C2xJx_1yqw4hvs z+?o}XOH*rJBz_f)X>W+*c0K2p7(e?P-N?xqiE;Q6>vS%_iGzUCc@n5g-S?i(QvAxy z?~71rZt1V7Oa1+;66scA$#JV34m7M%!B=-Fu+b=C1&Qgx<_g{yE=aG=paWFk^Y~*C z+FmTZx>o0s?N~}aM+6vGeuh2{Sef#LJ~G8+Xya`8*$Cv_lC1E+061ZKXRL;$>LVo4 zx_a0%I?NokSS;tg*4jARDtE*J@0)KPIAPv$@PxT!N;laFPl@U$hd{&cn_f8z`em{> z$xZ0$?&vH-%HYFZV)NY(<+BU(h5QwKbPukQyfb=VfRj}dx-3Q{8h9J_oG=@xt#QhFozpub&XXg-_&iHJ`S-aw9AG{n=TrSy zliZ z?u4o(uLxrt@0#D2=#+(n{o^v4JJ>1f8TmKZDeDm@BnuDum#}5|pxB>y-8R;%QTF#M zjSQS7v+UU=FgNEXW$u!t4a>AR*AJwY3m{MoyOA5(lfqNBj(lj1=C#Uti4VWD>r2ju z$Ojn!bE@Va)!ZDrvx0A##=`bD4V8nD4z}IpVJ@R*8bzl($F0gki8)-Z7@^det^UV( zKoI#wkf3_stZwx)arx1S;pKo45IJdXnno78b3Ns@?<+(oqI7hB9egJ?UU0RbgrKED z)q0BADIEF6spg4{lSppUlv(XsT@*ReGNf0GL8*^XD$C>`Qpux5&7X<!#5EE6JPsN(eK?D8M}J=9 zude9<~CPLn^wP{X8Wvtel;@edF|*P0rRkH^J_;}axSH=eq}JeGKc~#TVghrdMLQ| zY+ViDCSFOuYOTG|*F^7mW@5`O>YUi}uhLCxuX7PfX8&1pMs6sycKbDA7x~Q&v7})5 z&$$0R1d+cNdMw5_sY5TSQ}PvmK)O+C$Ni`y;30jk7wvg?TVB4I_?zB^-R-|8A1v36{@iMB;fQo!8T`O=Tg z!1=#a_xebSB;|Vvsr}CP*RY=ydC8oMDq%woTqgTuTaRhnnjHxc%Q~{Yw{DC-Yo~i^ zgJgiTjoh(dMXq~X*gG!l9~Tae3x~&ri^hdf8rLyy0^l~_4WsTloZoEtqX8YA^G{diQR4mkapzV_6$vn01@F>^* zne&eB)Ti>3k)!7Pqp-tL>tyauzREGHkBafgC`ayW-`9j0v-$|zF}XiFXvc&P1a?Vf za8agU>l^Oe=F1ks0Mavd{unWreFxY9I@C~l#uG#gFSkyITPEry=`crutkb55b2WTI zrXUp*a`B&h*~G3z+1Ki7oX?}A#?mwHCnXzIou2U!uW*iROd**{(lZ{A&l^K=mNL{| znEdqw7m)KhfRw}fKVe(uRYPubb>MdfT||)!We2_SX;^Mb!lxY$6gtact>gMq=CJkT zLpKR*I<^6#nnj$Hs$xp62!)8mAeeyt{fCgg?KSzr*2m~qW-nQfWcgEZFOr?mh7TI? zFW-#uGskS^rFV)>#C4#6sajT;&zsw)W}b2v!@tjrzlvJACv&f^`zLW_vb z>r63w@~t`OqQ6-AaBdS`IWAJqjU0A8|3Nah=>l`dy?W_7NvmE84w^fNI^cTgaJusF zX!CPGMSw4UKnksWhO2*hBA3f1r1bXF|Awl#?YkuTtbxhEI1p{`@1{rDK1hEo+_v{z zjTnOtEtqR|UPO?Q9b%(T#s?IU?LWFDQAWA;-QIgYkjxjDajt$AN0H7=D4d}a&|c~I z^06--brNQA-L;2Plr8^{wNI@6#F8Xzoer8k3GldN@!&>{Fd8a)ykHiiXUDUgV690# zaDbMwH(_sFHdXhj(BAj}HPE{vd*c)60tl7ZC=6t$A8Z!N5Q!7em`~3TcOxW+;>voE z6xZw)#zBrm-lz3^qISUG#Gc(~-`6rt(@ZJ(^d^*jN6fxYbb#4%t-YeN74?&k4MJj_ zTiM?wB*Gy6=+zBW=66Nn%&3{F^{%nh2*hL9^1BW(heBs4J!aBw#+tQHcKpk76E3Xz zo1f6Q?3XQnZ*KEHK=K%DSbH6!M;}iyLD`A&iqybUD$Y?i`R(>5R?pHlyZzP6bcndJ zdPx+;MgWOOZ-T2wH>~Fq8fv(j?!|0^aXr>rPrS~74~@i0z{eG=?B8chRHF6NU7_n< z<4^r|5InKZXm_nbPS!ZtCb~hp>xoNrD~p(LCB77K$?j^Y(~&{>Tq2#VQwsD;wsHPA z?K!U!>&tu`*sKKBa_>(@UefRmx?0(G9qU3^w&^v%u@(}5v!f*dN4p8YLjv&rjETh@ zOyo~BKL*4DR>sJp`2hg$&u#7$z$XE`Z0nEx1NdT~J(hn$g{vm}vQ+`G7+lh*gu2)nC)QUK!Er+nfAyuaWsLEMQx>06Cs zq-#~VQF*>nF?{6Yh>ZT*_jgcU<`Zej^GyfO_mvcFe>pdDQfwy6-Iu0EUO!*K@Q-pg zt`pYGIH!CoS*Z0Ls!yBdKQ@~>t~q}gcvTqra2;c+Y3A& z^yfDHnR-r7Sx1hkNmuL}IeKaD$WbH&fz}1(hljWvISVcjkypiOufr#s2PlAJTjP3Z zB^&6W24JMwFgHCev&^lWjcN6tANYyfC3+fmJf5^47lxBn8Fb+P0DPziFkRCFtWb^y z$R30kWXf{|Ad?fkB7vkX#Y6^uTAV1f9XFyEHaAHDwsEPIJpFiv=!>|8WT@b03=_Xy zCtJyd*`XLl0LlsA0_PPwnV{#JJx2xg@YX(JBik>181uvdNdPl8*MU#RaYNZ58b@|-!hzcRx9tvUBO z^`SP2j7f(blMcts_tNE}RTaW=?n4~iS@IbakdORz?l?*-B1+BibNHm$UB4m+t^;(! zc1NfTLEoXU!ql$rTu6>In0-w2$q(xYBpx!#F%yZ~LL4W1ti2(84J%Ro)4<8P8#rS8XsA?{E1qxLCEw=jExoRzGog9z zZJS3+2+E?@hf4-?F5xORdqq+u7(sb)*JF^4?AB|hK}PRz{$rYCTYZt&%}w8=-w>78 zUW2_Kb|W_^kbcJt1z_q9F2Q`0)1`Odp8CxL{NZ!@j->RGRVt8K0z4YfZB6TVx|CAN zBhR(`Y_MXBBQZ2RPzrpsB701}Tp>#qL5kmjbr>t1Y+MXb3jBS<(c(gDFE<~kk0M9R z`#uBi?ZAc0H*;Xg-VU4;BtxMn_aS5 zK=cDo%K{h2e`iy6B0A_VhN@pOYOGh5UeqOGK1SDudSZ&8tFTd&Nv zLD%avpuuT?UY_TdN1ko@h1&9j;IZ@hwwauB+$I3lBtw1V1tbn636Rp~fLT%ijFUnj zQT;?IHYQbI7OmBB*t6hHFl@E@;Cu$4(hQmDaFZOnX2i>|+Vluvd){d+?vLSv=JxEB z@@eJ4doGgJ?{ylo1oTeh#erqd-sriRqPn%2Oc{Xp>=hJ_D=9WUlR#Zp7e6;se0(NB zfYoc@V5;XYU;~kX*6Yq$pZrnnjYbAqUXa^T4+`zbW(A%I`Z!q$y~x2X``Gu|yQjM-7IzBHu(@e;pEWH9Ei>aMrRAqOj`P+Mv@`?*N{HHM~OIUd~;62{J1kBgSV z6}U4L4cE}4w1NfS&<}W)5B)R0uO=#4w)+R^nl_I}GgUM$po#pK^*4&tE~VU;N0u z4hP!qR#RN%h|SI;aQo=+pUPxyB}XHN+b*$2C$@@(elU}z!`-X%xa>J=aXn@YxFhd3 z&rn~&Y+yq12UuWTpw<|wiWUxZe$Z?=OMHFV4pO&uJO&)A&26=;;ILJO!OGO1<_SH~ zYM6eUMfzvrHmcYKsm8l-;+;YT!*bJ$RagFEYj3QdBI2SZTERh6wv_V~&S`ShY`1;0 zyZG${FE@JzXY0MWK?V;zXBD7hvMT2ddwh0Em0Okks~Tv3GtKe_FDC#ujDWRNIL(Gx zWV4OW7rzqev;QV-R*wn_A}LX%oAbri&4=#{nVHsoRlQj7Q@e227(YT~uThVS%?pr^Y~1PZ~GzQtyh{w zUsqdaa?Oq(&>Plw;Q`jmdCN(Z4w%6F@h*-VxYG-ZFdoMV4Ly zFjlZ7*kG_9NPWJXrYT4x74g(+4Du`tDEn{KNYW~6-5|bLrpg{}`^v|w-h}avRILu# zo^NTm&76sDtD6-hC*wn3Y_oVj;!!W-|RLnX(JO^Vt`vEu2k(=XQi-3zL!Az(W=RBG@ymPEaVD z6kWQreLE)6K4jDo6*&U&yJVZu#w~d|;6u-T7W!}O# z@GasmmfDoSrOW|2fQq?lh%w=%sd5>lpM6|EDqdj|Gy--qc%Q>`wpjJ$ws zS{`|(WjOLelh}-e6OKVf6r6;uL4y@d^Hb6wMn|F6Fr#e?3Wk(x5Zt1}|IpkdfQ5XZ zZjOlC0bAlB35>B^YPkJZf}8f!@_W~(lf&%j(W)7+kP5zT?5H+7s)ItDCl|OX;Oxbg6b!##VSc=4Js7J5ON?bs*LW4c2HSDjIa4?8XqmVLf&D_ z$4sj}GT8iC*SqYn9cn)#omqE@SZlXV*WVlWMU3w>9U9IzXN|f>bU!F0@=j|wQ@wg1 zQ@v_@qS`3{XE?%ZO0+4rtQY-RtDDl+sYB&Lhs5ocx-<%8E@LR#B^tn-syJ<|^D$~P z=P!PRkQUyDr^#o)pF=_($`4F_tvnGBOF==9;EqwzQ{zaYg~|m-Epu?0db^Xk8MSy# z`cXZ+35%nJT|7ktt|tPFpbx!!M}cJgFzYV!U2(z8K*YaMHxO#ZH=DS3f>F67XE>kZ^Wim^BidH*QC%^z>diwQ6eq;7@ zK%u%ROBT1ulneQsUZJO4YyxH*x5BzK4Q1yxd20XpqwUAVc;>8DtB5zN)pJRWTI@#O z;H!tR#5l*6#*hrN6mNd`Bs(4*p$@>ivQXwUPO521x-oU_TKYVPJt2=HlNKVAUaVG& zOiC%T%@Vea0fdOy@FbM95R|Y^Eun^2%BiLhO>d-3Ev}ZN-drP_?4ImkMT-1X;s$Y; z?Fi4bl-cg3S}H|&#>_6g_9j~P2rZ*5Z(V9qSg?#f?9m1+@jB|zvT@QjPzMS4QkQA? zxDy?ZN>?QPTGBD-^Li>HBW+2*>B})YjtW(StUW<;K^ftK5$VfgLM+rGIx4TjpV!aK zF*`>k*JLqB@N$-OJL+euhhGxGrPb2sGIP6_4wtIr$j|w>y7+lY^(EgCE+lehMe6UE zzlm$W_X_#a9qk578zom3m!*wvokEf6igqL2@k0ZeP$O14*X((dx@}{f{e%XAZES=_ zs;LU~jXuwqGqY@Sv#EfF%1L)@UP`IMpI6nqasn_>w)vde(#HL~M@g!1YTBx6qO^Hd z%5(T5DHpM`^Lwg+yE%?VQ)L>~=aeQ6U4+K~En zktP`oC1lwMbwV)MSh0YFD6vIwYf_IViiJj=5z2%%g=l(g|VaTKw*62S!p2REsUqqZQ8>jC6r1%@5wiJDg7QPooR43GZMohWbUZSlOy+`$kCQ(D3ybU zZWf5X=Feaf#w+5(1RRDP7@p#Q0T4(oI_#rso!5!v1n>k5@zjC8WJ%o`mX(@Jq!_&Z z>7R*}>S2C?HY_oab9QKC21Zm5jL*@iA|+=wwUH7un`mVS37sbV>Lo}tKoeTS!&7xe zUZG3$*(&KeFmgx;^NK@>MSk|5E})E(p*zI>?<5=M;&H081q`4Ayo9EDTker|BprN8VkIFOk(iPGa zZ4i6wxSQpiS=jN{I?vHkREn0O(rwSf{ku0Y&ofv#PDepk{PoxqdgH1z)l6kFskOP3j!bNxr`C8;v|NQB1Y@6v7RBqhJYzN`z=Ux||3ULaYresJ z+HY5~rD+W3s|krJud4DSiV|x)i8VgCjh+rwGRrUq@FB+47;uf-5{6ingX)9$Pj~J` z0IzZ%f;?b=W_+`ang1jZt2~v({N^8@B(}kH}YCt)z94>k$2lJ zwmzEJdZA9l%Ik}=*1T;=^i~X&?b&N@bt=#kKKqU^VnIz<#DuUT?CXQ!0p9grYT?^L zCCx1U492F3mpa~`ACM? ziq2to;S49Jiqr7#O(HVs`M+W}{ufo#ZZ}@rw)Baz^503~rSl(oiX329xm4qBM+U|_ zJV((xNy%|NBj3-wr1^qqC0b=x$L~9<#(N5Fuj6L!dM=_e{MdcaXr}uC;JAFHSmg2Kt)@17eA+dz9 zE46VA0G2cEu;kpcC>f8Cfiq^ui!$%AT767= z+e=KNEdRrozHNJcbcG!6^^&ndmcP4Y2X`jx8?%}pVhUB^BW%~j%+Ae%0~lN6-Mh*; z$fph$98!6DRrmbx4CvaofJ3c%VaHr5h}N~Mj{r_IrW=7S0~1R5IjSmlow664iWs}( za+~4l=lMP|$c>Cp#=Jpu{>y1V!19mgw{r##ALIGJJ}_4qyC^xtsg*#>B5XNIbDQP? zh7gx$%w!cw$C|H}qHW{f#7B&@j+RA6x!piI{j-ACDAd;uXhLXL3tOjY009eC_^=e( z`tPb=y^uWS!SR@gHZ0O6KgYc4d1M}HeOU;WK{O4K_wT9(tekl0%!yR|IH&oBOe;;9 z!6w;V(&R|rU7|WKb&}XRp4-RTu!?QXK^ifxe(Da{}7$+&f; zf&8_uS<{7&?j&-V8%7P1y6l<8J6HxDBbL-&s$w7^g|x)Wa8b1)He_d7&1 z7}dPpvH!$BwV~L|ZJw04CUKWLahD-i3>k?$Vf{RL=Xi2r*10D!9DbgaS1YoMNr;72 zq+g^qR+66L=jC?FIIjUFNUsdsxVrBlrX}6aBgYu=^ZN4rU_G9`Hhmp#IYdnW+z}70 z(froiICiy;t8!l%x}R^ck#8;`HK-?ZKifX}aU^6mhPW5^%~zbQ>Ogj@`m)WW$+pli zrMQ~q;6;8nQNtHXXsv`0?Y;S{31te^haz0P1vFpIKS;q;!XTq)se#hQikD5Rmrj_s zHKHEnN+7)t1|wZbv##P$urzK3CF@PNTV~u(kOYW<&oUcs@F#Ljc~~dilD}R*8)o!6 z&&)0xMe+q(X1C-&=p>ANT_KT=WFpCQgum&?U(?lud^k0rp6ERBr3P4EbwN3Fc&>;* zG=`-Pp!Afb1HOg}28_3imyQqy1gDP@fxu06B(KMG{!4$obE{SiRsSdHe z#a%HHoV)!a;rz{4cCZ1n{=;;$2xAkk*KyM{vd!?T3@FdgUx920!Y@=&64w?pcBK)w zs|nJXQNP~{}7cR zr#k3or?X+Kcv1u_x8Y|`Z-+WC0>yL<^8EE6+C)-uU=P7%O7@NH~@m1wRM)Ty~iq30^b_LjCOn27F92qV_=@ zTp8xRn%~ET&Ygrl$%Xzun1s&Hg&5FhxzO*KgoF!aC!vsZ1E?e82wM^+&W}5}WLY$m~_U=dY)YXuXr#|w? zkw~V$21FDJF+#X$ynZB&4GfAtjI(??Pou$otLO&k6ZLrSn()#)vbdr4kjy!5WF^}Z zRe2PEbnrs;es3D-X%f+tQ;z0QG$R$scklTVvL{pLUXoXl9M#KX4reA)gldzcuThCq zFxFq^JQ>7k$R?3^Le?#D$DLkn%=F4~p0rUW5~scRbFWXW)ORpoUEEaRtZ2nwl}Cgs zJ(oKY06Y;*Rm5^;_i0@kL^z4qBoS(($Y+Tz`CUT$+^;TU@y{BMlVR=0We+?n>~&~6 zSd^KW{c(L9W{chzuTyur>%onmqwGD}O9pd)RGY;ISg(fB%$0E@=2N&uDE@$bnvNLO z3mrE_BgvNE$U>aeizv=ZXLe}+9p)x+DI)&Qe6r#rLZ>Mle=VMfhK4xCxKH<)<_w9kweoc_h?KF(M#l`~ z*}+@@W;Y0g91LvMz>*`jxAfqZSHz=+L$oPMbIZ*7DaT~6X`4Hlc2T+MQos@~ZAMmFdslR*1rcqHzX2ny59 zRO>bVHpnjuE3zTWKxUfI(a)gKUTi%kU&t!6uz40mlq#c(_Lo>Ybv$mUj7^zv(`QMq zFn3gR+{Bjo-D3JvlJM-Q;#m0G54ay zQx!}w===Sz9gY01r^-wmHH}F>ZmWIUH2j0+l4nKf5inus>~nxsHt8x`Hjelrkhbd2b$(Y z(3LfPN$M6VtMI$;foB?i(>ocpdkuGkx!VMVobr@z}f>G;j$Tu{{;g8jnQ!nmz+A9F7Tlmo4?u z`gm%m?911NN?#M~R)UY`GzKU=i-r3-osFTl+pZRbsv}aO_M;Y3W!}h06I!6h)g)HL zC>|1?$15>zq?}*qa;QY_sVBnn75enAoJ!ZE`uVlc0&^Lr9IDM8X|s-tpX8X(=Os8A z>>q?!L3hs9;t%Qz`b1%Vcof1EZA7_y5j#B`suL0bHZgD^_Hm7JZZLH><*QK`14I&& z{fZIU5g|27R-x)f*%}!na@T!Nz%q`SJ#qnw>>7l@Q`EHoomYecjOdsx;Zwok$)K)E zUf?wLZ1^(86q(!ld6cOBt$3k1dibOi+d&INVb6Ie)-EG&pczE3wT@BLgGn7Xqe$!s zrBM(VQF37lyp58LP~?z(Q?5DdAi5cbBq(Z(r!JEF2k@FibC3|K^@r6UOYLZN({Hp8Js>62|w?|1m`*Jevm%Q8|cW-!D%p+cclbY|mfItLqtV zXVm7FK4nBA15L7J%|@aqeVWC0nry0rk%&PWns9Vp&ts=9ktm&uq}U+goTg$H&sPDe znJF6Op9_|`SKNpQ)z2KYhBVbjybK24P%rrtC6VDtd@?oB6k%UZijgu=Wd*oRfxd~$ zBT{@3!CvH0+Z1^P3PtKr!iZ3JFsJEy;RW^@(GwN9-me=sYSJa`04)__(*rb20A3&= zKgOKKCqC1v0nwUFWQ0eY5gswUCe5v9Oiz?%M`VOo$q0|g2#<(z#UGU;>^udy(#*&{ z$AA#~5ZQQ=!BeJ@3z`B^x>G@JnL8TIo*UQ~qI#izF?Y*JTvB`>fZO33P`8nYq`Hm0(l+A1tN=4c?Cb(Ypcu-NiC`lo7f?6;RK2lP*7 z1-jkw%BcVG+6aV~BE9sgrE^U53y7#5w+gOaureIat_*lyHm03wM4B1XDXcorvfvYH ziKTpjTH=!$i4_u=Sr)K>5skz&hTs^8@nDEbDZlk=qT-vH6?DBr4}oD(^ohAAjf9EB zq@*}Bh(1oA+;B8Ko~)*4N=DPOpBfOLv@tiGq=9DPsh59)hp4sxM1hEe4J zm@u@-FT#;nrvqNmNJ+b$b*`fTBo3WW!y%m=KIbgD8MQ2^?c zn3FOF<3qYx!SswEB&^{k>=mxd^1$yXU5lR=lCO1)L&?tU^D2Mms$s8#2jeU>GZ0o; zd;S0SV@U&S9DXv2(Ut!HDQJQk1xKL9F2_C}3XrLtvHZ;1hf)3q7IP^MVy-Iv%XvjRI0KZxkBl$v(xj@9cNNa)<~S zM*oJ1*9s1H8k)IdSJt9p_a{~`Pp5v#iAmX%NWSTw{2p=3l5euINbJbuB1c~)$5|DU zV;`{-a>`N99XTfF0axal^O9Thi#WnP{V*cy=e~^W@Gg=xJ76xXA~<&}GKQ0xtlT0c zdF4X0n~?uRr&sH2e??t(O_=$@yaTn3y!sF;5v%-VVoUkdE_>= zk2~X~UJW$X&u1kiS+jnv zv_K#g>X&)^M!ta*;X!Vpi$8K6_lzs;t*f%7{nxvAC_0&T$Ia}1nc1CYLGOpO=zubn zww!M-hv;cOsXEo1sq`!{5gHn=w#{UhwfZ zMlau>1wyU8&68Paad>J-{Pw6r4#iZnPiuP~VbeBojZUtBY`%K7q!QXxZ6$?*N~|}I z$r@X(HfMW#b9+)#QKj1r7huExNZ^3ST&BADj=q4%R}Ue4sFe#6Z&gM*nbkmOh$%cigxv&7J)HAx{fW!1`@BOl4hvJlqA zYT(GI>kzq0(j}WyU&+^$+yHYI=e@3XF)kOi)vAJ#Xk?`ILrPjDC5mwkg-R1xk(4yg zpdp3v)W9*;BcPn+hEpd_73Ba)EhnTVs=M6Wog^jD;1!%*TUqcdVCJ|*1(lXvU7z~u z`+R`P z*vCo>fGos+y`1kBy;X=cKJPP@I_tNk>S8KlsziJZSRa15bs--_uNV7|wyBb@fqYIX zZ~1Z{@_O;N)h50N4><|f%f|Bf2<(j3jZ4Q8Qx+QGUju;^dQzXZOe|*jS}#gi0)))^ zx6SZKCnxaM(|6Igj%LrJ8TXY_b+=3uS|7joX|`DRnPJ)P>6U5445yrgXG!QY!|zFg z%q1MscM_f>0qB|G52=$t|3JL=A`^B*}wclfaZO(A^(AYl4oJB=yTSlF4bmo;w--74amwV)JM|l)Y7+P=u&~% zF+dWPua0T~Fi*Z&;n=s+;VDAw zoZAv@Ra8@12o3Tb8T)tRM{EiCGFw7g7i!k$i;A9{o>2N~9*{^pRs32;EgweZF=qcQ zdqMl}nTA761>zv!kW>P^_!TZw2_BZgJMIT3a<-Y*wYqT$<1U@X(5yh+w#w{Th~i}U zV%WiSJiMJL?may8{=ZK@u>Adhr{6Kn2UpPSxbkh#i~&ga)sHkocvgK;3nL$l7e*GQ zc2{ba5E8a5V0%PQ?P9OALe%9eU|6x1NAxXiD`r-QR<%`&eZE*UlbbVJF;%vK*I<3U zD(U|CE(wKxe20YYmP_9-zF*a{1C*2s52vu|g{hy$wf?0{>t8HRN@pQMihj_yfPkx^{JE0g0!cUffjZ?izlv2&3svgiEnI%%bcqbhZhX1 zrV=iy%i)H#e?VnT6jpa$XO{ASa9{H@JyoVc6hf+3kGJNh5u#Zzf|c{_--!Kei?ftrisB7k_Qy(p z=yLx!Eshj@R*SPjWIebSa}^?9!ynY*&>W^gG2OB|LJva9dbQLN=S}!z{M-c-7D{Iq zq%CpsI=8%1QO30E<7-mqIzpt(-?M(|2zBd9&$onfE<6=@on4&L*sOZ8Lto)3m4e)!1DfhpUw#O>SVu0&3b)UwN(4#x~2k_ur-l$O_#02mU z=@PDTu3Qjouzm3fY-m%ZEJC*E+Zi03JgUF`{W#gH(|tgz<0R#zpBE?ZI%S`WlZG*z7&QF6 zI0>JF6Q>k#;#BqDz)ARz!%3!svp5;m?H-2{sre7$#AzBh2|GBE{UwbP4*`3RA^aN5 z$l0_kVy@Z}5&*@R}-xfrLvOn>TZk%tKkeP3 zJLMoiRP9wq4K!BQ{VK3WJ+Qb%3@;IoAXmnnPOMVJGL<#zPnRovf zh)138&I@rdzWD^iz2mk4V$_JB2V}ACCCuciDWZYCIrB2fMI<=yOLg|rv3C?Gq|1k- z(|tc%27dMkxG`OJ8ZgOdpame6c(=C9_~Ip>w9IhiB@vd~S|HMTG4-q?+19Jbc+sdP zbu8j&+9HYn6hQ>}C99v3JD>vyDeSbHhsWyz&^>YBPh>_Tgq-w6seqL~!ctwTS?*;< zJQB*&OL_xg$)klOBc2*Lq*L7)VF_)Rh)VjOZg24cDa$7!o=^23NtxRZsX=-4795Ja z(0Ym7v&u&6G)|{l9|l`qz0L6;C?}1IdovBslxH0;MH-cLx^`F-Tci)vi}ZTrS0q&E zI|$0`G8=9nE+PtXuGkW)z@)@3nMgJ<#t5XI!19G6mdV{ps3lze_4M&yoX8b&;zo}8 z0R(f?5@coCzKqXs*b&v2QTwfTB-oGB#@AMRb(UATks;G27A7tUZB>c1ux2Vsj>nI%6j8!yz!}qQI;Xd zs@Mx;z&GH4ua8||twvO*M_$JTcUuO8M`aTjXK9yyGJorr$yb-jcZ}vO#d%-@uq#mk zj(MKvgU|87mE%7kbHk!^iMuX!nHV97F3s%h1K=by;sSvkGP^mQO!?K%)S<(}N8Vyl z0WL~iM{sSSt=#XKxJL}zhmDaJt`H?&t@E;tnc;0qsKIT+ihip8W-th~hL zz|S*O4n(|Ui4zeLq7-U^fO`IeeR*fUy)-jmP&sIq@jhJA8|<>HIh+ml@V%d--(qI< z_^gb!edkwk14}{P5t_UceOylRBUk1Q2V8bTK5`<3(iuW5*ZQq=v^C#48ExUm)f&O_ z=asg#=r#FJY*A!kF7!3Gl#`()+zDYD-Excgb$XiPJ4iN36X8Yare9>5M)~ZXl;Gi^x$<4oT$@*buSa)G=aU8Je3pP@t9C zz9+kGVt7>3F6@1Pe6`qaj2 zHLB6btj=j##FGc2jPf__dIIfB;Pi*mJ~>wVbqSY`u&+T4?(M61kI$%fQ;>H8rV+ zIrhndS8J>Ff$m$S28dSu?#LNA>{vwqsx$hWz9ZrgWSI*Wrxoqu9-+i_ka~nXOCwL2 z^Pd9JtF&kCAgx)8w;c}HFfmew}@*Mr0>*K z1Z0N((czk_ZDX_0P+);FIt7I3L)jedP7W{n{Xl2*(FtNs7>oSB)V&XU)YX;upJWCY zW%N7Iv5q>m**fk9CvBslyP-q36AU5J2!jGi6#@IWlv>t}kf3fuBu-GmmoL(1?XEtL zyS2OS^SHY{EBmxX`)6&2KS=BQ(o-276ws(PfoRcZ1%icwbWXW5e4!jcao)&{8 zJx*{_%T>K!vx}Z~f=_cf?v$z8^rl*i4%pAT_3f=!s!G#4xytUaw-VWelqp+sT%~v% zZhBLNcumW4G&`JAa=d@LZ~-F=)nC!{I(o7k+9s#vQV^0)f6oH}(&)#zhUYz(hjMP- zF?}l->`L5}kyBt6XK)oeYOR0R<#jc77gM?_wu|?RS(FN`^*@s((K4oueAb{O;AX{HbI z3%r_NrzjT#wty3s31PsRO*+~`_}T_OKG~X00{5BGmzDrmEz}aBV|5<9;@nU11pw)~ z3<}*iXNh#wZSlMud)pjwjwLODbq_^!61O&yXK!1Av$EAZ%qMoGUaTWsJ%?B6{|oIA z2PQr^j`^)y>r(>(pLYp~cwSyxd1M+U?WkFkCoeGvG{$7Xa3?4Rv@>I%GX{oF%K^ zM$bU?7&y-SJ~c`OrG|ub74P{e0+J1GjsfJsa}}})AvpmMqYz02e1YBW!UO{3v?bgt z+d26z4vXns!qRlgiS>B zgZvxd#d9HAxwM;1#q>-@k0Xz51z@HCq~Vp(+VC>OW-!Ug06T`j&kF#|?$|eM_xHaX z>$e_!f&xy_S2kvy7f&_iiV@a5FQ;Gs0)EG#MSQ;h(7=7h4?6YXi(18!nHYp<#`4CF0pRHzpm7)2l)rGv5jWVgua9? zLdK>Z$Da#QJjnC2`@r>llj#nIDES-?Gu%NTPa?t>IxTsK^SsZ91{s?T_(;-bsQ^A% ztUM#j%Utsh-4~PBhI;eXUJe<`{i--7q&s7xwtOPi?AFQbcwGC-XCD1MOqM$@80+8q zVX|=5VHR8adYOhU!*+omyag2Odrbj$NlC0*AeU5}-*%G@;qfEN4;GvO`;~pK$M6OL zjBr$~C?RaNt0E0#zC=)!k{uj-XziVBeNQo9ikW7CD8HmRki;bV(bP;6heSd{sAav0 zcIw#&H2dDNub<3u%mrN8erk)SUBbpGKEKq&xH3KkI99*VsUSA1c|EsDUW%5P*UMP- zB$9Fi-H3P^y+TIMc{K7EWKT1T%>dN0XM$l?QJT0^z*&h%1#G3B6xjvJrtDk??X+tJ zP`8Bn5)jk9kp|XB9;1XwJdsU2P9pty5i&341&F+Gps@CTlO6wed8LE1MB^WUsbWtX zr^}2MC*ynzP6|UOuo?9qm)hNlod zDk$SO&D@5AC-NG=N;&T%+4EgEytWg;7FWw&(i*#7ChTz}Renm@%K;j#ERfVn19NZi zv?tQLFel+#A$4h0VQ%9Wk%k)N{bdT|vFZx(H`L*=+OvO4^Xz%w4Bd+C`lb*eI* za421rQ`bPr08B$K;mp_ATM|fwJL=D!GgcH1XGCFeS5Dy{QaHKIUF>Ip1AmS)^?@7a z*XQ3(n4l5K_-RI07?E7dSBk1fBtz=!jjhmz^H(z5a|er#)+6KB+e^Lp1>WfTs8t;L5|hDnj|M)4Iqileq9}sVlCec zNmBdGXNfvAp#ymb`c&4}?UBg71o!pEW-wh#@#mWoxYU>s?8)QgftaFLQdT zz5XFn1m|s`X~W*6aqGrbe7HGj&Jr_D-Sp@~B-)%(3Kdmsf5SGuRPLFJ*WhKSQUP;; zxPYdFW`VV4SbIzkU|C0^#>sqSwSak#`B2D=k7zpD2T@2~?ra!fhG|U;h;e*J;it08 znh7a~>F;5)o)Ofex|P)^yPQoM^yHeQsBBQn+HYOU$_7{q$CMjc%F2!tA6V z7Ag7e>z=fR38_!4Gy+B#+e)>;ATD(mI32Q&S?X#}Tk2}5_mGKf&D9?EQgHPzbZTr& z{==Z%s^}t%VX8A(kD4rabA@shLr5ZL#V+I1sxmorzO{Zij(jwj_KE1gPc?GMEk38x z`)r(~J#8SjY|!>vxw&>;E($P3OA6!?B_$P*{@@k4jeU^?^zq-LFwLXiWDWJ8tUtqJ zRMQbZZD+S2%@H3@goOBEBt!zifk?bRGs2${q!6Fd|LgZ@klD)Px>D9`|jB0u@@ zK{rZzD0@dp4-Tr%iF{6zqx{HGe&i@WZ%BQqIr2G*)t@Ulij~#Py86tlM#*a5pKXJo)K zdj0H=;(^Y?7z8e6?@IOPwo}A@JN288t=R9OXv*GA3?4kFaM=&CW%;moiT#sfZ6^F2 zuTwofG&aUxXrSao^n}{Mji_SNZQk_=u5+ctWwj`IR|gPsJ{}?Vj=ig7OLPk{GOGG` z8I%LwcD!g+wE={_BqzHz)zf^50)-`SsmZt8%mIB9W}?rTFYy^Z=6;1D+}er0OYO0r z2;qXZ>YdozR@K{l0*&pmNEj%_d?0E*VZQpI4~%q0hMROHnu@-AMjy`dfuhqt@LPJ2 zX&E%_$^<83eGX<(RFr{#5gmwaUuacr$A&d{i&e#uMy&H@tE$u9k~}>aDuYZ5UdGtO zWYTqUgslh+*;xPBpCQmeUAetAqu}pIy&9N^9!wI>Fmh2_$u8a)=?A%?wd4@4bWDl1 zOo@`+?#q&+^N7u1PKMZaZICXEz7#suUW8(2w$IavOc9C>uv`&Z$qSqfxD+PJ#$&4>r;Rw~Ldl+&91&Xz1B8tR>=!P1p2!>h5SIx-MR@e?3m>S^s|;Rd+CDD3i! zSCF{j#&n;=9dva`gvz-DKEPW#gy@~Q);noB`5~%F->tq#{U)!Jw-`gEF%f9pco*Te z@`#5>4V)9-`!%Li$R47_a7LuuV()epl17b*eEEhHjrNu?@@3O&%8GVG-)(A>&e3V& zPfkg@x|*}7q>Up#|5gbYvA%}!T|=?HRVSpfC#FWINn0p_T+Lhl2Tdonv%|g{@y^~p z-)sYs5^>VJo&4ms0G^(MTz@yOd2y94mR-1tZwq%;LNs<^-b?oO{zLOG-NEV7XAga_54V?85AgakjB6r&Jq=i!2Sn*S zP=GQ7E|(y`8QgdJLb(HFa2o)X8~m=w%>B|BGc_G>oULAW-Q|=&z5=~ zL1t3(t<4;DRO=i2X^#*gmDc9B`a7d9U!l#STB0W*6z+80+PoE{g<|dY_RDrexAq^3 zKF{_#7)!0PV(+Z<#$H)@0osCfTW{VPd*`lv$9o|MbLTJWIyffY<)5`Yv35SJpXSJ;`e7@_52sE~n(Uu4D;3n^XOYLr&TLUQ&ZGDbl>v74z3$8y z_H2b?#rLH>@0q1ETaZSnzwd2CDfXjFGfDww+A_xS?v@`$R`WVt_UUZgt>(xRtQ-=& zK1bd)d!KeUwMrH6B#_!;+v)pSwMZn|U(#HW4xU5Yiq1C-1kl5&w?x~Y zrcZ21u?)t}i(Ydm?OM)h)4g;FZ5Pc$?0AT_=Adds!Dw&e`Ej1t&dFN>SaNTXkaD&v z5+hlQ`j;kJDUe8i2ZQ9~w&HaON)}q1cQ);SZ4NJClpw6~$VI7FeG@wX=0ZIMvriR# zRfhKj2w8@vK?k189Pc%;Jq}wpxpz z&XVNVfg}tc@SG%qc#o;8-8xOvW-*gGP7}9T&Q74!vhGysaD1*a_5YBO<9P{m>WpG> za?2n)^(b5lKCR`yJaSu;tLh@C@i{s6Pb7G0XdT%UHSK?fs zhl7I)?aIN}?7{kpwl8MYkBe1%>n_pRsDy;!=JjUBvU#Uc3%jod3=t(#<5P?!Jdkhf;eXgS^oeAr5 zhAv@53{9<1=_rMMk*h=HQd*e{mhLX|xQ6DQt)8D5O3mejntwHu(8LLiG^MK=I@K!` z1@nmpYyD(3=g#bmO7YkS99C`9{2%2A&xFx`rSB)S+$c{7k!6Ig=180*jVJ(^#+*4{ zuAE0Blii%iSK$)Hq%+4h*L%{QgXSc9UvK}Dkt*Ko`^}HX(Qh3_%O67!lORx`KwzFN z(GFmCJ&qpbTE zkjVU`o3XV&kH=x>UW5i8$KS;*GeoZe{8s!ULl)9koymrFuXT@{V=pzVW*`HZHnTqr zI7uNO`&E5RUp@UNox|ZF$X7VDp>qqGF8Ph|Y|b(f zZ8KhkHEvL;pCj*baN{qw$FnMa!_(tT^%4IQ?!E$dA_1>clf$v~r5w%<{)w5t)5q856s?>{x%Jd*8NvgcRH#&)g9HN_fFz~^(&r(=0=SBnKh>9<*kb5ri{MW&j3ychA{$a9LahAe0Y*1M+T}?`P#5Zz2;5}51oQm|C^?wjFP7eZd0g{t!AHq}(tN^))H+I6> z@RsQC7N0X?$V8R5QyZ}TSKC`W=PTywfb~=d#sXaf zsI7Kjt?!vVNRGV~1=S9d$wil%EGNHJxn}&3HvHXi{ZYa}sMccPpFLp8DO}+gY zvNZ7C_Z4WAY);e`Dud%U=C2nxG`Ry%wgOlC6w~uV_(?x^VJ@1DuZ^oYS3DteTIQ#Y zUsc$@(Gu_rM15HSh3UxGx$uBq_cQaWo#nYU*Tyo#q50I+GtKishVi^dy`4Jrxp~JG zIQB8%*Z3WEGL>fXeoge&>h|3|WE=T(s>h7-^KKMX?#iZr&wv{6qkj3?c`m#PV)$X0 z#|r3h8z1naek*~4vYJL*c~`7do6xZR70;Kf{OP(JIUNk-k8i=d{49UVtU!B35OPo) z)(8i*n(yq`ooU|aTZZNGAbBKM=n24ngRuiv^WUjZZ?tF4aNW(hclc#$)ZQ{Hm|Ni+ z!%Y1yGYw^!DFAXxV@3)#%=`r-+YLt4xxo2`R~c4${*=bR3J)&rfxU?Mb3}N?bg|o; zJmulMF4td79IRo4r0=#m-szf%9<(F5MGAmWXh8Qip>ANcxK_tz{9;ZKvDSY{G`}oT z6g>pk)wv7t9{(|52S?X{0t0UWzytEu-vaU&a8J7677E<4z;eC@&^fu`LN3_4QzNW} z%d9A%VG(485pn)_;~>h131*hX3ljPRBxfl$mKw792v>PSMC4XO69vxKa<#Y?RNEg< z3$d-%hM#MYga0Et=HJuff615^ezGx-aH{5xHzXFmRt~MEyF*?0iHEw#40X}}14AuH zkPJU^sNMO_^+u^93N+!v^G!6UYTJ=v^u9ObK)bK0Erei1blB#J%oJSge_(C6T3(#UD)^XSQOr!ui#*mfVq2kjeKXZV+iJ~zb z=>_gOm)AIe`bS>JcHQNJc9MUi^iI-StmJ=J`gzjZt)$G6?6xa$fWG>kah1uAK7|wt z+WVuO&lKa8hu_4T}r|00HGx&@r_+ugs1)rJWzG!$8ep%@JC;%Gm?d+gK zK46QsJAdILN8LvO((XK{ixrd%MtjK%*ayK{n4=x%x}c}*h;swstR^0DR&qV>sw1AV zzLsf6?6PB?ige4gKAXd}iX$!4j@cZ>RrGQ470PXyHc+1u(tj=)4@iodw(B}13sYg! z7BAa5Ca%u_kQ$v<#*a~JcmlKfPZ@d6pbHEOo^YQ`hi zjE6lfomVqPdmnOobYnMMYi)*ui0w|zf|<{R)}3Qh}XtkgI0U` zAPLZl7+?QV7Mq6O2HfiaoV;NNAncxNCYsN>?_Yrg>EK49a5)Qyo$&vNb%NPftfW~; z+vZ(Kd+vl7h+Bo9&UuD|%$KdgD_0||L=O_}9y{oOGmVSZUtCO<{f<@mjc8{b5D8 ze~y1`ndf%OrL6pTcWhU~*pNZi(<_Pu$SENdgcfHf}=Dqyq8NiWX+ZFq}(pQ>C+!0>UUh)dV5b5e| zdfnt5Bz8auNr+%Gmk#Hy))|K zlKm|gOMQ){dag51JN}5ZW)7>52;*y`+6mc`Z|(2BFDo;=AO%4p{Iql`D!#ux(|v*58<@62F*i&XK^ z_exH@+~Q6*_{d zpLV1bLOK_9fpc>oC3uN*v)BIWAS(gFDJNIzT}slA^lKqc%1CO<$MxeVCWIH(J#>v? z;PR;beCCwyXjT>HIm(uX?^1j}!Tjt!=A;f==gf)SaTR2Ic6g4v5;Fx4q}~bH6Rpi% z5QfxwQ6*H;%n$>pB@>GF(+g0h)5#D+mxhz zzYK4`?v6_6#_HrLR-}WlU1vJBIrlrOhMlQDb`~Pdu_m3gl3J|n?WZqESDGd16f2Qg zb_Q68%#u{$XC=~-#Co6TWBsuLH80@fnpK3K%))XQXD5e$vBWyTCiuil6zpc9!K2C0 zFUf!2eb>8-T2%fO&Nseu)|!W3Q0=qU%&+=R03#cArt9nBy|EWp)kk+b-oJ#@3d|BI zePQjO)~mY*?cMe(8ElKW=Mb3vP-b9uH}#HA4|mE$yWFKf6D~7HUWyK3Tt-!Qu9Upe zvLJU*;b0$Kbo0VnvOM45Ux;7rE^xX@<%@P8Afa&sFfI*F&i&7XNV8f{J&ZmJs7B!V zj^JUj<-L#nv9=GP=q^@Uq({M(U4JGUei#^G*;`yP-aTTbciJ(kIa!T%xW}n9A9mNw zlH)8!H0ttgmyh$&k|Fc8ZyU6I*8unt@D2Vy2j4%r`11)cgfj*-WJDF#bB|X8TIU(G zkC)s%a7E?7h=6k3e&vdxl9wSu_}hM$zqv%`d1VB{T(U7tz{Tb9jA>=|-b|OfDvlw< z6GkEljm0g9Z7{@Wt@%?Ug=px_e_46!e+hhaMP@bhM>|~n?$dg>RO_L1JlcQR-bs>t zuOHN^IQLR@Y2b>Eu6OKrU75>eZXOmgtUO<3It;rdee1R_SUxm?!kt4%#o3)C|}| zS0n~pX=6kNe2Js#T`t=H4X6gTv!c5Ges_jtSHdy;SM&cbGV=|+F+xkU4~WAGqa3so zh9lLDHvkU`;KBb$fZf^Vf@~xvZUMTCYRy>yMp*JAEXf!g?0Sv5C=h*d(lSHdl7gE=A%8I}YeE2_c^N3DQS1`_|(;K7DliCk*_>hu^Ico-h z3#Pz*o6+Rj&+mKv8FukG(d{L}Ulsp+mWSaf2)WjV60PpL?E_crv&xSm{;|sJdkrJ* z3B=Ic*KI#PkqNnPK#>^=h!p!{RTPs(B@$}bVbBY<2~M?!Yo*4jNTw+uHhBUy(T^zZ z%pCUYc5Y(t`n}k3=(3eFJRZQLF!r16LR(Fm{u8`DJT!k z#vd1U5Dd!Kz-6)Z><+O^l9Q<$u%7MGe!<#3bK5~VM7d|b54dUh94 zO5Nn)9THmYAJ}3&rzn{jwh(_C5%T%pRE!5jjTb0ro zW$o9MDj<(&k&54;)DKB*`ZJ}TQOdybvyoJMBvnqzg|Cv73ttr}7rq23 z7rwcqT=;7A*1)%blndWtQZ9VAk#gZ%O3H_8 z!U?okC(u;AOSUvs87)@fIPFS!M6rcZD}OEx&-?Ay`!9~2Tknf2Y)M|^kSJd;SR zF?{e@f2~tEkTskk43}Mf=x_1}v3FRriC2#a9JC|Z=mOTW`DQ=*JyFdWo6gT|64AV9 z1-@9^gF+OmmMHFVer2K+>_y+X!779pR!VIN1-znNCPeZIyG~S>fvODwqYOoTnk~h) zbfgq352Xq_@d5fn8h|u;yW$`V%@F!glV&*@LjByhPl`z63bQo!{Hn`bdPq*)kmFpN zYn5*;vk%6eZ+J(Am<`QehF8LYB=w zqRx%Fz8xUMthM27A(J)1`Rb5;F!ibzR}w7ttlx=lz8`U}?c@%bS(YSWLG9xgHK)ao@ZZwF-SvxR zk^{cwE0bSd|IgzCc@2L$R<{A~* zN<4ldQ%HL7w9?&B&zmD|Qwqmgdy^l4&pJ829wv zNcf=EdCs5ZqWeKinGGu0&c$6A0cgy%XcEOPym_T<(pDh%~7LJ}YtWM5(jf8d$>126x4_JSYy zlUwsVFQt0(dMDzrd7K^o0nT&}mjS0VdSOq|Ccs$kw^Jp1-7nh*E9e#0|Lcn(Gzme% zy?7r%j=7_MH*t%ZqGDd$E=CA5^4+zN`Hk~D?SzrS+0?MT5<8MW>J2Z>a#ZP_S0Khk zYr}>3P~U3L*V$ZP9g2{JYyIvDD*N@hh>q}bb}x*+pD|QE^dqG-rLl(POn?@D7xxUPZJNTdnT@}%q6R5g?aL{<>b2=y?;VL zzFUoh3DsZ_-s`=AS3m&P(=;Z_D%OGq3et zvbx8!_T1hJXzu)xnriP|n2~1sG9wSLc=ump6x)&F_`$)woex2G=$EE!p9j z>koPG!|q?ep>6VbY2(`^hpD?bBTrO#ONOn@MVR3}S>se-c>81x4o&{RnKx`?qSRY? z)9kink2l$ErQYUis~=-E+}AyEKnIV%2Ihb%7kz%;J5bz`mZ>$@V&@WU_+PS>1ptX2 zTp{b&Wo%{1IGv*yd$zvhks8d|eARYEx!s6!q(+}TUpEl^c7^;Ch3yLIgJ61hXt#CH zt{~{t*A)fG{7k}7S{|}qF#SyqLy3Qkf-CmvL*V|{ zAu{&^5Y4)^`DO49Unv^MH1YxirJC;75bsU(-tJ7%i`=5U!1JxwtU^%7c>ap?F)22Kpe`5h-RUCh5!1^kd!dL18{9 z%%v`g%Zv*IS8BIgG=ND0gax6Izn}aXs858++0QO&`Ze%K*-X-744|PncMdZ%jxlA& zxdivZK}J^vL@6)u&QQ_|onxz<>@~vFNo-_S^ik~OyG-b+g(|`uK>^~ z)4PrPxW!sY@$3(@)IzW~XfyQK0~AO3cbu`3=~)*Q)IBG`iF40E;eYrAB zCvX~&*n!5R#v-<7RbhW*16avUrC^rH^0s|EU~8o)WcP4zWEPEX822(!>_ArVmh4)P3csP_>Hv#&6DX;e$ zwiv#4-PtvFuOQ+hB_3!FL|P#4Ph zFbM-`gbO<1<*4V?UGrC5mjd3NQ!ktv8x040ACy3v#3ii^Cvup(kx$<1^V)Y6+SLi` z=ewy)%VKr6wu09*Fx@f3PpU7+TC-Q=vOD$agekKl)`Q#hGM^(j?9R$RhaEbPhygFOyGW`%cpeX!T-9zN@pbs$ zw|)W2P?9Z#H7{EDwXIy7309{!fvn^lOyjgXedtMOMt|d^tZv5KmVwIsv$#R7_R%An-n@F$qg0%%QD%E~G>`c8JvAi)R zYerAnDbp?_xNgE#R5a3G-e8xZQIUrUG_PO1+d507H&54i{^traglQrJaKO}uB#5vk>tmb zMM-iEV>c2p|&q}GjX`p%@G}0VVd?w2U2f)DjYADs94QezCp}qt-}5M zOdEbi+=Nt7zKf#8uY;y;t8kkz=wfRSLO$$jE?8gbKSX>y*TwRR6C_R{R|~CfK^DT4 z)B*@A`@I*#=_!6_f;#^I&=g28igkf+ppJ?!yTcruCCEJTgB$Xk;6*Shmz<$>pJIL# zP!UvnOWDO4RZmzoX3Oc@8F#;qm!I<&!qK4foSYsV za{(DqMl=|Cd28kWHb`vOGIu^W)0h);S;e90(LimPCCDf%L+*S6=@I7C1ogvAsR#-K zcS?OxV~bA*rj+M>ly8k?_ICUEXj^}mXMj!yznb0etQ&t-`PI41tb(=PKcYJG$;?Sq zWFjeS`qcp5U-r9mif^HjulHWFqc?Azk8T763w_Bmtaxp%+&XP|g4(DLu-1c++D*W) zGb!rCISsejZO=;Ti>BOp=iI4#o?I?#^cE-EeS8WoJBZK(aTqEX>~M8j19@Zey`(9y zpXJi$5!34`jcpM|8#e=4Aa-I^IC|9aTG0cdr*-~fC!U*EIkdKNSUc8t#^{!X;yLP0 z(C`abg(yAwT6bfKMk<-ImS9hWDhgq94krWGF|`NK%9g>92UxKErD*C)*##6Z+4rOL zFbgYAEgYGsCy&Ri`yL~qwwyV`o=z5)kP`bHe<@b!6Q%3g10xQtXrK&^7rw$C;GS`u zRkW62i>^aF$@Ax@hhE{xvG3ji*}o~bJ;Rc^?11(xTON&XkhchxJ!*QI*KX&n!zUL7YQ zRX>?vVeFBBHQue^bnYcNH@6$u|5zDNh=w4Z8G_l^56>O17e)2kOv?abZ^2*^K1$Fj z=kpT9ux7rG8@V_rlj8}D(<6l*mCy#Pu+p<-3Ym9V-1_pgxmOI>VN-YtMf}QbKfQq8 zN=l7G<-nEhka2~eHBRTk_JK*Xh1xj^lK2L40Np38rqD{akrM!cT5~YWH}=Lvljjnt z`l>qy@mA-CxI1ofT^}fJGsT4GOf%I$NR_tFI5(rZMS;<%x=j= z4d3T;YQ8A8bJZ2UZ>H`=vvoqq!JNI1bN#Pqp}ik`?wca;d8#L zwf>;i`bU)d1*zhPl=>B^)h3lD6*q5>= z@CX+!!E|1jFqAt&v{Hj$w;&}X)Kiq1bqr&)%OzJ0)@123?fxu@X34g|C0nyU7||!0 z1;WrTL@R=HRzkpxSD@-@Ju^!OGxQ60%bz9sH3h?lekG$Yr40QBMZbTXrQh>NxFjk1 zEgGTUqEY(AXT%nle!C6*8ZRq`sx$PPDG;!dKX>Ujcn19<&_X49Ss;-E^XzNX!(zo2xs1af?1;F zbNezG(DE#BxKCMiu^ObjyjkGb#qV<~ytK&i zetzLCo~>N%@v{@V#dcF!X2P$lpK3ZHU9Ek6xMc5*C5PubWv3X3LOg&hz$lGl2;9Z5 zk%f!gyH2*Q>*ObbuhnGAqu32$T>H;TnTQQs{0=2sPg&P>;FPtJ-c{iom13p@z=>9w zPu5e@{khY9CK0sfA$_;Z3uxuF9vr95h)z?geT-oYt5jPK;&#x&ZK4dFX0bb)hCVOUcZl-H%~@Zo8M(P_r|TLaJUheI6#c1;#_}z za6XDQjs&gyi#DWKvW97uwAb0&KY}7XrGJ@INp5PzP8+9;i5 za1L=Y=`!+y=rJUY!LfcdtXCE_EPB4Z^`lH>Yo7J4@ zNak0!bxPyrk1Dt>R;)>xU$@$rx2*;Vt``-}f%CKHmzojRiuB{?$V=mBf`;A#&TbyA zX1igU_yw70#@hrGph3X6$ch&&hmC8BI2VRFq2IIuD$V54u^%WLbY{hkgQ2xw%Yv4YNKZ zVf~RTeD%_Og^=lVm|O4n%#+r>R7bKc^*(4`G-$24i)9ps8%Z#or^?B4EuAX@)3~AM zFS^E|ha#)#qg5yY+gKy?(QvU9c+{o(fXRoM4Z*aB+~Y1Y1dTkq6=3?08_at8Mh~Nh z81tdW-Fc!xY~I@`!JH6ZVy zZcqueljpX;ev@I(fJ8x7V)N|v2o(M`c2Fb2;p`53KX}$SI^O?|O`DL*4X18zls|eZ zwYT=a&Tp~ZPN|}PMUbuX@XRkv=0XOO{HYq4)NA88k-9IRseISD1iC1+?i;6R-QNGY zJz&3Nrx=LB{x{%jA&vstqI)jerw{kvhK9mzu)uD+jE|6;AU8s;PQoUWHx)vVuo*#X zba4Zxvn%q==?>qI^QxS&*LBv?63II-RqOGNT+a^At_$0(#}UVKttV4H&t9&d;0ZRI z4?~xH#nDo__6I=Nk={WtI9%4t@m=^r#A&&&$E=msc}iGMp7f>O@zL$73!xr$pWmYS ziRv5EUvL{(O9Pmv0*31$0q+P2ydxwq_tkM0uf{3L75B?&w2C)XqpmKRj!2P=)c9mX zn@ZGlnZr}A-f!0+7>O;}rsU*j`ryRXOo$@>6}MnO!pdO|V@CL&9U^S!khOWZ zT^V;-_D-bzVnC$+T;vo>EpO!8rpyjpCt zSaxbkqdd4ihZl0t#f!TEF=1^UZ~PGJlvpj`zk0NMCd7)h`IcOqX028=#*gpk>T_M> z2^rX{kybni!QiHAl}Y+Aj|wudc~+i*fMQc2DvsoD5r%G)ZvpLe8kCUXOq|v|*5-N- zj;5X(@T@mZyA0vmZ(C2LTYeUKOrK=CMpN=z6#=bv_7|+p-0wwuC6dadYw&C)dBfA` zc>k1N^)Hk1;E6%}s=#_`JKqp1_Uxp%Q07T__IupelXkyhfYLVCINo!pZ@cczJX@Xc zbpUMdww`((5}RvWb}#n0Ua>tLcx_vd%aC*XEf;cM%JXdu6jUE@rfOrxhYwg!wUWP# z4>K0lQy$2@j%@oR#R`CeRm1)Q0Eo~VfM_+qIeya<&+}rxeEbmkX2_rVCEr2R_8hdH zQnZIS)yvhp19GRjr)-GqnXc^+epLeG=NJ-5iy@y_&MoP?!o5Khht zP)gS$_@jD~Z!@_NHgQ#9y#hv$T0JCbsy z)?bMapPYEkicgPBu!UxZ`I%w}4G$quaQS=n`@UiU>0(pV+^ znta*L{x_oSyeo&*Xsc1mn>ZgGu-}cciMy;Wl326DFrLGsjK}QV!K*d{RZUxSaxRz3 ztC9mIzLe`ZY(2Tl$4x_yV9w3q_yulrV>%aE+j@Kp)?F~2xo8_bM17+ERQO4}sXZrW zDqI8(5#&tNda~b_dfV5uJtrralkCh%$Y`SVpAEmdgsO(!;AD59xmZrMj6;@8r$+_Q z?^j_v>e>_6m1WF`k6{#?_-pNE2V@@ncS`k<>inNxf|S=?G-{YSF1>zQPR0mT4Q*w= z8If5|k@gf{^)go9_AyjxaK@=6LmudV6DR5#uJ_3c*>7El?P2|Axt6J+Qj~6&7rH|g zVW=Xy7$4bcx0ejl(pLl4<9jqz>^8Z#MH>18Z3*j1mgR7jkc3RgN1U4U>$ERsCHnCxM_u%0|FK0i8Q)pOFbvE>;VvA;!X zqOLsR%a03yUkDy3KQ$-0j{!UA!_>T~%?#L!7`fa?JUr?%)=Q~r1`N+KV+Jft=edIr z8QH68)Lef@O-D2dInpkHK~MMF*9Wz2pmS4=ZI}W8S6j2>4sEXE-R}D=?)q-HJvV*t z{*%K?eNEKtBdQW>!{qcY$P&_viLjmArt|3p8uei&S3{(drz$;}?kwf0NKdp{%r*Mv zBl$S2$JXsv{5tnnUc!vMKh9r!dXV#-OBI;-?nL@#BKV*d2DZ6K0L@QRc(^|7xNL-` z;)(RYVp^@2-V>>FzqquC3%D%(&bNW2kG+#V_ZmH>)co`}A0!unoK~U6(&2jF(t`2c z01@@Rvc|kwn%ssGQlG40$F|r+4XjC|Q+$Sc3yl4Ay%8U?ag&EP32=kE;Xgbrd~!Mp zz|_L18C5O1VQ<1jOif?t=1(3c7fA`n#JA178XyN5B2K32xaD6blXj}c<%HbwoHG*V zGrf!aHPYj)iI zX`aINYGD9MSl`hK&~kAUg6;NRuc9sCO+XaJ&=ZHa7+JS+y;nusgcBP9rpCY9T;J`m z4FxCzu|Y2=1C(m6faYkdoXqnoO(=T&4BXU8!1mP23vt|(GRC1eR8ybmit(BPjrym6 zN^8T-7ITgBsOcg6=6W~T9aj#MljgZ6Z}db7iu3Sdp3s%zzhr*9c~sw~S!ME5E(?bG7et z5nSWVV1_a-X2y+T1{tvi{BWEWz`QbpoQuXHhn@>Ne(g{Sk|*=5`|dxFEZm)Sc+=d-jDI7^Ez}+D}HBDpyY!k z8)@9*juaKxc-&%DaPKv(V3NNKj4Rc>109`0jXe`3lk2d;7S$At-e@i!;gBJ zX&RLkBR*w@-@5-E9?ed#!0z!E8fV;*UJ7hT_B@;foQlTLtTDD^ETFzS_gK_d%U+AI^u2QZ0 zt|u$@p5@@-J*Vkj?=gNFwEgif8I`}y+;qqH3tLvg^zwt7xFTk{9Nk%_p{>9(=z$*N zf#a`onqabf>x%4Y!IlT~0L1>5X~K%?UeL1K+j5gHR_k3=Z^z*Z^~ZV}?Z5K6wI-Tc zdg$%AJw)iQ-1L#olf!&nO59E{*1h%r>>e{_^ds)rjKHTc83P}f8iDY|-crrS${^+r zmrc3TyXsSRitoQ|TP-t{=V_S}Xt}ueyfIISV9T_?@C==>NJ|{C-_jxbu&vdYETuWuJH?IZ15`3aeYKWloKmdY?9bEo7=Yh0I z-F1a+u+?&H&`u4{W>aX|{hlyrTE9$6j0c38GmDr!0Wg5T*;4Ccw;E_zb{c3eyP{~I zrBXJ}L3|84{~H>~47s&loD39l>a+1Qe5O`j3O@aecT|LJ#@ygjz*XQzwyS5+XghX| zzhMrj3c!0u&bvn2Gjm2XfWMuc8T#3!))LcjyOX_-Fj-C8HwQI|dyK_?mZZKkmZUTs zftH*6>Q2ivpWH#_pW8CiyD?UY=cKh+g!x~k-sA&=BR#pY@*yB?Y-h2PZt_@B}_!=jH7p}-hE15jL)n<};%{&m>_HQg3vvRa?;~E53!3Zg=r}9`Tz_H3J^T9iXS8nCzbdo-E#{FSQkTv8*Cm&4 z&P;OAI2NYt@-Dx zxBK`tuz$=Nc=u^*;4eSC2L60>?XuQycWDEq)JMw~r>%#fv#y8V8f|mzdWdbMcEAku z2tEC7>tU(kuo-qggMH@+yFYC`)bRYrtcTxj&#Z@uEVX6VLt`KM?}GmU4dB0dJ-m+E zzhyoAeSILi9-cok2YZ$Y^JftPvPjtcN{+s_#gE z;o#LQiNzmY63;UXep04=t&9`1D`SxRBnCa7WNoZ+_ZnIo3;A|}#i+`xjeqL~5DQhJ z;VC4y7^sT)l{0+_P6akHsnz^fz|2x?J!pc3%n44p(|7M2yG)w1>^h70!FY9j$FAhpW?n!Cy8IHpkjy{c>Yl$r(1-2%rHh`2f$R+(ds|!?+A3 zH2a0}@8&qOb3J`1Fv|B#vyaF2HS{Kjv6+*hl#jdd1>wqa)&kt`x!h*k9yf< z7Z~9jNAc*;vq2p{$~nzRh^dH^kPlTfLo1a)#?8FHUwf^e%VdVV@>a+DOMpNvBlS&D z+W%vzTKw6!MrkVZI3L$3uOHqlyr?Lmz=Xf_*iJb&_gS-dRy%*AuWHSn z-%eGzQSq4{W4Axre0v37rQrSANvHonYs>XPV~5yY;fFKxQSXxP*LYE^Kig@yNHwtp z!jQTepMod|*blqjx{(c%M8?5|c(yJ~;$FM5XB26G8 z1ZlhXDlWxZ|Jur-4^8WW?9AbP1Ig}O`e4+pjyHjLAdP*{P8v9L^Owr5jv=tV)BSi2 zN0XmF2OzHVeeZ*9<=^(;A7+MbZzIFtFNN^Dbx^pApW6eB;7WgbI0YN(UrW~jcs%%I=gl5HZiupg^F2Yr?kBdD;e5~xXKLj+iFEMi z?r>_G(+x3Z4+)Y-O2vKSx)xo@8O%v`W$5U17$|OAhvt?rJ@(>>D***-jWti|3SxJ7Tdkz zZM~%zHPMrvp_1Qp4ReqX=HMs6zmanRl>XN~o;?>J*J^%%_Vx9&eeLjY$p=s>z*UKa zWbyYCskP1i$$Hwq!UXjUVbxvtZ9cRh6F+AOoZ$D{$|I3HDTpVq(NvTpMP6B!zJHoJ zBG02WIgMW?w)+&=_*}c!)BjVWF#lt_ouxkB|2j(YpRj=QFqKPUEmNChQrQhc<<3%D z=0d;p`b*JB%^or9M zLbDKiDhM zk1#ILzRwtFod9jd247c8{gcqBIAsOZ&Y$B^7h66l+T=db80KB45>&xGthX#9FJhPJ z+#7dR0`Y>pR$lt8Kqa8g0Q999(5rc_HK4l?-;Kr1Hvn>$@_>3icFAsKpOt^xm()r? zx99)vEEiCK)^Deb!DS$s&cQDUtuvt)`tcW&CNW+t}>~T8I(Fffx_5J&ivjGuU$t&EprW z@9A;q<+;gOtV8y~D--;f&!4Z)^D*;z!GQ|9oGO8;{61O)2CiLk5#_LZXKQ&Umgu_U z-MfVo9OHeYQK5T-Jo9hzekD-KrL4c=b)(omJ8$<-`kk z-iIS@b0=U=<4?_pd_scS#$`o*Vor3(@qP*~6TSbUNl0`WcZy(dO}Pj&)u$;kd5Js# z%W8oG=_NP?%D4*W)}1^qJ)G(`v|D5ha3yk4r<5uWtLW3vS8cc4Blz@+hcpqwtqoVX zlo80hq&(l8&K<1N{{Y0?$&uhpWN}wN766`*_D`r9WrRR^C%xUj0xMX zxmx?{=dh{g-Y`g6-UUXo`2&tMTN$$5$x?8#sAJx{O=sa|IShT?;OSd&QbjDJUjm9 zeLVg@t=FgF{}SPUYP8SbzQEuUt%_~a3pyi^iz%<#y$7#rJr5Rf@vi*_K( zRK`IXw#g6zJ_~X;vE)inbD;Ih!>~xJ`EsNk z7`M!8apo_hOOQ6C+v?OTWd1`&<`57$?4Hy1l_r2$#`&b#N={{kWM^8=ZX6A|T`@4a zwFF@5Px&PEPpb?Tiat32gQvCe?**Wk2JZeOJ+R0Bhkk#uB*RAL(Ia-y zR`Zue+Blz~a=m}{gvcEABwA_4u(Ibk^kuWE4#{7(p^1MV7H7zT-@l6t;rf8&-+n#G~9HIw#w z#En|bUnD@JFptZ=+$wEntLo&vmfx>Vv-P2G+Y_BoCnNLdcv4@mAs=(z0*&+_n5e7y!Tp~T}0Y6ON;nK58P>`aZDBmGE6}yDwmciHnD{!GOK{O&A0wpEo+7~*ZXlFP zel5@IhMLWNtg76{nCOsZdEO?Lm_p?Is@zSPtN;>zRpBPGe289dDFpqh!d8{)G+8`# zqC+MA4PPuGOzb801ROHk92r4ap5VXOIW56W(lNft?yT5(+Qcr}!xp)C(lVacc%h)^ z^U;%3FV4g;P`8QKCP)S5XA;DnS_>zYOI1YS)AbqbcZ^OL z?{1k3WQ-(IaP6B8tUf5t-?(AX!dO?Gw&cX#+L$z!ivjM(Yu_eBc{gUHK(Cwh4qquZuM{*W<`ZN3 z+mWGMAv^rB9nGF+S%IPnBmE7Gc6aeHb(a;X5O)_}$6XXRLB3A%16NYNolf0O)(6}W zr$1juX1pEw{9DNEh>Bn5pWY~!e;-idTVQF)p)puN!aPiSukgN?^e9HG4NKt%pByW4 zd7H&bX7kR^2!0Uk3`wBxFq8XtL6Moii%01}4w5qDuxvt~p@#+8QD*r@CSJ?{FJ@zN zoP`GzEq#N3I3zv(s+)a^X}t7pyej+}uL|1FykzAsbm`zPKY5Sk+V{*JkLmBPxP)k# zP|#$`ACU;k4`H!4A5@k>L3B6Di#!p(yWgjnv(hKqSSQZnx_Dc%JukT>kBkMmn&ry- z1y6IY)>D`#`f;k0oH$p>?%bPec5TPmC;SO+G4*@rtGSe5!}bmCU25a7zhWSEypebh zpOoygw0KEUE&z-7G7y@3o^x#C!%*ii$T%aj0ZV-~cJWlHj34QONFx%PB;oaF@Y9dyC@ zPlFbpn+_za8 z3E=C@=XaoJ?U`|lAXfMeOG3Apo2ECRY#8edcE`ID{ht9Ovdv5bakY{DXvFW)QxpQAD$Lq+hPkaNt~aCeTbCBc%x{rqqA%I*g@u`g zZh;wj?M5?e)#&<_?TOooS$)i0+>w3KnJW+GrZ*$-3+VxMLazFPc<^$;kM0quWQDo% zk2YmKWa9##rQd{jmrKCm3e@c?{7KkpdDCNPtR zj`HWiAY6DuXTS@re>H|uQ9FkepRwV#Ng8*+tu@7qxJzSa4sCmxj{mqSy%7uFI*WSc8R*7#~Mx7>guskTC1hqEL$d#JZs7Ig1I(|a-N$SywWX#AL znhw0#HUHSIi5=h{>^V@{eOPyTQQoeo}qAl?stsyi+Nk%Dt?VmsEVaQmaX|b}7}YxBHb^OKPJ@tykUwx1*Lwdw=XL73@I0u zpJh_neTC^fe>k5pY)<1GN)Gw0^~P-${KKh+%YCM#RcxJ$53GFoI+=i5I+b4h#qSea zK~1-_2`|4nIrU!y*`j@F-J~-NcF-!!;g(O*G}Xlm(B@ptV*&0lrqBo@cVI`R0a;EW zY!qm*(4PPw^5Y$RBQz4m!Oy3nD2|=reIIhRpTt>1NvlMd7gf{>SXLnKjK+WdjFxkh z?F~P&0W2oIw8!|0~TouT~(j zs9J^cte$hxM)w(}UaBytFm^?ZIo!@1Vh{3braQM@j;V5(d3(f>M4b`dT zN1X}yKBSZWh%BcUajt?+-vDBS$)1LqFq4mk- z->Y8}w-eWnzoL}5c3-zVIJy2>h?;>#7RD}e&VqLz#cE!Ef>FbXtkc+SU+;g$u(;~I zQkYJfEB^E)D{yseprMi5+MQP5f@Es}Zb;-yt?MdrE`#wwK`>j^sP72GP!_cd! zM+^*j+rHl_0O14$+JbHvOzq7tyrwEp)wq)V0tFCPL5ySe|y*ORt^z z%`P;VUzc8+jywtH8THC9|2kISqQ{s+YP|5vfj5xDIBJ{jM~*Jw0sTR)Jc2B4lRKHP zJuk>{{|OO2zpq)7%y7KePOCjxTodFFocng$LDo zj%mboio?rK(KuDNsOn-~2?+ijQqgXjqKNlX9BNW5<#|`RwQi|xyt$g(qc{n*CjBrH zP`ib7^5WAR>C4o-M%8HU1q!oo6pgM`qlK(Nl-p>^QOn6iN+Fi zYzG@9)JTE`6KX=9DBwWIgYpRVhcrfRrDR6%7DD1lAk)JrZEdgpUF+4Ww)WOry;n=M zwlpEYM11h@R#9rjN9&0}ji3;)GXL+|=S&jN`@8q|yPtnPnRE8p@4fcgYp=cb+H2oU zq>%Z*@8R#Z1|R1G3D|Nj(a@Wiaj~E?iso6CDjaXitS#0n9{Jr!W%R-*|Gpl(z!q=cI z?+ev7J2B-^M+(uf^rKzbd5Q|hE2?=qqIxxPqxw?yY~tB3+uO!7;$gI)AMLaP?Ytc1 zHI}@{DGI$WIGw|;V>v9ja})e$|$NbwyHfahIo<=vv!8G z$WTBlD$Ck1W4NUPHTkoW#C6FL{xT8QrC#zE*QKtsgEdj)e0^iJgGL8qsHSKY2vN`` z0}N=RgI|d!1TN;1?~7usC$6hrCE-AdF__T9WP{?NPgnuj<#j}+D0OWA@w1m<_UK8Y3o z2K8%U1Bf}Bv-gO~Z6l-jaB+4$HwRrxy|UTm^i!mm?X>k3)8-VVM9zy9+!yoz7CSju z&sDmtOE@=@-@T+44dVhVKCcc2If~Hp9{f``@khnky{VA=F}VLZ ze-TDz#j@qHgg~r#3l+QTR)9&1hbz8JYA(>V@1xRp{7FzEe06Md9*$6AyFw-3U8vFC zDNYc|C|wcVEY!{@T^Zdh6fM44r6S>|9aBnm$4f-E;D}qeT;fq5B|a*#DPH15wT+j> zmX;{WG@AbDN7s+gx3Jv2BvbCwlX-{@G3jKnASRym&DAlu%x1^&hil9L@P)XllO5LW zOf{H#j+X_&D>X_CXS6KKD0N56vgNwMcv%hsj(Ax>UfSK=(Xw3gpS~hv$EU_g1lkuC zxk#}@;GHLLAvy61H6Uw4jPU&v9lq$Yx#pC6)TqOLz$HdxX^lBW<>WT7DZXq8I2MN5 z|L8^mYte z;sb9xzg$tCF5#r}9FMC{e{(3-APTpO^tXrD?r$jiP>Zcj0mgCTQ_>fTU5R<}y)@XQ z^j_`pr{rUK(&gk9zyheCIP)_VTFGxUKc5jQ~G(SVToW3KV?HjLmca~Qo-@J-B;ht~NbubBH9!`p6r)boL8Q0BCs zkzuBFs!P>-mCcv^H`6-tW&SHCGt6yTwqUsUGCB0bT6FfNh*(2m#Pw0{9OddJ&+4gt zMvpy2t$1QuCPxjx!=kHUheADkSa^getd!h{vwG8Hx+PG_YNwnN%hk@M=+_E32qNQv zke~svODu*GR?3$os?vA6)kQ2`#*JuaxK?9_3|)NmnDU$gAz5H*odcpON+;-NO0-VV zEaCLYwXuQ}@(75t=S-SwXU|_fJws{S)=Y0G&%b(<1vbC(#ZqEfq1crxxWjgY?{E*h zJi{*Uu*)~>@(;V{ILV|m8onc&1@wkrCJo>es6*YN%UVd|7U@`q2k{gVozk{GC+BcM zFsfFp@Ae2z7Ma@CALHF<>`@2X=8hr|7QOY=>pO%KacG-g<7xa@m>#uWz2&vJ%}&>S zGIQ(SWwyK}XndxXe_Ef|z5y@uvrA)k!k8vl5%vlS3lkm?cwT;+5f<(8V0-lR5I0;aRZ4A=6-u`MvgJ zr{Wai`3QbBxV0+ecN+qbfunN`%v^qskwhtj;UxczuUNrm~8#ZI)(=KA<|9 zd8ah;mZ7NS(V;g!oe)IiV*-$C?&953*aC|xt51RqLgbT zOxmR-M!8lUEv+^-OP*X$Gr@!UILR7Fu_BKsO(oILaB#@10O|lBu4;r^u7$Iwmr&Ea z$!WcLW&0kP*z3%jvL(J>(Y)l;qez_0o^l@Xn)<|5Hj~jh!epfV=R8K8Ijv3gWm0q9 zqL}*8JdmuA(Nx@du%JfUUB#WRz$`sFP zP<)ve+hXdz(?vyxHr^~Em%o!8gn+BxI8gLQ&W6n|G%BHs&$;%-3cA#JHjeg;5Ic3( zSXiVkh~Im2!)v)3Zx2oJj=Ie{>% zlvs+U_C#``bz~y3v`?+MLuQI|W{F%fYB09-NtRvvd2(BhtSVTua$`% zyoB}&%!TH1-tE((AuaY72@`^@T0)2@aS0@X$+qpaW(J|4(EH=ib(^Ml$c#YjAg#>N z9^1*?LjHElx|&&3f!kTMPPxDSX0(qLv1iqxj9UpgCz2TdnmU?{`|WeiBP1V&P1voo zV{KYZk(eHZ+j{PtkcHq{fY5BA*fehI^+K=#1xQvfTi^mrw#xmpc2{IeR}6eL*)e=L z`fr4aOE1X>Iil?%p|2pl|d!!edG1S2;?74b9vh zoE0+v()noutrF~K?IaKFUT!7Thc4EBx|8}~+(_$4A&LHbg{ZK7ofg~oYsL0mNLnK{ zitX!6qIai4@6IH8)9^)7CdacolzpRHyfT&eUAqORi_DGRp}(bAUh|mkbWl5x%9?JdO$} zunxqY5X6PHLDes#sw)<#k%EG)J4jxB>{K?LP<^=wRx!Fo%2GX6PH1sV{|{2v;%q{J z^@?PPk+E?VQQDC#+oo5@NV#AXmY}vioK9`B9pOt9$CpFFR+%|9u;V3EnFa{D08D_-stsi^ZOg5tgPjYqwix-Rb#~jeF@0+g+I336Q@#?REaJq zB~^K%l|G}&8?E%mDzid0Rx_HNauq6qCHd9M!*t60wks&N(Z~T%46DWN6xhc$3k*XG z7BG9M;&K%rkk0Ku#y?%hzZX+*Y8lDVx;i|{LpUiNZWm;wKbnTD{ znv>Je^|>usL^TzYG{aQXoVlaF_?py0wem6g1eJe_w=eZ}k$Zww_D3Vl^9FYkgY z$cA^Jud7Q;&iQ2!^Deg2my}rF<#zgN(l-!3cdX?f@>y?13Gi=lI7%h|rJ?E+$!7(@ z@?J^00PiMQLGfPA2>vPWHBL@f@eVsV)XsZ-!IX#Oy}`A{aVFjoY$N)opM``wSC=_f z^Bozhw?bgJd3_*NP2$lTd@%%+o!#*&33niG$ck6_rJJ?#SL0P4@r2olSE(+KSE*%O zyvib2Q$-BG=$T?HadTAlqMAfz*y5$4V*IJ3rZ!~WvR-h@8*OwOiXB3fy@qv4VzUSc zEOvi`Z$!L9Vv}#wh%CwhOsu42Ih;XqT!Cp|w zXr}2;`#x}s9fhYtyzMo7=ZWOpm|R>TW2qM$Fkf3YGB@U9FKKC?kP1$nMldU2O_T5o zIp_b_#^`Fc34&vlR_(oNu?+ zDsOlW*aw3?k83TvjO(#+3%9dRK51sNvu>oF6A~5fs>D1vCbtU{5Z5~+pok|MB>cYTwPVp$K&{|Z1F0`ZZ5aohSCNGm8SX~5LTLiQMU zNp`(;v5w&Ha4^PzN<9OrBiP3`4&kEY88mxx$P6JZySFS5s$gXG->JM@TIWo@go23? z+Z@z=9{%d+xRWFl%iQD`iv1eO;V>VX_-O*K$HmM12l;@eHF=1L{f1nzIpM|Z1SS|^ z=9`XkOhbZ*6AE#^^-)sUFZ1wJSuM%Qr_LYXO`d~*QVx78(oZyLq5Y~eb8nOJ3u0>> z{|kSkBN*hxs9AwC2dAa~fi>`s;NPTYAcgqKTgga?*+eyRq#C;juwUkrmq|6eQjH9} z?bgQAByF^EZmgobE)=g+@*A^hvn{;QI^G~yxGf47=#aY)=lzz`AO05kJj%yNKAlgI zVkE1{BU#-|0G%rkE!wKGXvrckNiNyiHG)&}52V}KhRpYUQWbZzlQ#M3w{eivWFJSq zg=ZF?k7Qb&9y&g<&;TQf%G@n;68Y8wN<2Uuu*5}HQI~v2%S1R!@_{c?mg;!3owE3_ zx;(53_UvFrO#s8+QA=a8TIjw+*ZHmdIxG;s#FyYC`I^ND+|~GgiM9@sO5eo|L&7tF z(GT7*jL|mvWxR+<>5=h*U19-tvApgM7VwhMBX58dAfy~;t#YT(=W0Cig^o0QL&nUq z>_{4)Sp#1pP}UtRkHh2j?`8{vsOcyyvv9VA7>0<%^Sc?9)ntl=LDm~c{$Qb${*%O+ z`AeB`RGI*v4lJB?sEZ4f1d{plAv`5w>~|PyU|;lM;~2i;6kin!p=6%&Ps$9xTdw?% zKdfKlkigiJDuMFUDo)Y|zmpuF5mX`}bhT-`3_QyMkNK>B7(J&#mWaNdvaBfPqa%Ui zt-!}gN|o;6C4Y8S)ZF$kZy!l=n8uQyz{SpQ=}6!X@eNQEF|x^9?yP@$jqC+8gO=d= zIN3ACV$U2QQpn=-VtO7QU_@>$nEIk(fEnG9arA` zWV;P6$}aH^j5S(Ox-lxf`3FPwFuCT>FbtxaQB5-*mHc-3zn}qi=D06tfb_KfUG70< zT!gc1P)iL*p~t`)WEw$+#3N)57E9x_$F{1ngp^6Mi~80E2fj|6l>nMJ(n^UV7$|Y1 z{Y8B(*`F_g#EyaMqI5+M6k_Ty>BWWKRoi>~U3TKh&AEZZxTMmz@Gq3b2+NJNQ=6ae)e}AdK zXi1tn3md6oL$A zb_72r>}f#e&}N^?f1irw;4#ea=&c1XC%+&#RyT+cyHknI;M>VVr~n&@X|d`c)=i8` zWL=2MDwVV>S{g7?qE4go<7lZnvJg3xS5Ksb)0L$pE|)oIsI4t)yHM{rvWXv&**=MD-O!7>L7Y7s339Y(vbBmASRf6Qt5NLOrh1zZ-CbFKk*d z?i}&%=~P8tYt1Xaqk4g%F}CSRV)ctE7#)9Uz4_w_BSA+bNNp^fOp<%w@rMV3ihwSN zyMqqLk7qNYuvZ;2f3HbGnO=NS|C;D8b9tMa-=Sw^hOaTF9uW}0sD%AB=0*MT;pQV< ztzkg4?zk>VY%iVJz+09`j-rP~P2nudvfx zD%Tiyiw!l)+pWCieu-mRZVz`QoQKgri`4(vP>aL5=;ms2Ghb6ipMas(aXSO37O8>p zs||!CuBtU(P`3|={68`~R_O`VnxC@ZCLi(1tEn~T!s^?fm&{ZW|A zWsOTz=Pd6HHC0Q)We2-?Wxd(PsA3|??=Y zn54sSU`*jgb3`ir=lOdiVK`_{F9L>4(>=j#c{0B$a>S^+@WgO;9^KO0S> zUyCkx*T-5FO?d*SDkTXn)a8uQgep-B6ze!IR|SlcoM=^!-pV{)DN|xFd{w+k?NL8X zV>ZPr{jkEDjCyaZ(Ng7nujs&rZ_J5i2x4_n;DV-Zl=%j3F>c`4ku!20DWo1`BCr1Y zd7v+_!^+LdIkwynC4fK>%_Z3jU63~yqZ&OwnY#19P{~ZZHcms987%7Acp2QgiM7p3 zLQNl2*aNaB#op9@Xhg^?bxL=6jj0luT5x~hZhh#Y)+w>lx3IH!Fr3|dQK%_TkaP5Q z)>xIyM-OGib_lbk2v@y%qnd;i+@ko#?i2h}VKrvuNZ8*=*k-|3n`69uBy0g;(m(al zUlrnvZZ75-Pv_w<|Cie)p<0L7|EZ}rul$x8Y68zJe5_1i8ZR927owloepEe8p0fU| zG0oSJzgA{3)TUPYODr`60zrln8yVt?A}Ba3qF}kyf>Fg=L_8}+11|bIL0xg_Ln$p< zTsdi=L*`etlNU1GYZS1f3iB9dH>)+hISvb#vdB_si1)(AxDsJWfySP=qHp4kD|%dk7;2)QU$Zi`&x;T|5)6#m`(_h)bjhf(9PmyRs#XpO8KEt0W!CCwNn8RS@@_so@?i&Qyl z9|)P(->Ul6rWw=52+g=!`FX6}zQw&tUS~^A5ZiH?LAVk$@r;m-$W`%D2!(xxODq08`gFSEI=TuJo-5L8` zCwRLs?@CCk7fH0SlLzhMcZ7y z(ZKqE8UTbl|H@mg9ZvZT(uArQWRi!bhydD*x%P_$dSOV+c- zM{MRWdBNvQn%S5YIX_nBTqed++0lYgI`DM?NU)cV&oaBMt_5-e9iz94T^u$K(W&n$ z4^Gj3)59yL=adh>uDQX>WAnuSGRuD|p3P3a^Q7|;@>%`aGvFhat0d8mCfLw-t8CRr7vX8{F21L zj4=@CmEkq(oGiMmEM)I@%2_#JnnvYtl2JP7UEO zH7bjLIx7p0oyB*~&cYKx=iw|+bTgnVP()UY)WB;epMG}oF`rA`K9c;Bk>pu+^5d!p zY$yt47HEn-u@7Vs`CgqR((~!JyWQFyPs>_9QEc)O-z1_FUUCjk7ppO@hK+D1kLjG8WTj(4_`|4 zh8CJ}wDXKv&qLWjYQ!c%Xhg-VL-H*uvEhJRiTH(A z<7QU-B405|{6$rP$fSkl*UwXN#V~4IG7u{6kvF+wZg$3_s^G5SMUvK8Z58a@a511_ zha@X8;}I3<3HAhNjH;d3SE@HJQBZ-VFp}k>TsDcX&OeMCY+{{RE41LY0Oh(4K?FWX ztn-^rMht3K#-Mo;%uTHGxdzSmmCK9kZRPUddR4jHxc1@Fy9sq2N3f-C04z6OTSey{ zf+$0>GnU87K3meLpj=mD-U_CKq^Lb4#Njr7Z#jJClQ@j4^<8Y@VGXm+6o9G<3XS@Z zxE}NSR$Q;yWjV6UO*rb!s7)TTp+(`zHRc>DK*KOUzbCp(^u6b~m)muaS%aA$Z#-?k zBxYFer2bQ#{&h!q;;LOQgV zsDZuiaHb&wha-tR^F@Uj?xIS6C42Tkbo^=}URj+++qm=_ztuN~Do4Ja&2#h&`MN4nj6Ha9wQ1Kprybx@Ut$4cHBshtRbXhcr>i23NxBOSuDQWA%;k7v zX%g=-GTT>-Re>1<<|$tRneymyZ@e%q?Wmg#==4+PZ5xyIZcp5XWP^v?I-kXY@wCYH?+?=5ADeENZ7(IWf91 zTX8{+(Pe=p%M|;=iz+Dyvb`IgEB(o^DFS{HruB5xlSvVSpSOwprau$h{ z%6S4^oQ>q2kbhGl{v{|l$^>BzW!4WuGIBX^fc5YV!2*hEk%{%&`X&Z!la%6vi0o36 zN0NxpnIT1Q74#{hq~1&!8X2f;MiYfq&u2mwlUS4{Q&~{fF{G|h{Eb_VX^N++kvN7a zi{+rz?vZs}*u@I1IjAH#)4wScNtPWKGxsS=$R)mbNq~OAC_SvSyaMtXohS1r!^H1t z8S@lY8>J6=neI{JyDnYZK0A#|bj85N?9`;gtsLl%=ts_QsFo!})@@@HXCO&sMX_!> z42nB8n`Ov#uBbamYE1N7**I;7<-tO50k8_Fp=f?NLvT?zh|%?v&XDd+x90OS+D{WB z=UIp&U*zCVtnm*lr;Ek^UXXso-#t)?&_VoVFpT*72EL{brHlVNXZd>u&ew-Lkt-52 z2G8>Mn*Tmt>L>8!LN!lxJR4upN{d%t&O+Iq2^I+T_i~WHs$hPCaoFNFBg2Vr)Yp5* zl0i!bI|d4HC_QM~Z|9QnQdV*|r)k?4kLh{WlQGou7eH9*wA^p2Rh@X_mzrVnbQ3{2 zJQ;^7_)h0u>Wo8W1B;AXvQb7`5@6WQWYV6|oK|PvE#raNve_jBFma`+i$@;-2PQI( zGy&gOmK$ltw|&NPfqBNv)-3Csdc_a|MK!ESt`{zMY|%L38{%NO$_HNa=1d;PqWM1$vDeyrn4maqS2@ z3#e*(etRj6*ukLZa!PLrV}=_GDvoiP`k-R4%#F*`prudf0~poiPobBeSkhYyt(bs( zm>M9UOoSJ4v9(d-pA)Y@83Kj23b)c{tMCYv>={s|%kf;Fq9(|3%2QKrU#wyxlVhlB z-h@Pp+q_T>H1e%Yw0O)6zNE9HBo->m8l!96%cCBvqePxk4uG@kLis1m0A&)j0p@8G z2}%d|b&R4CG8agHRKu;P^+q8L?bv|KN&l2<16y!t+iw8JtCF;!DoG2{6-{VAWvztf zSTQq*Io2i?Rb!G4j~!KX`?SuBh-yg*-{s~d;pos^0TVk?38>XS#W3mX2yZA?i`~l6 z_=;rF70IG294f=2ak6v?`z_Q9dyB@2=tt}PCo46CuqsIitCEDU$|8hzZ$t62^iwCa zEvrdV^qjV3C2ylgE3=7nEW0qa{$sSXbJ27Um|K>BqzC|%&|OrC>dak=K)8zrw2t$T zS`P28Lfw|q0eQT$>rw2RtD5Rpi-3f1WlMvFgyoj$Z=d1bTZ#ynUFrBU2Dr>c?{{%G z2RNelr)V7_fWZ!Wc&+FoYMrtZEUT`S=3nVqw$mtxs~;}og8`(9xR)sOWam-^3b?B6 z72}v6R@gmK;Z=^(=yloJ_IVQs^(8~JWJsX@ViL30%^Hsa5J~i@k!T$fDWZTn^MqRL zFi=+)Rz)kb`vqmKhW!;EnY#rzF?W%SE|QhN z-vb#zlnuck6edRokHV8ja0nEMC4$HmQp((rc^8PJRD~8X94AsFINqf1$}XXT6y{(& zyN0G7lIw-SO>|kg;?ybU1ZZx)cCigZWE9mKR+@*h@9_{a^JaX!!wpx?;5$@CnT z!o1c#nGDTg;FI0;!`VfCU1x5zMh@fl5gX_Om)H=G{MdpvX)YK^(+;F%qzf%${!cbv z>vReCpwMawE~{QwP%ru*0LTRz$U804qfkrC@zj~mD<9Fw_e&Zsg&7FZJz3@x7J!Q2 z&e>&#H?cC$AQf4zs4;I;4Co10O zgUnoV93J27Shyf$eqD8wPxwtcjeXA!B>3+s*3XQx7LFu~*|E9CYy>}OTg+Qxcw=`% zGxSrg@Is8vA@4ht)>^F(jR{YH*<{nDKylt&1HqA2^XH@!k>t88b19gjreS7YrKT++ zoiqeGjl;}^9EGJq*0CPD{ukKw*A~c@O~~xDvL97(yU7y2PR7+35SE&Y7`NjyK_dVl z+!r(B(C}c2%n*LxTW@R>xyj|xR!_8*snHj0&5E{Wv;EH+^>WBlT`lva=}-a*FDss2 zBi)j0htm-b2rrEQyeL&xh%KTwuOvsk+>cs=oLb4Nl`vWa)gqL39gH&d-vEoVAXPCo z;)%mG9O^ad3B3;bGke_kzG2Z8+!pzX&WB%p&gePN&w^Ed)5&Zdolk8Y)OLeVS5@1E zs&BnW3D`AHvir{qd{A|>uH^#@xx2<1kivNS^fRt-GlstC&ogPQD{3GE&w!Ukrs`}2 zxX&UPIX#xC<5)PeH0GXT_&Zh5>9LWcPct4J_z}t9DKm=US_0~Q6?AjY^hKPd)-{BK z%cGi_Z5w;*sPKTodymmK;!SOb?Z~OE->ka&_RoY52z%N;E1f@QUSvcG&tjLS%ODP4 zDEqWuc#2%D5Ypn6ipjF{;AlL@#>1=OjIte^ItVv_?AKXrw@X$)Q>|@}AZ8bn`sO0N z_$qRr#MNNY8~{`0hVY;a*%*85+y$Y{kt4a=Tnqv~w!zKl^>P=sPOm0>8Kp&5-{VUyB?OR99T zXzrSy!dkg&J{Ms0c2&BSf2um))K!_r61%H1ooTEF=~W1kgrdtQdY$3aJ>~fx8qdu; z9wCg4u06>cx1cX<**`6vrRE2$S!R}41Vd1QQUCr^3_k~V3ziseg*>CEm9ih|)^;p# zX*)_&tTD5LC4m|rJLIi$&e)&dZSN0}|HO0hkCl!Y$?^;8^Iyi-cFd;y>ryZ*m(hd6 zX*5tTJy89z{|8{%<;|E-#X*k zDeyllfe1Kc%&f6iCENaoNb+{&7b1zV$tQT?8l=)cMS!`aQP^j(7OC)G0YsF0WDrkM z+7@3piW?1-=|&^H1(wl5N#+T+n&X}gpC{)XXHMW)(;UIOPxy)WKuJ`5v2_W$B(Tl8 zh%{@aFKpi*{>cCu8KmjcKX69g1TtyFV{wB@i@+(ODvmd*UgwYUrA+M(S+x@yZ~+4$+~f>$>##Y>%uI&gx&lj7;6L z?utaP^GIH*to<;r?HBO#cH3{ZIMg@75cT%j@2uX(N%IuHZhnW(`StO=pPxm^tf!<0 ze&h7@S)2nhN>~&}jstboA`5=*I_^R|7`{b@1_!S{9UHDQdSL~_S-P2mvNfC`kQ?wK zQbCh_wi|;ZJ7s-^De7x&(o%FP?En0z9~e7AREl~d&Prop0C4}baS14ALq!gxdCZrY zC2@G!D>yt~MijRqSuq6O)Xzwv5o3)t-bw_>P&s3^w90EQYK0LTG-k^d_}N|yg}1tp zZO-e|s9Wfh^^&WHO1uw=>`fLj3Sc(BWn7FxQ^#+i90rHwgnth?Wpa7zjK1^SV)k2` z@1slJ&qACre*qOQ6`~Br+vAP#?t0nC(02}rU`hBN&`6NRo&=ZywBPKsCV}A@0Gi+P zp0BGet>?6-t1g{obI2T1M%`E$gTjxf8GsXN)YYB=T!UqZfI0RX?DH74Z+g3sW)MgO@cEh&B+H3Egcd6hQAL~FfN9Wb2W zjT^;)L>g)dp zGv=q)Su^H$y=uz*wNVzJv5ndU*K)L|eOOFUU`-;3el#FmmP3iMzsj;Ip!Tnhvs%kx zUvITqYg*fsvJjW~Qb2BQ+*Zzar|+0UBq-|yYt)qR1@Ooy`p9u&uOo7` z@aGm_@OFj=mG`E8g_&>b>jRF+>&ASvVp`R9@d4Q`t_(z;r2yGKt25V+6!06$_HFtV zLFlX?wp}(7bT7@3c{`0Lfrz1UU$9NhD--Q`rO`rt=_5+>No9SJY4%n^KsFkJAyGR@ zAI??lsQ6|`SjW_pb}_>}9Q_8953$NubkjSPu`C774RXuxA2oc7ooF7YG#SK8lZ z6AeMAB+E#~73%~e(R&8uwke{%#ST^?Lkh{oFXMHx$cbL4_qg@%36l!V*PC z??7qZcD~;#R`9(<^-S%nsYCqdN4rDhKW*z>iEx!s?EI}XmqRiqF;Uh2S8C(Hn(02a zI)(}@;@S1J9hp_XC4fR+%Nk}qy|YNb`<2AnB$Nvd=V={nc=5T$8s}kW#5;3oa1q0AL$D#dO5Y(8KxgE_nfJ-bgNSG5 z4nObkJbj1kt2-j)^)(iJ5i|zy0NM(~MaV)xBw#v+@yO2c*b;TquAJx_ZqZ(~n~W)| z_{q0NdU{`Iq1|OaxJK2Vtff#PtD#u&Po)&uU**s-Qu z*erdHgbl%HS9ErvIq>0W>LZ}&Ty2qpa%by}(3o&!DNlc-Zsulbs@6G;XMRGO-&!;* zpO&J@dXceNTIbp)XRYz-c{9a@Ieb+Zj>I3UC<8fZ!v+pwTNMS!v0n*J)2k?T~tR9&WveSuVHdFDbR6%0GRkg0Jh0&J|hj6C#$C ziW3U|tVT6*b_p-4n!9XC)TxFX9_wWX-HTd`;3IcEqdCqs?+x0WMht$c1?GP|dl#WCbHzD{U@1pyp-rCl<^y+4*w`;Tb6dlrHPbfcW1qZ?VwAh1u z(=l0=jl80L7*BqM(ZlUDOpaMaL#-a;L&^wDH7OY?xD+)9#5|n`TfZFhx~#raUAAyk zpS?nT+3P`}1KWL~XrsEgHs;MZw|A27&|QMvu1UQGBRqo;oZ z{z;Y}FIk@-ak1hZX*+!h_LRuF&ksbrqAU{_7^iG$0eMvKARvuyQ9b&S zNdGeRGwJB{p7Cg%UnaY!jufWK!LR*Sr~1?p?V9KoAv9+A19YItvq`k^MJ5XZ&yBX^ z#LEiszyjq%66;rpMD$%*qM4_49K=TyPv+ps34*JmTZDR<*T|XtnlilYlrbF zk`}8u3#duth;o47&uBVV9s$<+IcsePb%K>)9Wpsw~QxG$zIxQtHjCs18d3 zqgRwyjNW)4^&yBUqW@v1C|pr^YHt=71ei}|<#W&5Jb*pMy1%$6(S zvIUFV-Ipl|WAtkM^oez;2)J9uAiNcDA*ZVH)EKW#-J`$lbiD>G+VT^;rNBK!z1ki3 z^YK0J*J72mvW^lC06N*BGzz5IWu(iNF+>| z4~I*lYGXNyfYzaGr&TTC48>I!XR%sR|rQaTKv`*4*4?0>i_0uU4CHfFm|JF2= zIUJi_wOB2Mu;??81v@CW`;7(JWCJ-AW9`TkQH!f`Hqwo9e(PqmGqgKJjni0+W~Fwg zSWeJy&w=2}$m1+*gznZlKIG%%&K@YH*7-JWwU;B@cJe&HngHw)_MQSoFGh}?*qMT+ z)+y(viTe7W11_z)fE9x_vpP325e62uWGUXL&MT_US@(fzf+$18#kC9{OmdZH?E{vPUfr8&~= z@zPvM{b2-lKKgBp7f5SNn}ZeKjn!?e1ax zXMDIPvS)HNF-Jzoe-f?C{ojbka4YltH{*H#>v+)`#6S?O@A;jmhRM+1J8C-)yRc>6 zpG2?ERvJWQ9!rI2I^{7Nb~3RbEYf2}%zqQvuSTkk~UR z;mg52e@gf(a^ARgGJ1TkGSPt6OmJfpRe1=vB<&7?ag907%G36wL-nIsmN}vv6poni zbBX2QOWi~w)gm2=fU>d@3REa$6SQ(SEvgZm3$@(njU94&fl$PggX|sa$t$ zcv|~uF-^ra<$^h%DO+UiryJ&l*d~{o%aJtn^rui>zt8$IKI`ds$u|b8MiP|HpU1g_ z_sPR%uU?Z-u$yFMe&w&=Ap}z>N(|?C-rmOmn$U_ zWZu!V==@yceA(~VK9@~`?QToaBsM!G%6xn}IzPvm)_<#2x{a|t=T(xES`Z(QXbgg=Ok`Q8vPG-i#{80~6DhwV@|PgfZY+wXDt<8E9XH|5F=!B z(9fmzTRd_JJC#$Y<6(f zKn2FZ-O&ijLZ0Q(jgH1>g;z~?kU40b2)3=KG(u@;`;5k7Ht#PJPNehM^_LiBdB{P( zM2j%PQC0w@9B+gIY}B!5!WMxXVDpgc7~jO@J{Wa<7JCayF;VL(MVpQ-I0o`CK(mNKgwQP9f-MMtSjao z3&kdbJZ*bPifGxEj~yoF5(I{33`NI7%%NBtCJ4ovkYZE&@(IIHC*T!ZAX}9Fj3FZ~ zi(!;fqUTTD%Sye6{Bw*0TBY1N>!)+o3=mS}#smEif?qk9INdT!yqKJdPKl15L#ujY zmJt2$C9~AL(D6e&#b>V8`D>hz@GRuFvh>6mKvp9s?okI1EjszYzliaZsuwm@(>y3t1xi6|2y<}K#Z-dEVi1s2%=mI<+FzK6Zz zN;hEQHbv>f*>5m_JTm-hkRLQMVi~rGQIN9y%uQ=|g^-bD90tq|*2WN{>J=@`-!2M4H6kpHry?DB%FZ>;FzJ0@Vwb5@KiiSa$4g*>~J*l%>K0T?lTRz>=+Ew?DT`i+Ubauan zL+~9+QgrCHvBn`mKMIEWdco+WV$t3g@vzpt;{)p0T&`x!nk$BR0j=X@{E_DRQ1tsQ zdn;nHVwcCI{g#?Kb_6t3ztW1F;S7C`SN0qu9}U!l<@JgEq5&ZXDT8477?!URf8Zjx z;)uU!X)tT;c`642WQ{WLWfq@dAMy%Pk`BV{jfGN@p`zvyq;JxUDu1*B)*5~%K+`Nd zzQA5DDs(>iwR6x}u-s!F8S&=)r}ZI6oQFF#UqD8uCMip92-7Xs9Y*pc2MI((j|k^f zI!CTb`d=IYRSsEM9F#F+PEz@DDp4eKibVh;Vk7V?!emjrG6xSwbh%KUyeI-1Awrcx zeG11^a*8TmDJ{b!Zctw4D<8?=ky8v+HV^@l$P+5P(W)T)!^uO)VkD{@A@z-^%C>P> z;H@NANwi&nhqRFPPm`^X7kJW@ik7fo?|2_7RNZ*;(DF%8J#5`ANhXv@ND?aI)Xjbk zV*u)+{EEhfwx#)wMN*FS9_v4ZRv?$IVLwSX9pQY@?g+?Zf;>|5yGsW0%yr{HgH&?? zFLt*EE>1+SfA2A+jKu>!F-r}I3Bhazjas~Hr`OT!YkGWRn$JAStk~=@A13MIj_wG` z`Te^|X8r?`&8~{KpKx|9dsn~dZ`{1s$L&YV6ry9nRkVC4Q0^mMM|XIhc`X^4Zz0<< zKjqO>@O=cHc|6R@FO&6Rknb|=?5N0rrd$clkdW;@(ACY^_t4N%PykkBhp;C|ca6C^p z3`#w2B95_9%#dm`XGskIqk5u~p21kzz0^qN+)zuF8R{k~Lf{>8RmA z(3p4Ba4tyXHBG5W1!4L3N`c#{5>s2RagzzF9C^ovu(8MNBq=+pN3jr#Q4cenI*ug! zH&BKpi6HmzY>0dZK@MY#YoB>~BV+h>pL}zt&rx&oP2-S+o?OW~+j70>dT9wkqmn=0 zKky~GY2;6>pRr3k?H(X9kgY^B@_D~}j#GB;lA)ZS?VbYWZkok5?>#xWN? zM!4t2m-!TFR%uu4ylw1nK~#q+TpZuKHT@D?#F(+oim?aYRE6EjU282LIe8p#BDM=( zBiTG|McTVAcNJG&lEL2amqY*fYH@It;SR3)h0oCtnW*Lk^G}qL-z_7!jcfbrPZ0M- zt>b5Wlh5Qe~GA$|Kn(luxAH+Hc%J z{j?|S>A2$$v>}r7>a-)gqkcKWAw-tu!Z>);Q%=@qnLnTGaJNR{4i0Co)k|Th+ee zwYAiFDgAaUH@>!f4D4I}gGcL;41{7<`o~pLLB_jrN!o2zwRdWF+#z{CBO^TlGj>e7 z9E~`!73Y3o1#wu}a-tNg+?Vg|c~6;;`=fY^VeTgNZs_TaJrtx-4oR;fj?QK{nw1^- zj^6!9w4Ewx$!t3nXi3xlb^lB6 z^%^_#54OE|@k=J0aQ;E;t)V^Op4vC5`{e$w^clORI0o5??K`$M!{}Ljx8aDogU5QO zIp~p2$H2Rgk@~tCENxPJM)yX4mDKX&p_8xahs3QivXfz1BVpNuC7UfrB+-Vk zo9(lkeFy@VMTTlwc3|MZtE$tK(Ryr$|H;_+PPF3V_LJWZ-?ZAOFlXHS?VILAIWAgpWJc9Z-;P8p z{>EfyC5e`VH+v=m1;d)69x zWzGtvxg6o~c=Afe(=90uA_earjIeH`muh~5av)ay#U3i7|O5s7?ez8`uMz39Dd6Yt2j!eEEQ=m zHt%ow6-VId7v?>YPx)wznZAe3Q=Q6WQ^)V59Km6g}rKe3hqCV>A>J@&Q@o z)a`hllCdw1ymWtLb=d z7Wd!DQ}9M^Mo8b2+D`(fS&NL{3=={f-P60t@mto%Skf((bOZg5J8gvXw#_n01!a8P z+219QGmw^@fP=@3*Cw;Zs>`Kt>|eI(^K*P;?WQ&TNvd~`^%<_5-aT-=lJmqOAJ^+g zF8+hmzB#aXY9Gq2FZJc8$_f@j4`~ONAAb1ZKS+AZgCv$;z9(N90EOZ##K<#3Rxf|OrMvtsF>d$LY z93Tg+O`tx8%~(OTEfzrAW=S7#Sw$OHRz&D*kNF-wChxaY{|exrYTM4Jpx-P~R|Bm( zi7^oJOy!1<7cOgdnPLkCL&eWiW=v5d(Z>0+vKZoxc5bB=(O8!}f7Bt*pSH>K*Bj*d z`}I6mZT-J__3y?z>2ug*2<_3&!-`qw62_ukccFE69Q9qqguM@$^|c!d78TJWXA z^zoTqYZ8c63_-bM766sJ9funZj2_r6kAVMydn$E;uG# zoQN>K?R9LEpH*#>j01CuGSieLI=Lb*_M*efve0;i3UF{Wd~@s{z}W8g)8tpu@^vwh zQ&P6E#@N^Xro%C~sl7)+drtZFQ~phez+ZZ+=Phr>{z#_Ylkw8KCtqoQmvn7CA6{IA zXo_hc>wg3s`Gu4b89cdviV8L_E@|vla;e57_Z?dqRP^MXp}P7S{b(*s{yY!#*Z7E) z5%ORu-q9u&9S<2p=p>ULQ7U|*EuGjTn|M~yFrFTG$-=93$dZhpfC_riZu2P#*E&9eXetxlq8C1rEg^ob<6Bm8S>8F++RfOT(MMN673m6!rz@^u z&JS?1?`yB7cKtp4;;vjYw}fI^ z-V%x_b>HVgxw~2GEVOb#QK(a{nISGWJ$!{1bSv9RnW@fmy`Jjm9-TSMxFQuz6;A=v z&W&NEKA%N9hQaChS6Oxs*Uf_UMmvkiR@`Y{9M=l;eL?;-{zgJMJn>atLTV+40haDQ zRb7Q}ua7R5XzXouTnK?uDYOp3Vr4<#A90ui1bjh3l(0y}k6fP2n=}-rZkGyksXd0y zCwPNrm!)EKM^ts%=$bFA4)@tjfbNa6YxXR)7?7hN^uukc$nY$R3TK+Kv3G9OOfh&N zZRV1z|E$F%7Wh)mrC$u+*Hfi(BYpG5u|8k<&$swo95cO$HDBj=o@^70nHE@ketgm>fG(` zK~LJ+Vbb16Xm?E)Pi{JCMUK{TFo48mzkEz_oY5Sq4u)rsITqnqrq3tRrB5dZ)O#Q^ zPrcW^?I&<@2_K|#?=G2`=5uvZ$wk2uRpHPo?KGQTtF$wdLqtO2vXhA3-J$6!g@1Pg z4iHI&s&p%muDnW|aVxA$RZfT5k|Wju(xaNslUt7Ejy2+@u2K0m?3HTseF%Sf?^oro z!M7LJy}>rXDOnTT%e#jkcKLWpg);BADn|hgY`62we0;|V_G z@NX|+&q*8dtZ)#ZVRFf^dokaOrOfAer-m$lprfv=B`pXQ;5l50p8j>r!?8I6P(~GS zPF+JH1jDI=EI#`e6T0o}u>K11Tc!QSxNc&Oz+#(9_uqpBsYYY3bkZ<5f=O^-NrtMv z$4>;-(~hY8S513dy+gZyL7y5MUj;GZNJ^iO?1O8uFd7@Fj;U92lI7-|Zb~~tB!wkC}xEIUs7=9n{o@}>C5Mh8c zJEiW9i3;fj)(HL&Pm{LLj!%d~-5Yj;&y2IhY8aCT*wDX(>VX@gt5fGTE*dRj-wN1; z;>rLP#@Xj+fe~3exedrYRe+}u>i!==84rFF_8W6Rj&K?C z;pF>CsJb*fhQ;OJA0!56{a|#h?6oZwWcK+YuE5vA-!w|mq%>6$57=V!UaP!szRnHT zgkx2zzmwW+JG)kYRR=6bY6VH+_BCl+{%guoW?ReGjOA|IIhKsn@ECw`aD+QnX}h`| z(2~JxljDZHwc*$n$8;VswT?R4GZNbX2ItO)#;*3G`ze=6F>2lZvr5Z3#BV=+mbwB$ zVQn0pNnL~cx5N~6hc%SG|8mG1BxrXZdkdGb<%aVm7ge<;s#V(g?iXan5?t`n_d>36 ziq+gi%wGEEvg}}T(sQwI^aax%DRN(s*$l^9Bw)5qPImOn{`U6}w70Rdp(eO#^3i_! zjZKa=?XGSn*IAbH*Em;cYfg?|rTITwr8T^Z}ZJ?TqFNJ8i!e=Qv@>@F_>^u)(v^<(!gq4)B$@l)vUBHqjc`d{c!^u^Q1ppDiUb*-Kk< zP>zxb?_jr3NDP3*oq*V|Ym0$!14J-K&62nwz5>aH zS=$s8TIrSD`#`bXucY?81qhbDk+D}zoLX!$xwM~>NmPr;Q3-qYOjF+0Oe$+^=1Tod zrb|JxmXoYWa;6AT1CwUusWJ}FYO^3uFE^Nkr}_v7m90raD#(X5Z-UqU7i1>Ik^O?q zq_hEImc#DnVmf6pJDv@x0hNElloG4ggxE=#yvGT#^HJ|+(Umx%T&0hJVH9#+09TfGt zHNQYZz!5p0RStVonvZ@nPeP>N^&z<`f`b^5352m;S2428KN5q?0oaF_P-ftCuhJ%} z342kG@lfz?vg}Rr+iXFvJ$AuyZRx>YBZ0^mk;Kf@wryBQM4XzKl8YE9F=eHCu2#>b z>e-~8E7Y??J-4doHubz$J)cz1F7*a#P*!03+nVfMRFIbDd!U$I{y zzoaC|dMo{3jy$630}R-CRJy-!;uh14q8nXT|MXM|`o#G3_`@~k;eS4zs4@R?ujp2K z8kfsHnw-v*JJC4xz(wMr$lotWv}7k*kRu@~_L(=Qqd8XQEjch0!a}IL5-kCY#3mvE zO~IhJ(Ojm+n8; zuV|0$IdJO0X>Oo*#iMALVwU2u9#@%P^q>97uPpiEG)Z=}A{#&SNsa4+=$&!TaSj<^ zS2d1ybday*D6uAiz&*&?V-P-6pE;YHB?q4?3V=woV#FkEuWCIq|50bT1S2?H`U(7L z)001vEs~D~7iS#dY0Nkz&!MJj0_ssxQoco*;y_q6-q-~it{&OhnkwK zU}MH0pH04hAkUXMq1oBJ{=6nrO5h8!-b;d_#j%0q&Zrsj=qZ?P3$P~EfyL|S*8U+`iV1;={jX679p!kL1 z<}>?8T5`A2?M6uG?zkIZP01c52)3(e8fV348(^gF;xca`99~ci=DFKGpNs6ryfeft zy7XL9@wG!;lx&RiQXC2e6<$Qkh&luLCr}m$LXEQ*G%Y2oQ2t?Z4L0D+Pb4yj6d*WL z5y=#p@>Z1#YJu;+Vr>~RhMJTnCHGDKyCNS%z2pHYCE-x7vyyEeNv3XYVHb)M>uf6$ zKdF$pUi{QmO6C*)CRuVgQtSK?ZNYZIn(%pCb-Iml%D0GGvsO@3MyA*h10-^o-LDMl z@*!4#(KZgj_M&vDo+ajoKUXSQ1gn!GqTd7r$`{Bf<{$p63KPkf*jV?Pcibl)?*0pi zMb6cTVVa=a<=jgL@Z_vj!2I@Osx#!ennFg0bcZNIZ+TRbDr>3d;gP3)nWloL$2dgn zf>6^ME4JTUtYV9i8O(WeRA2puV-N9JZdvrlB~4Y0nQOlFQz^tV6M#i-{TRR-P*T)_FK&^xAH;?yaosS6$P3 zsd1(tt-dQD?T=aA5i-yJxuTNn+)dEaP@7|gRA-cADK%eV*&uNfbf*NAx)&q^IN>ot zcZp}2yJpxkfoHmSR$+zN&O#v*`2>nMaVWb(7;gg~MI%<-V6^0q7Dh5YEd1Axt^~+A z;JHxxa(NWWqgo!t@|Y`+lCvKwKs{8vl2FsVKcvNI0or4MllYNzYkx&dN9FwXQNoSB z?_GG!mm**4;GVSaEp}e>4QFJ$-jky5Okrc`o&0A9QYSsDKkMXBjM)3|Q*$(Dw8wTb zpUq?z(za&8|09bGhz2%BbFCRK><=we#^ud_`Juqp-!HwW?j+8!Zc?_wgXVjL_si1k z=_jep_k7n(pe_fgOUQZ60;x-P3f1X2NL{+AOSj&Ky(&&v2wIP>54P5<`g9U9x;}Hb z0L8A$2P|Nz%fO^Bs>qe9qN4Ispj3Oj;3_j@E=))s*b)L_g}fVh7xP}hyTlry$4tn$=bi&ab}pD6G6-_dVD9Ki7Ait>)&b+|^ax)ji$yRAq>blTjVRH$82J zX)>e)u~7+ToXo8=dgo8z2QLgH^~p|#_ouEARP{zV@ zgr)gv&cm5mbFkEt;=)tAg^z4e;$1SWfY94DlCDhHq9$hIo8ke?L+B~4w-5F7rotB% zVf-lLPF7?r+lx`K!X=BWJmKP&1(Z=mmu0^@2$-y&QMSY8Mt z>8(EtsfDiJZ;4sxpVNi(<=hs9xJNAfh54eOhz)hd4RzG5#YZ#Y;KWV_hhm zkjB$pm@%n^*fBK0uIk&}XHjh789~V9iyPd?rxm@oExho?(S%M`7ZFMq+AQH0WEkbW z7KOs;g)6EYZb|LV3gxZ1Unsj0vtyxGSEE-)NiaQdwUa_19`bN7LXCantxqX!fHy6Q zEfifk2ytODBrf&glkj7e6Wc|Y9OcCsX;+?7OZ8pVo$TjMwqqFwce37{tWMaP@7VqF zAE7i?-Q<3PPMXnO`KzT^Wx~2bK0E%VY4I@S*`N3RejgXSx1vTBxeXWY>o{zzM$o!h zg6pfA(v2c>Y(<;;pz@izu8qr83H__S}T~=x`|n z5j!U#hOYKuJU5CDf0p~gT_h8YDGct$r%Gb{(5jP%mcwWAG$g?IeDQWAPb-SfzF>>I ziFbvSXq&eXsyixUn7GKZdVD9wGxSn^icSSs@@}GcG{bJO{ z$fu#GN-PkMrzAXL2-gNCDe}}{P_C_1R6>xjlf0WmAc|NC5rc5-QLV*(tz5>zF`m-* zDcm~a@;Jf4M2Th0S3I#?!c~qFPA&X&!!HXnx?2PohXOwtfyxi^t`sCpd5HEZf}ivk zQF8QnB#rDTRYu*pLV-QqY6p0sm%PX1_IUV-DkTVwN{AH`So0_7B_-ILFM-ex z3wz+B64Jy3571lY?qRT$V0c~vp*k^H-)W2;!#N;y@4|!Zk&JKhqTp~!iFo^!#Rd>HXT)AL?+h6J^aq?Fc~{mP;mVReSVXtN`LkAVCnzQ-t5GI# z?Yz8y<%F{$@1Ja#i$4&gXX;WoMUqk97{OCfoM{ImR-!Yej}YrX>Z3Y( zJE=)Ugd*T(k+xJ6KBL2$v16w6cqe4d2-g*X7Rr~kFcdB?>yyWG3o4wL zyX-=9;w%=1nm}JrjpaFqDh>-T!H5>qCfIYIo!WSwo$$Qkd3N$XuVC8oK3H~D__Tp> ziRjc@Wu(3O=zhZO3`E`&4Au3XN1kS6^(fEdSNhkFJbf%*=5QA|;EE8N40)PcMQ7-+ zv>499PQvq1pB$_Wo>6+V+x_Kr>Ny9HQaEa~%gtlChl|rlxK$~H#SbzzPs5vd+>e~2 za=UYdr%`izb3s3`rT1i$9+5gs#&fPPiu)h`^An;JX_gR+M$Ww_3g=ZY4ycIO8AN4l z5IY+5nSF{$r$q9XrvwHj;)5!V!HHuSd7z~q6%^?3OyntR;!&xrtuvygil^n*o&MIZ4>C7th$pFZ63@vO4|%siSwc>P zq-SV6vBXYclUHV`Cny- z$1Ao38bHy!Sq3L{NZv<}yzpij(bD~F{|PZZ;?5L1a5Ypbab0Ivr4AM;q0j$e;#J(n zBk=?fhH3bvu9*INv+?^uZ<%Q&%*UVbSS%n$+kYcX>WOIr1U-GR7`gw@B7goQ<+;Z2 z%hR*;7AdBb9&a*6i?8+Y>?yjv$18e%Ie(7S)n>#^7SC10*W%Y&GjRymtcV^&vy5yp zM898X`M=En?`z<|NEvYz`~;?e{-6t}2P%RM!{0F%tx(J%2irj(}o0**r!*o zKxAA$DKI%EH8n0aFfB=N*Nsc77Z(#7my#M(Ldd^mN}t58F=+@-5WUO5uYO|Jq?DAn zu4#ci;|9d1#Pp6s9)d_iGDN5&dL<^M1;%zyP3{#lAf`*NIQVysNfbO0Hx((mcTMY) z66eX5h=_>|?3xrC7uYW;1(iZ{fg2Iix~FwdN(}53m)I>WK`74`d8Ed5>m8Sv=FQ`a zu=wu1P#ka2m+5jdP9>V4KrzB`1d0bD93Bys64yIMEL>b-Z0V%<(z)@=1;*jn`#?b| zB`)^Q<6^&YU&U(LCoQ=TcGD#(1r=F_XcFD1QEuIP>MgK)qTt2H36&63Ld+Wv^n?IL zx#u$q*coE=YV^GroHTbXNkm7J#0*h;o+PH+6I5aeq6|L&uU?JcpbOAmn6+n|@PpJv z5dHh(b@8_ZajYl4S;iB@m>7bvb;R4!w$NXQ#=BBz%^zrjYYgW|k@^I&uns}+Jg(OW zr04Jjq!vMhVwgX^*Ae%sVvKbaf_Q)t+aocqBP0ZG<;vrkyc|I+E{op=IEoRaF`T{> zL3|gC@{}Zq<2b9{1`$LM=u(^@mK7t2XZVU83T6}`i06d~qAA#3h#&<0^BD!9tOZ5{ zV*g-x0fLZ&>9|4yzW;lodEI4W*h$$c%_=5+~wAcU!f;zwq?xK-4f#IMzC=A|VZ2nQO z5Tt_opa6JpAc)goB^VCcgG#^v1fBn*U>EK5oEc+M_>VaUO z1Fy6MaS7}Oi@_KmXmvLSRY3tD2hTA={v!AltOV1*03fWy)d*Aufj|Y`sR`l^I01Ho zWndZ@47!6>AQF@V0YDgc`cZ{PA8-*I1Y5w5U1vpR+6a)r9f!BEPcpqE@ zhrv#;8vFpJ02fFBaiBG50BVAApfIokCHRb&kuSl0a2cEc>0m2Z1r~tmU_WIv<6Y2K8OUNpfV7aeJcS90Y6{`I^Y9n@ENzk_uwUX0v>={;0ibgPJ$!gH}DJC z4mN=`UftHZ1t-B#Z~&x(U%*bV6>J1+!B1cr zSPXsubHGe64NL;#z-TZW3;_c`UyuS4K~K;PbOoIO2A30UKs0Cunt%qNE{Fsi2nB)~ zR%IZJWG)MWK@cbk3V{IN3+%uQ3_uH1Kmk}lf*jm*vOyMj3toX2;3@b6JOsikuiM}T zxC$W#C7!2>bx%f!Satm;r=k z94CVbU@RC7MgSKW0tSKppf3_z1GVJMad)0-4}BcnTha4Db-#2Y113a0}c3*T5BU30wf@!0+G;I0a6C zW8f$_3=V?*U>`^af`-p8U>6W(*4P2IfvsRO*a+5xbzlux1%3i6z%sBDECGwaLhu8a z59Wf|U>2AOW`OBnDwqN$fr(%|7z@ULQD7t(4qRX;7y<@?fuKJShBEg7X&?oB3z9%0 z=mmO$?jQlggE$Zigeg5^Kqv4G=m6S-cAyPt4WdCyAWR$C3`Bt@pfP9!8i4ws9;gFq z10F5-6;uJ0Kt&J&%7b#CEGPp?fnZP)lmNv+F;El~0fj(85C{r@ z0N@9FffG1@4OoE%n1Klxfgb397HEJPsDKYp06CBW7BGMYBp`sB!nq1QgHIqEd<0qG zJrHKWehc1!*WeX+2{OS8@Ekk^PrzgF2gm@Az(eo=+z0o7FdNw&a2wnLH-WHP@O5wv zTm@IaWpD`yD`Z^&=fOGfJ2(r@fYaa<5GFGdbUu%RW8f$_0uF;i;2<~v_JiMmpd6MC z_JUu*9`FkgrX>{+rT`Hpq!Cohc7W|*8`uiAfX!eN*yv#cb?tLpR8H5a%Hlva5$KkTIaMhfa{+c<2b(!9#nPzkc4hY(1C3ZT4)a*zULK^YIFAq7f-U=JlB z1xk1bf-LT#7^FZ^P{c!FNP$8g3PJ{YC;%xC;K3hKzz_I(a6$?=JlG)xY{2Tl0x4kj zV1g7ddN4o==z-3I7E(atK@BOO@}Pti@bRF46p(w6K?<-Q7)Sxy0|hA{7)H+#Boh^; z7fo_l?eToGJ%eY2Nui4|yBmqW#bJrg-q|frYz+&p`D@crJ%0|9UJPIN#Je3fZ?0he z2%Ewuw(#+L7IyAlHotS$OHcTluoS<;-})UUIVoR-M;ax0J4upRQzeZu!{!JtQ4;%0M zK-3HB$mOZ0BAi%H>1`kvOLlk!roVvwKm@G0?-4z(5C{rC+-O=w*o7$tumuT`Nb%Jp zVK5RTMKi2kCRg|{uil2zF%)hxc1s}~Kf$JDKF_N!E*PJ<$) z+SG1XF_doI*5u!+UE$Jvqv-Y_H4~_A-Hie9Jqnd+*&(uVT+a%%`jhPebOx=E(IdSLLASWUQyQN%c65{`i(6{MPUk)z0Q|6lL=?C z_uTfL?p`Te0{_Sehx+drV%V^~!xrtmHEiml4SP@DdNFM5)Y*$xZrHK+@aapp9=&)! zY~yFYc_1zv3u|S!^cmbyL9c=y+==8yndfOZ1~90W5-XNJazha-_M>q zf5D<9OP8-)wPxLhO-!U-<~x&;uyEj(u;f*TRsh~P#9HzJ_h0VJS-9Oys+ z5C(<;L=X(=rgCUT_L=>Z{Zalwk@a5kcKtK+d0dYB{xvbyp5d?D_b#{vM~|WRK3&8B zDp<)bS?;G$P=j^b=;t{%9=qqk+GNbJ_lLHMamk-QxL*swF4xXk@7+&ti`K@8m)%bv zidHf%+x=3CuzKRlPfw+Mi>4iTeILa~6!Jul`>hn=^x}{1=VB^Xe78sLb8Dm==6rHz zN)a}VeeHgHNA!&ve$M^dZ7BjNg~IVJ&zkG!avduC?AE^BKQ5j=zt+gohiy{;=xx3 zVC_2K_m4*pxsM@&t^Lwht9QTuU5Iexo%^x0%ifz`x*xq2Gb=UX=;xE^qLm!=BKz7| z_i`lrX55|ZtG|lA*4XuLcP$b3MsEM$&Uk`gmuv9Um+pIyMQh>4+p_nabDxBRT!8w; zq#m#inEb?j2NPt#TDt2m+54}!ZwnE~Z1)AJ49CeVF%-Vz$xZItlJ94qtnAZg-0AS$ zpt=2e-_IWoAy$3Enj1^DJYDI2>>@k8|9l=J)ezxDyEh-tNsTqX@&2q|_KUux{YCcG zYhrPZhFo(W*oBxbSM4&tzBqc-eIHhGFO=d%PuH#GAH2nxJUF*Fq(0aBYmtZUr&8qa z^V*HP>q+l&y-&}zX1a2%D8E;9My$HRNyFGA)kdf)$a?vi^wvMb*B$BeaG-)@F4 zS@HV2Lx(?Hhjnm+y{~ud`*;IZd)*P&=B<8>L2WK_`<)NhGR0>3e%9SjmruHdli9D= z>Q_5{%ef^)X!h{aiQ{5h42nPd{+9#pKM=v(Y3}P~>)gj-C2wZAFJFMg<@#yEyH8Ir z;1SlcX_wsR&Wl!Zz|+s?FN)U5EiZgJdQ7|^OGYiu{PAb$gvqPaH+k0QdDch$%e77Y zw*Q>uIa|1)tNWIz(`iHPsZr6*>&@?0wYqZ6)jbByoD`>FX{r4d<+=g(sQu1brMT#6 zb(O`|T$onKxw=dh)40V2Pt^@GD^gO3sQC7-qK%RWXz7XMZ~Y{+Mrg@V^@hvKAT@ob}D){2zJh>zoNWtL3pw5i$f|FNOdJNRr_9Xw>HRI z^L0z5gy?qJ%9hY3Zr@=s{1#E#5r1%x&1h}Y=DS%X%alHFGB{>OpXg$Rx6~|N=}2p* zB{*YE)j}Z&De?Xt8yEMBUQ>N}yDnTIYuYJWq2LwudsYr~hLFvI3-FE}R&Gs^J1K=s zmiSS>=o<~LWo*(Zx>|*DA^YMAFS?Y}woFp!%mQn#-M1K%lD};ny~SOue@akE^1$1( zN=NTD!Tyt0TqqhmuVz@l{K(Qgc{Vmm5j>9!an_yEq>0|`Ds*s7i6A!q+zy7k5mLeM z)7f;JqxpmaMb`MPC|2r0Wb5jynx{HzYzeE;ZflJd9qZ2v3bLe4JzJ>whO#>SjzYJ} zm)=pvP;iH=i!N|SwK7(_i>z!Y8Xj0b)z4*foeZLVQbW>>vRkc-`lQxq%vs7NR4H}U zr*fqcce!?TP6m~*IjdE!mb{ZKQEbJ9fI`mEbJCQ7V~U$9-EgJ^)^`{134cuK$iDR( z24b9(dvS0`n*xO+n}p~-8=7}&S*fin z_S?A94Vw-s8{%rVhOA~_>&92BRHA&bf|>!<>O0Bk63WO4jT76IO-Z#-%6Rt*n=H;> zuZ(uZ9dK4ND&ylX6fy_*G3$yfb@8M#zGmH`g(?+zonAY%Zn66P{B9QIOS=k@WmRw2 z)H0ar%!sa1t4`72qVr;xMlUAAd^(Kt;{uOHH`Mv~aPFP`^sQumEa!G)kyRCjQRCfJ z(p=Sb=H_FoIR^wSt59J4ywQ%rS3|m$8aZ-M0olS9&-WXEC92nQoHL>rEG*@)h61t5~ql@~~svBVF*Vk<@PKYZOI-yFP zVCR$>MN9!}+%dl938ib+x<)qpg$pcU?lXIe*|Id*q^`N&RgS?|JK-MxPt3-5xe;!? zMDHh=51*km;W2M=eIMswkeg)kg5BM%gr@kPJhpOB`@I4rmmfcS_MVs9t-LZk|D0#fJBkl^ar3gp zQRF(_|D6cA-nmtpn?$ta?JO^^FJhn`JO+0sugT5T>+uiduI$`|kF(!+Q)XwsMiWS` zyta6nXU+bcR}p!I%*nIn-=#NKRB}FR{usITyzpGF|2GyqDR|At9C5aG!I_owA-96_ zu7G!W)=xQkCumM?BWC3_3(nKrW6I98z0I?tBE36yXXozhQ$F9kaChz=+#kFry^uIx zjNBY@n>9E0uPpfzS90DIpr~?<@ofKXRpCxq5@aXfm5E7OT}}vpXD4 zUqAnV0)Yh!6)sY=XtCl!B}xXDDqW^b*>dG8gjB3lxk}Y))oX;-tQE$EM?~_q>(s4R zzd^%BjT$#;8r7_MiAw)%@5>c6`LR2NH5!H!Mq87ms z5d=@vA?gtgh(<&cB8q5Ev?N*)ZHRV62jUx|Gtq^JCE|$$q6g87NFH`;64iO?V<=BD}` zzf??C81N2Q?vyNfVIESL4lu-Qv@wFnj^$ zI7$LWfpGwDZNwk@!r~Xga9K5Qfl*)_z*`*A2C8OF#k687GWaHo?KXXc-a)USr_wGuk?uyfqU+EV>0sJPvKPr*xMs=cEQBhO_ilaiQid0!Dm?}*9Q&vh(;oUE`Eb&rd5k14fzwflw3s4BWID{kyFVD(K+lI6)VWH1>-79|780;Df#CoQ?{1h&Vu`6MKnYh~2~v zT*+IAjl>3G4Yr?%<-}5AF|mmFftZJ@eiktk*Z(wP3NewGK#axY=_AoHF7yzChymy; z`Vgtaw?qL!lAo79k-wCG#7#n_FesdgKt)AGbw#A2 zzM`d~ouaFvyJCc5oMO6Sw&F*{Pl`>79g5?Mvx=*V+lnWOmx_ zRIF62Q|wb5R-92>RNPTKQe-OLDRe#-p8%gCK4pC>`PA~^ecJeZOjeFk zPEdZQoU2@>T&>)q{8{bLs>Z4qRX0_#s;_FeYOHFSYL;q) zYMbg;)dAIM)dkf})qPc#Dn}((Yt(jifV#N4w0gN}jcTiEm+GMExaz#>s_MDwjq0irO`@isW{75-W{PIEW`SmtW``zSb4YVmb4hbs^H4*m zWGbD?q6$9jt0|}{rKzB)p$XUgtlq0WqCTa*qQ0fhP(N2w8imH7v1tlvf;8ndRWwnW zR+>(lI8CyquV$ELv}Uemk>)4Odd<(8y_zGMQ~!j~Z61(wenSZ5eGvZB1>Y zwu!c-wxhPIcCdB?)`6R@{XzSqc8zwE_MrB-_PqA0_JQ_^_Ko(VwzM`x8>)@aHrBS# zcF=aw_C<=(NHGg3mLtUh?J?~+?G^2P?PKk0?FX$!XVUrU3h7GgLUf_J2whuUCtZRr zQ8z$0OgBz9MfaobC*3C94&86MBf7J?OS(+mJDpp{;@g;2UqD|}UrisTucvRKZ>#Tw zX*m-04|Pv1i*)Yg3+%Ul~&9KU_!LZZt ztKq2OwBfShrs0(#%Rn0CMx)VgENCol+^yNCIi@+Ixu&_Jd92CQFj}S7q;+VEXiK7I zs%e{R+h}97-Lxs%{@UT%vD*3CCEC^6joRJXeW;l;+DF=F+IQMdTDeZ6v!Z6o=_>2O zbhUL+x>l%}ILvD{N;g^eoo=CSnQonKi|(-Qr0$~by6%zg8EWQ}E=@O3H&QoVH&ZuH zw^X-Ew@0^McS85O?uPCjYUY(rr8nrE`apfKzP!G=p3}F~x6^mkch{%s2cl-i>lf=+ z=r`!M>C;g&r%^M1=wIlw^f`JTgAO$lV5nlKX{cjpWN2;ZXoxrTGPn$53{wr?8x|W@ zpk}riGW5^&@AaSc3WL^QGx!_IBL#;P&5)uqQVcVUHcT@{oH5@UVGF&p; zFk~2>8{Qi}8_Y(hv9Pg(v7)iMG16Gy*wNV4*vpt=9AX@4oMfC~Tw~m1++|ER9ygvf zUNzn}zA=6@(k361+2k}8HkB|fF|IUjG;TNUGafdcF7~MvtNpEtP3Ye;z zYMJVq8k^dfzA<$(^)?MRjWta(%`z=9tu$>kZ8x1XoiklG-8DTky*7O^QD&>z&s@|T zY_4n$HP<#bG{>5Im{ZLI%%jW`%-@;kn%9}Pn13<DDN++zIM_?z*F@w)M@@rm)J@sp7@*tEj5*L2Wy%5>gz%k;qX-1NqzFl)^= zv%fjWT*h3*T+_VGwA*yRbj)pt)-Kt zzh$UptYxxgj%A@`rDdIEpXIRSjOC)`j^&Xh)AG(z!cx{!)l$n+-_q35#`29N1u2Fj z#SElaf)weNLzdH)3zplKhn5$Xw-z6(&T6*?SW8&TTB}-XS);A(t+Cb~);`uj)=}08 z)`iw()^*k`)?cj$tS7DKtWT}4tl3u5rnVVvzP5t4O12s{-qyetZEJ6fwe_&wwPsjf zTHjkKo5E(W*=)hK^0w+W&eqV@%+}7<**3s7%r?$8#WvTr$o7+Mz3n&K5!+eYCEHzF zhV7;8y-jO3+x_i@?Pcs0?KSO@_SW`}_IP_Qdq4XS`xyHq`*Qml`&Rod`$7A0`+56S z`*Zsn`)51t&^pWxe@9`*U)TR%*Z*JF|9|iGzr(!8e8_yle93&n{LuUqFLh)VoyB4a zv=l?nSjp1F($dn=($$h^NwW;GjI_+QEU>JwthMa0>_N|X!g9~@hvk(e%R*aytVZ;V zrK}aKHLT&*M%L!&8Dp#ituE_$>s0GJ>tgFF>jvw7>rw0P*2~s=)<4iQW?7T1eXYZ+ zqpj1dv#g7(%dJ0K_garwPg$>6Z=q*=Zk5|KHml9gR@_$FR@oM6i?X${b+X0Tl5Ks_ zGmf_XVEfUw#U-MvvhPjb zEPIY!?$9{wjsQn-M`=g6qpl;$(aI6y=;lav^mR;ieD7H3SmxN^*yi}valmoeante0 z@ywCs$Z^P>8fOt_NoR<&nv-`naJF!^b@q0qItM#PI43*5bN=A`(Yf2X&w0#w#(B+o z$NAWq>12GBz9wIXZxP>;z9GKVd^b6FIMbbnoM)YvoVT41ogeWk(Z^Tk>+}uuE#X_% zx1Mhk-`2hzeG_~Wef#+i@ty8F+jp_=3g1n>JABi95Bc8kz32PX_m%HwU)oRYXY?!P zSIV!FUk$%HevSO1{o4Db`3>|N={MeQrr$ijrGBgY_W14hJK^`c-wnTeeoy^g`4#mG z_N(Yu-LJM^L%)`O?fepvVhB=9L5c-P@r&PYe#iaJ`d#-WU(r623B@;CcC{fqhs z`&aa@?%&M6wSQ;-c>izx`}w>4$N10lU+llie}n%n|8)PO{-^yj{Ga>3_y6p#2+#)D z0{jEY2UH2*0_p@b3;28QfAhUk{B!GH<2(Ku-|^S@j{n;69r->X{kiq8@5+CDS9bsP zU0J#~{`*t+2wr|_IW%H(u8`iH|yJq#OpH{9| zzHI4_OBOF$xZsER^XAT(J?s0K-_4jlZR(WClO|3WKW^-p(W6F=815Q2bjaXA0|)f) z*SAkvYRb3CNr}CC_3Y6-p<8@hY}YO^ojZNgu|xZIZQHbN72UE$^JY;^n>23JutEKL zb?emTBO}7Ouv#@kYgDgRwMykm6+;IvsYK z)nYao4SHd0fiT8E7;7MmIS>_0^7Kpe!oVAg6@zZ_kGaVma`TTz+(+1BxM}m2t=qQm*!lCW-M{Sl zb#MB<-}WCkc;13TJ#nSd zpdq{l{<(f%Pe=0gZG9EyN63#E8c_MEdKmNkz-+YtWPTL}GZwOX%oqv1D(JjmvO<|c zrk3etW|>{)CvyptdjFX&&|i9Y|53d=;Vvy`918k|I#Jh9&@>eE36?oU@} z0d~oJgep%~A!|ZEssVJRT9F;dF3_M#AqSDe$?@cLaxS?T z`c@mson+_4&b<;-(TxU#w!>dL{E0?5--Wq^ggJ$T`Gkr=)5wgP3WVmR0a`_7{8u85 zpkc(|$tM7{WrE(OFKSK*G2y=&sa3Empmru1S6GN>&V@yb=7L8)2$RAyJmF8mPKpzD zJq@#UOgmfK_RJHW>5*+YF@Aa{?%#cZE~FPPL2-H~gVAiU*`2=r0f7Yz7b#Y}M9EU6 z%a*GUQmJy)YBfS@h5fDhBE8;VGFxp9r=Nd;z(R$K77Hp7T&hgj@)asps#3Lj4JgR| zt;wHWr#G4`R=dO3FQ7odLPd%e4=Nd4x=gw9Ar&iEsa8F-=HI3c3(J>YtNWi9Ur5j3 ztBwy2U-!Q#{+H?h=f%&L{(n{cu#^Ms1}lloFcK$(98cpqs5T1PZz1>;B~chMk8?OP z|1sYo{C`givIX%U2AYtU=^f+>E6T_I@vgYzCihJ@7vX`>WinfY$ z;sU8>{n%=9O8!>1QnpF-E+gNsj+`;@r)}WiSr>X7i zW@ZC(fZf12sZ3%9naG@D2g&ZR&sdXew>(5~j(mlAc+W7KWi4eT<%MLEWJ&BB@-TUt zyvHt;QLLZrA|0WKP%NfKQXSZaWF^^1**bQH{65`_K1S+j4KtO#OC6ynGtb%fv=5U- zmZh`ERAxVOn!3x@WZqzFO!lRgvzM6m@;2H6v|3hQ-in$^j-nn@wOCGGhrPhYQDO4; zbRzYP+QxLIN-{21$qr=;QOD^w4bnwPhFRda}OE z2-#@GRBAohj~vO?mLFgy%aWK~a)WF$v^3umKgz9&)l3$9k=`obsVGZD&=07tbWi3y zeUxcQ^NgO}O!cH0YA?Nn8cGK;D-buHxliq&UF2tGF7uQOmW^a8%l}{_NjY7N$&|fQ zePl}0%a{)AR4Ri!PTwaV$)2z;WbK*vBrV&<-lv|^59xzc3;GmOjWuI`XQ9Vio~cP$ zmMP5$+f_2Hq%YtQAsyw-hSwr<=(-ca1ygZYc!IURu zRByT^GlQLqwHAYzAoeO^T&Kp$NfPskD z_vy9tCT0*-hdJj{m~O(hC*!I5vZYK-bvXNiuEBnw=TlcP3vMD^TNVKgyKwd$)tGH2 zTTDHtSXmkB4<=03MBZ94gA8M$sI}C1WSJ?gRS+*`ynZ8d1GKHBoY$kP)&S0Oj z*XVb$=a^x!0==F-NDrnP$QrSBrUlN^aa2>v$b6t~(QBFYtUtShU4u3^G0Uj>bQ;^6 zNnxf?Yj7SkX5yKZuspo8Hg#!?n_uPLWNdZjkuThSD>bVCoWltFTqnHQ0)D z2wRC+M`n>pbTZYK9Y7DDli4785Iq$8h>-cPXXyy)5>2pcWwXdG%v3Ulp39bD$}yjC z_8w#pGb^aZWEQoOj+ecn4OF6R1e?yTQ4rK~@;Nn**~@gHnm`k`gKRnzN{ykOl2hb6 znf6pESwp5Tdt7d$EjZfR)JN!nhsky@*YG`mGxeTcOjTy;K!1CIY$4l{X{I9R*GvuS zg8Uluh6q>1vLA6Z9Uw>28g?vQfb~ZKy(NB4*SJGv9C_Ibmsraw_i@*AoFa{?`NjoFHsD-PkDOeE`5 zqv;~dF!mPHi%w)($^w`JWF;zq+9x~A9%i%XzVtxVP}C{Md}g=P4cK9H1f322=1el3 zDod|oj?*V;7qyRBq2N%Hi>Vt-B-M@XNz2ere!$8z+vp(lE|elm7AuR<>>{-?KgI7< zEAk@!1XoX0Y>8A=s*2nX`v_v}Xu-!+7#qTrXDc($p?N-)VcA(sH(57XIDJZCXFucF z>on!28pvfe}ba-jSblR>_v_L56g7Wo^dugsUK zCa}Lo?WJHQ=8~@^f$D>3Nxuw!RYU*vNf1h=#5TN zysVDU9=Nu9$#1Y%)m6xi^f386`a3ccXHZMULD_Gbij0|*YgFjlzhN6Q-KZthLZ4H# zFMSzXVX6yLj44HrV0X}IOd|D$nMf@sF4E`FGLYAGib6}uStT`#yh*pEUeYg_ zm&|MCJ@tY9%p9Q?q7}@@QO&NBZI&G;2C>)C)up_VXl zb*q-!)AWOwPB^iEkZmY~m5g>YBBMTaoO*-~r*RgEr> z^Qs9uk`9rD$ga@`O!bK(kWD$W@ktWy4x`Z&#;cQ9q+rtuy%-t5mmrV%O#oKIchTPuixR402Fc;aUe*6r zh%b$|`gyNl7mXV;Y~uM8twNIc^R|~an7|yin%l>O@^k&?nK^lKQEuy+5KhQfbGrfj zT5>JBb%cK$N1pG6uvBiCav;K8+^`cP;6Iv^y%@`dHlD!Um^_JFy=4l=?wiKZJ7*y6 zOpfd^i&F;8;jUho%YC0Vp9^CbaEHe&MEb?tx}Hmr$B&$~@G|7HoV&bb1@c=!yVYyPVOP` zGxqm0=d*Gb_PLu|Q0o`$cMmu3$R6zbSME;jz1V*`S93=?%CL{?=KmYY@f)WYupebP z!0kGA0OdKzsZ57ZrbFD|=7&+P!`!IxM^Lt-+>D(^QNClSpJOQFajpe%0_8lx?RK0* zSx<6vN}WP^PjQv1okp2YbJxPopxkG;W87Jk{VW#|`a8=1J2$w(IUK_|Ze!u|IF9q2 zQGWr)a)CSZ{sNBYBImev5yy0ibL_f=Wn^X5tFZa2M{qCb~?sKdCAE167aA)^D zKpj2gc65D+dV0tu(vMJAk2reCBh=R;Zggk{>MVn!FJ_?L{@}*-{sVRQ2UnPWjQV@b z-J10nb@-S&67&T1_=Njo=M&WBQ?5zfr>M`TINzS4PM>k=PR~%U&$s~@&rr9|x#r2w zQNPc*#qXY@j$d#+2faW&zu@-dyg*%NatmCUsP9b9Ouj^&zvN1|UZUP#a`!*KMBTsQ z8V!7f`hUeGynTf>c+GK1uh9;#xhs!eqb=TWH9EaPd%WR#TzG>vdCMg=c#C#<%QgP> zE!yTSr!M~v?emV?_~SdY(K{~8^d9Z>p8Ivgd$iSiuENXrXs;}8$v0VOvn)<~JPYmi zfg4u&1KREb_hIn|v>)8ck7&b>oHg|$+VLaz+trU~%WQ6JcsANIo9nSM8*Q4+^;UmE zyME$kC4WNOe&QaT`-JxW%*9szj5hwv>F0b#JAdXfvp%D(b2wSs9JF^1*J@`D+B}E5 zXLY09-Q0#WH`?CK{d(4o_Rlrq^$AzFbzik`Wl;a{nw1xX)m7^mrb?<>b%oS1h!-NQVz^sT%J(omGyuCJ}!oZz~dmy5p6+^vqUQXWt}^5tGG@>0*b zk$nm_iJW-5W#rAD+DBFx*d?+>%kGiND#?+>3iXTZXBirqFm6O7r5qF4ck1}a_4dh; zbCyqw46HmevhuOnkw;?YM;`jL5c~Tv@<8Yc>~mG*&hhK8-%XJf?rp`scSatq_Y3x) z9_ie*A7wZkd8G1jl;c$7kY9gCSuRFCin@yO+>G4$><-HGAad2rKTxh`k*T#`qHJ#? zFSxT%zE9W}!6&t(_{#Md-ceJ=TSF9liIPgbX(2T~+E>dTw&;12!N|vH%=|A(D{u0# z^9c$k|Fgo6r<4JFggTJ#t1HCMHx=R6+l%q*1A_QDMN9JCOPAsUE0^JShn3?iH>ki* zkFLlciK)zAORUNt8eE+pH!+kiFuxW*ehtST_$7ireTwH--l@Ykd|Qv->C=#Z5zv@_ zQn4w&u3T77tDmwtTbF$4IhHG}v^XNK@a-Vfs$-EjVJp%MJ` z$|L!RhNJiooksKSv@v|k31j&Wi^lO!wvFdYotVJ?e0L&0^TQ;5mwpOgI%q2YIBXjK zy7hFvPVx-??zr#xBTHuT?{|IAC!L?gmw7&$udJBMk18||^*Nt^+xiFIn!11=GG!rO zV)Y{4d1x`;^zIV=NY0O_-(~#hs>}Jq(JS~ysVjNY^q+X&4XgOLldJj6Cu>mO>-fVZ z*7K(N8~B9@8~KEBoA_^k+RXoaWD6hm$5zz;cAg2|!ACUO$^Y8>XTI;$U3`yCyZQO& ze&OZs_MkoX^3!Xi^XtFa$IC|i#?M*4pN~Cyfbah7Apeu$Fxuw`f41FGe)q6r{EcPD z`O3#m@JC*p(BAqE}Z8NeY(J_i(KNzHN4DMOTB{jyUJJF ze~lmiMPxk%D zAFY?oH|zU}moNLwKRcU)_7|r75(Z8)n6aJ3CZnVcFJ;6{L4UdV&|hv!<{xh=<{xir z_TSqy?7z2ZW&hbtC;QKCdij6%W|03kZ_?dg{JKlg!pnRC;gjyyGIs?EPx#++e?79w zn~yjC|1?~h_4Ds*ApEoZ|F6@3G3V(2LIdL8E&so{|C|xQadj>4!^B^i!Y@rPxfZX7 z8=pA700F`P2oHGiK`CWg(udX1D!ESh9+Dq8T|h7{@jw0vZwLgt_@=5)QO3|7K@ zN%#^dNx?1n3;(>oU-!Qa>M-@U2VpgpmzE~id>keO3r4t`<=^y}i!uL(k2GIw`HsYM zL}ICgAwM#V?$P2mvzx`{gH0n0%JKMnVxeNhdnn3FiDeY0tc1(EwGMCIq<)jS)dO3^ zrKJgLlJxA2RfcN@7L6?xn3@!rmJov#oCU8?h?xFmlsJZeIZdsaVxqvZffWLS1Ir7E z|FyI+{R2yTb}JMG35#OU=%T6B1qV^PdGn^t17l)ibJtKQ6WBVgOH^&FyDa$CPDx2h zK{@|kyvBX{d!rEbo78DqJuo~rHZIn)x^rMsd_2~5sg4>b8Y`|&os=2}S0EOsPK<>` zsDeMqyLw<+_ug@-X)(Q%Qv-YVNlgpv5{Ct35=+O%b;Y_csVLarNmoCyFP4k(>>qo? zdex~|(OUTWoL66wNr`>qu-0|%vN7=~NxcKxMz;zIFCnbU9p1cdL|}YU3Rb1AfoAKT zigjhW_DM+%j0sHb9fO6udnKi&ip}RKd)I#-?_66UB@w$XL&`7*&JQ~f=9TjB?sX!|T-@uG&s)dN zTCsmXEw3!!ZNj5rm!reHvR{*3NozKb4D-spiLra>~IG?mc@?g?Z(RY9DhV z$~+A7O6fShKEB+0l}idQ=V@oJ#NZprc%>(vH=VaBy)sic)nUAn;6x|tSZEWNVd8&b zVI--Ug!&e}qf|{ z;jU>}q9m@p5+xV(Op^T{N%Hs|DZJoyQMv|P6lMDPGm@-uT$0}%l)~TdmE0Y7iIO)>8P#W|ExMNb;{(SCr`&!X@{BP$@jHiX@Mgm;BR8NwQFJ zQF7-BN^*>!D2Y&;7cI*4_ED1i+lHbf#@CVDOT$I!+8ZjlZ&s1Q-4!Hvp)yi<-4c?2QV~(6&nY0u z15U~RwMCR%VT0surIx}c$R)XtlH|wF()x#$KZw$m`bL!8mKT!$+sC3zuli7uL+?ob zhp&s$Wwz(B8 z@k*5GzRyMJI{k;_Kl*_vxzIb3|J&=5+;~~??|ojBM5!~9|I_25OkaOk@=x6_$!dEg ze`2>NxntW!>H2=NSdxkTMd@mpCQ2eSS(IGSUXs)&h%)_CSIPaPlO(UT7bS7BwJ2Tb zEkv2Vt*PW*+fbC;^170HQKaOaA0|p-ZVkyjr;5iNBFgmnWhJ>NSdz<&i;`PcSd^~q z1tj-AUn%^gO_JA4Quq^{D2dN1$zP|C{EIM>yE-Acn}2#Gw0nBbEKw3;--yz+G*j~5 z_f&G<$&lRC14$OWBTBBp4JkbNisYViL2~aqE4iPZl-%}XlB{z`ltka(B)RfeQKnzn zB}vT=QMw|xNbZ3fM9FPgBl$mD`TueD=3y~M@BjahB2=`AHWWo#rNVF~MJOR92`ySE zTl*^0Mn#*Yy_5(-_8v>jT7{yWx&M6giMh|;73z{ zt7qWzb|WVUnXAV@$NU5>`h$?3^ab?hAOwMf3DVcjj7e=6|W6NrmE0*w=aCh-to6iY}+i6mrd zhXH@zhIm{sXpLKh^q+p9<9xx_@&Y~S0sa#=(1y;0G)@Q5`8GhuON10@Yw!mxLC2bb zf7}GP@(lPjCqduTC!`*bkl{v1 zuXHA4b~+GJzS%;2?lQ!=FA~xutUyyOK_4>%ZDj)5`wSr^){v0?`UJ!q^&md1196Tc z5Z`hL;#vm@nHMy`4^js|T^0Q1-QZ8`1d47ar0-KAq+QxdNC}q%pD7Lgm(Ad>k_2CU z1Nb)U!H*XOzfK6^lr<1nSOsx&UWiAmgm^V4A%$f*=zD>as3TEI1Ci}0{)Nppo{x}F`Yn%7Vr<(6EdZ$fb6A&v`_h^AY>MrfM0wHbg4f0RXT+9hC|?Y><9f$4fuUG#HY3s(%82FSIZGHH%kF`Z6u`Y ztOI>c2sC{aAtj2Nke0;(e*F@N53>MQ%#oi1qRCGJb$`Rp1-T3Z?|&g=mV5wzxF6zz z-Gp?FHlRZz#FJ})E#-vFCB>k3F+tnrf`0M}^gudj;Z&f(V?ugZA|b6gj*!V01=PO> z@#qj>-%W^byg^90>_te=z6xYd72NXfyl>=&QA*4@9fKC?!o)aactra9>w(|q;as!WWg3q~>kW$SG3|s(l z?U^s+ef`P_LT1x1&{4yLbmOmtG|3_0$UBJV_7YNVbP_U;wSr#XNJty0fp~re@Jssi5srfQOTTTM`H<%VI%)jv%C0-UX(HKs@9YAOl4WOYK zAx#ev(vR$f_#tIN=E1GN1G4`pMM%?>Afz7>1ASDKkaAoQcxn~!EDs^wnv0NWzYO%X z#e}q*EWn64@_k*}!zn^~);N5hw`3G_>ksfhe}VYyMQ0?}{M4FrSbj_7>vmZ$MjSfeuIqzDOmcHKzcllY!z7z&{j6$aIQ=cw!jn z+S}mI1VMbuO+w148{psa2IgIZ_)j-N+D2zWx}iPzp;sVYegX7?^PqQ{6H**aAfA4j zkpA5OxaBy|S_k-4n~?eSAW%kwkYcMwNPC4KKD86{9u?63il7_hKnqF}(k(U-QZhC` ze0CjBO9cGrHH5S;{6H!XFo+A-zYMr-2{2$0A-#_RRG#@n?)TscLdvJ#gfz9Eg!H)Y z;7@)A|HMb|U%dmLuMgsmT@Y_=BV=xGhIni}A$>sRcaY1JhVS1cr?#A48F3_|9W zY(iRBCg}a?gp^mQgmm#I5Wn+~khUlh;tuyA{xKTjh7l02y$f;mP(n&>AovOa;6J$z zzL+=oao2#W-3e*;oPpd9g!B*_AlD^euod_#EP=Pr0{M&yDUqiLnZgEy^h7=IH|v0( zp$+jJnxKm`Kx?am?w}FUEOrqxN4G=VO9|pDw*nJn3F!)3fJKr({SDxMSqG$x5K{OB z!GE?2;_AGF%&rxn9XY^Xu@vG@*$657S-^ikH}p4uXx`Jn^%I1Yg5SWiKMCoJet`ez z3nBC15a=I+;NR_s_>LZ6e+MBYpcS-26R@j}kba{Y{H+zBdrLqE7825SG9mt%0gQSB z)O-d0Oa>t(?FAw8>@$c9q!7}plOgW?fRM8DK5#S|;!h(8>E`zcX=`soyfcW95^)pa zdVYj-9$(N6p1|84giIYb@OhmqHG9hXD$K7tReo%l92hr4B}2EgmiQU;!6w( zDUJG|V|Bqlf0U4>qz!QvO+re81~5S#Xrl_;vzw64vlH|OWkT8;MTiH=15ITht|CQ9 z;gSUXL7b48w+M(#yVhr zH88CL{Php9gWvTteo_Y|w|Zz*o-z?sx%l`DcW5$rM87+K0f^i9nus zLKJDUgA*69S64H6> zAinwv=(QIKDUw#8{J-UmKws-2f_^Ioe(PG$KZOY? zoPvb3%>qCTK8VlXb^pI#{oMNKhJm~6gCWk{e+%SuS)xr2Git{DtB7_wV1r^-T3?@v z6C*m8-3c+TMt*;EMv&+yW$q|YWbg6%Ng1LSs(GTJGxxB=fwe@ltn)!pXzQ`FI^ds} zy^c1RN3<8`N)x}Y!yo;*(kRitW*yNvuWliy*|qcER@_YVhtObDI@K=p)=89Td8JU4 z=pExM`u0TLCUwL7AG7z zOtjNXEZYAmh5f@KC8Cur?<0Yg((gI$L;Kq2;?bVBuJvx*hlt-Olz{Y&YqX>NcM!d) zJ^@YM@{Q!;Fe3V-?*o+N)b6kS<^<8Fw;#n_<54-xATQCw+<1io1#56Q6{v z4>W6is(|u(y2(g^7Tadlg@~WJ_#qNk<>PAXh50n+JVfu(jCK3c&k(=%;v*EhqLeq4 z^8nEaYagR`e2YgupU@#%z40-s%QPC0+$>Hs_Dw-tU-#vEADrCvH($6_o}jVgLq>yF zsl?y*`3aId7&?5y3&txK^Az>UJ6m`!Uodx&JcJ+rOkC_ir||$3xJ+iCQ{(cVv3sr3aUY?+~4ibRCp+ zzBZZ>ePuKqaYV9v+9vNK+CVb{#c%0fVZ8_1mr2Y(rTYZkb8-!c|7|h@y*TWw5;kE; zbd1hRWa8-?Hlia!wA_=I=)>wC7iW{ePg{_Qx)MKZOkBu9d|`u3bihbWM(_cQ*D);< zS)MmNdPWuY_s!xgRHSNfVHXSJ&xbQv$a<5m`@XWRr2c|eS?Kf!*@WKSej8%7eB1 zMXDUp-NFpC`P_M(K_S@Rvvv&RI3R2EL;VQxTgn*dqn226=Syv(l|8;tmnO4FOuTBQARB^WLJ-Sytc#ER%!987dbQzzT! zI^;`-G82UvZ{PCX#-8{hrc4yz(0Dg>jVsY7ZZT18Jyrj3^fjXWUop{4K+1+selWlE zJ|^0l`Mr+Y7S_LdX+8>GZ!oxj4#wNBn2)x0xt>>j0Q$?Bd=wwKame)`+=pNN@==)Q zZ2trAtEBzGjC|yjRjhN$5%RCTD<9=WvN$Jyb|QWzTLGF*KRI#cf+Nwvas|l8xU*Sj z#}%SYPZpq&F|Vr^osSZ|*{1+y8-J7jtP1-%lv;qsZ6AG}>W2Fwy0ri;5@BOZRm1rA zFDOKU`yV;9y4sNXLz@fHuN=FFe1|=V_SP*#iYdr5;Va}1w?`qG3X@S;uLSEA{-_Ww z{k&y!F24&Y&s$%JDpx)Uc<=%C$8WL_t(`bmQIiOIM63vX`%_W2;RK9d=TH$+PWxqZ zSsLz}CyqtvKyJn8j4_;_@%u&SiDgic-XAz0yUUA^|E@Ai4PWq`eioq->SStzggfc~ zsbDdh%T95+{AnH0&FaNSVnK&RNH(00Ul)tfb~eQJRNk5R%fgG14DDC=Tq5M7AhQ^W zb3e5DIs@lp?WbZCZKs+TiQzn~<}N|wQEaCc`a6*N%XgL_N6!L|(vNmTkDV<+x4-G> ztX~bf^;QYm_~CY3q_8dVUu2b_0HKxCoX?Pt9z7+f&+)-jFb(!Yb#W=GktukbECZvYB4DvDFz6>1}e6XdF zW=P6&#FinSecVT`hr#||E-pg_hl+odi$lIvd@DoL^mi{02EzR>$X|}m%y!gT>%)07 z-(8N-1?5|76<~cHT9l(N(q-O#4kP4w*%efd)&AUAdsESU!RU@BXIg0DmeuBkTWt$3<8#jqwWfdJXreG6U*MidLeG=F>qhR>6Gd z_EjR=i-(-qn2^skmnzZlpP+$ZCws?a0*usKf?$mg3rRj6r6rQgjm zSYN(pRfy;M@5KHfxG%yRtB_F0G0wVD$S3ZpD&!!4gtsso?n|Hb)hL?V=e!vW`ul#M z8d0SR_iJ8<`Dxo!qwgc@xiq?{O?sP1uu0`onLH)~rBy0D}@HOT<>fACZdTDDAK@L?{j?{c3Sv1AhW|gjk&jAy$?;)px_^GE`P0u^Ps!77Ii9n2#2nP=jUOK zTIBoU;K%2;;eOkDsTTbf+HlWq?i0y3g?qKAkjrLoZLlht4?m+82|B1RIJ6e#|8t-g z1;sXJnvTJJ{ccemS{IwP%BTVM@1Q^(N(JWjq%k##0OEhls6%NRLMFV8V7!}3>X7}zb!NU5H;8Z1UWaD5f5=H5@+3O` z>wNv6Ar(Q2aGqM`>X6vYdWTwB@E7ycqsG|#xF8euM`>d{T9SN)G8%V))Hm8*kD@z< z+S9(75bdK?kIV{m-dZ37>r-S~kF>HMUEj_R_eHmFJ+fun+i}m2OY_Kl6G z)>MGk{348hQl$|s7%TX}od^5zO0y9?d_8(zzya3p@|i{yI-RR_WCGe3w`oLtj`uSn zn;?Iiy&KWOP45o{cSCzVVU1{DpU0$K0Ngh+Df7QKavkTEl{%15jk%4e^`wY*R|330 za;RxUK3*SrR-A_Q;O%cj=~mzVNL+^d{l#b_vbwxNo4N@0Z!cRD+8b!^YAgop(=O12 zLf@2(I-Z32o|kGu+&z~xn|VP0+SP=f^K4b?S_tRU{YVqK;M6~s(iue7Z^79n^kj`N zHXDNd@pNcH@{E&?A!pD@AFL`rn>4AzF5%LZ3JI zMz{${Wt6BV|$1iF(+=2b!r!^zjUE@_6=izx}rPGXBqdJ?# zJz>9d&6?4Jm!?9Y88AO~r)Cs76z9NLZAr$j-HZlkYAOEVa36N2 zHlsB{R?h8(aGuvNo6%~;bxRF?D3kiS4fEsSVOjY_7xFW3uo>0K=ErOvgZ<4PYeuU3 zoYgZv!SjA(Negny@L8!70Qn{&*n(^n73?GzLH`=kEvVKllYW%}>v0japyQ7`7JF@h z`2`sruh51;NkGq*_nbptJ^ zb?C&_>oxE^6#LbJKH)v4%Lie<#MoNV>1d6|ul~LN5D{oaV=*%f{}yPEe{(CUGTmqD zyc+KBWz<&0Q$UXjT(gt3KY6GX6{p@etx|{ie==%Ctj5Zw4)w6#jW(^wj}pBRi^BfC z@oq&*$`ZpoPhq{I@3o>9iS%PSNzlIAqgFI?Xoqu>EUcIQn^vUDp(fERX-@i+t!zaC z>cx-C#$Y{IyIaxLe3fKPni26^zqg_Zg?&o`>frn(Q`%5ipni1W0F=MN-G&xQZ3$kb z3j3!l-iG2rze~mlLcUIJYeT1;nqRGQgZVHt+K`N(tjY3DxKEr7+7MT2<-n6U$e*p& zZAe4mXx*#dFyBw^ZKz^PQC&u)1sP9tP#b#bC85OM1?N{Yz71(k9T0Y^hV}oG-iEY1 z>{lB8d%c%X*oN{mE_#;h!2P|id0w}uHeZp3@eO@wLp{6rszRUWllHIwX+zU576hFf zgZ9=fZAZNp1{wnu&|i*VJ38O6KZ0Kr{=MR`bUP9Y+;O*5Ly6Sy+ue=?KEB+AH^TY8 zc%&UQub7+^SOfVpVbVVTe2vJbNkG0`vuj7$drXg|U-KjN7x}iM-J-8omlVVE$tSEG ziJ#{D(r5wWS@^ger7kcCE=q**?r++WChHaH+(fuP0J1>?WTUoa|7gSzjFtQ zKRH$KV;7wNtpOcKMttq{bN69=y`wu&LEg@@XO}~M);#M#-8GXNCse=}$m>9#y%{6# ze!zH6*LI*G$!hP|ICvh#_jRDnhM#9s#%;;?dq+ADr99C|%n`~9vUH-QF+D#7oZ&p` z@phuPgzYtdg5iGi-_VJQt0|dBn*QahQYTvS$m+HR59Ie3jZQ>QOgy~eBg}7=K_?3Q z9%5KH1O2O7b)v4QxQ%>ftfYSnw@zd;pkUC~3Hj}Rs}rewKHR%*7S`i&Y$y7#g`@35 zhA}B$^t=Y?ia;wWSN!9s+a@g&Dq&55?%Uc5y5FxG#RRh(j&Z_%B}R55IpcwaCS`Cxn>^`8 zjh=W9xkyG&gCzi7Z>1`?6yviN+XP;;fs^vX<0D znNKLK2eEBZIHv1hMzs9V9yIxDx6E@%IG=SUJt!pa*9DsepwHX(pz{$oZ+@mizAg0b zLGsbOk`W)^{bSgj9<)vTk@BW9FkZ=|9;E7dejpdaer0F&prLISZyDAfC;h1x_aL4q zP4>Xcu>RG}J!tqxQdhAUw0G=750ap-8{WAO?yHuu`T6x7F%~k1^LKo4@BF`?WZ!wT z&ziK?w5k^wiKZ(pG>3fDmh45T@joJNo5Jg_VwGO>^c5p7q80XM$AMlnUjD1$Lp7}D zQ-fYqHes|`|N2qV-Wsc3w75LfoDvJKM}1v;kxTjRkH)Lve0&e+MKdnEI**s0CFPGr z_oBP8dt$ENg#CT}v={A6DBCc7M2+~X7`-T<>G!253bbce)r)@MfG9;a$p4zIUL?X` zyMO#X%y+}LUbK2seLg2YoOhR*`Sz3aHq3dSB<;Ot>q8rR)Ri7jM-k1z)rZbCxrD?P z9V1#{RUeY^JNwc4Bl!BFeaQ3FfUklJJP%zZ`q1}{5ogsFLjFd}_Mw!rp9%tU(WE{@ zxevKN)z{U`g8b@0edyt%`|6_#(B8O4A4(Q(3gu*j`SKj;LsCNtn^h1zZ=_H3p$6ew z@|llgNqZW`^YvG`$J^gVM4vg=hc3}whG>81K4h(GF{S1Y zek{EY^&Rc0@tWF7{O5jsNKx)MpIZTx$02n>+3DJv4C7nX--m)0Uz<2{ z2gW1tsSmXr(A{OU9oAo9qz~1{1-^9O0_(>=(T6fCbr$3}L4Q08`q50ma|xFnus>Yv z{V3)2kiXqm_W*(q1IgcIGW(vMg+TYmXr4}Jx$AIZmMkLikRCVtNTek4A#`ifm@ z2+=7==C$Ni$(XY+zVH+M=xxWY?pOEj65q$TAJt{a&;Hm9`FHtTKe}I~b4tYxo>vA} z`q4((-Nps);XYS&?netZa&8GQjU@FY>HP>N8I0)2zi5iO-cEd@P72C+t9cp1MaWa_xq8+_p@GR-(mjYkNVMZ?(#Lpmten~Ui72tkejPc z@|`C2bzk=*RX2;CPgBsJJf5G=eSfZ@gK)nrFYQO=E@dN^+u{CxU(=7$WEO8ZQwi&p z*D~K5dn zT9dRwyY}Dvsg-93km`qS(FbaCNzp7;0r zw_)@STsP@xA}ZfAqL^o{hz&p#LdP)bbKzZ>FOqm{j-`i>yX4e6 z6W{YqJ6^%E(OKlyO`_GFwBt~o#`0?er-)u0-Hu(C{L(wCd6wwvo9$Tbhpc|)-3vsA zxwm7>J)eYa_njcx+cb&afZFk? zgSqX>X1+u}mTSl6R%w1OvrZFDU)PSC-ZRfBm%9*sl6!tU<4@{74NDNM%+iiW_87Pu zErI#+|7yeM9e(`|eB(*{@xeCywdc??NyT8IyPDfDr}=H;9}+f17nZc)>}rb(G8^5A ze)hTz^S$^r_u?|Ff5hW9{9qz3wZ{nNe?77de>pYCZZdt9ly?kh!|OCIsixe8^*!&_ zhErq}w!JNf`5Ikl!?kl|yc%!!lJfee+c5oT&eM{mkPk<-+wee<<8)JkJ@K_s8#ajF z-IQAj>v>474e!wLTqG_K0RFl*%x*W-$EO-Z^fB%>tgBvJK5a=O`Xoymu6SuoTeMn_ zXwzS|~TE55ef|EKC*7;j}%D^|DkwBpm>-!P^m{E6Q!){3oXI!OHOY^`{w%7?(QDQMq% zyahi#v*^xnH}rphs0CkgV4hODb&Hg5X>Y-z7864|F2ecXs%*i2u@}*x!a3p}WVGOG zH%xf4-C_QIsV#VvIkMyg3!MM5xE8$rd}k!joFgf}G^7PL?z%3YSq=NG?b(9cv!{4= zorio3vz_-Rl|nMKy-E4rvn^PrhTCdyG|W#*uLb+(vm^^_g!AsQuLUO-JKWZ(vL)rq zm0K{+hN$#%b*L}2sRd_i>KI!k)Gu4sg6ofTJ(pbq>$!fW88gP| z^y}lW9vwkTZ`(MF%Xbo$|y%|gPIZMKNsrfZykA>^QRQcgNX1Fxt z+xLE|Sbc~7*IPGZJ}wS{7fP^y_f9qAD*X!Et-dgxW!lZS=(>6zXPO&X4{y|rJ0$u2 zrI>J@XXKjk*=y8Khh5u;33fc*`(Xu{udPKR!$G4T~nG~vT1et5leg8isF(1gd;&OH3V z0sCRIvk7llIcz?-7S1cLbQ4Y;wUFyff&6|W(u6-aosz5;fc!RI(S#q>_?{o@zd+h& zU)Y5Gf7l%eiGcRAMjLV4QLm>BmIsJ$`o0k_*>&lFv^eB9cWWaqGE2$5lL+foT-J#3 zcumC>ha;rCOHLyWiyBMfnuYsY?pY(g{-Dp!&P$W{L$QsxU2SUM9_Z6(YD2oXr{KXjlXLH!IbM?^OxZ315Qywo%QBtKgDGYIQTnjRM8&D&-k1M-08xt>Rt}{f9+WV9$yyvsmkgY>CY&x0srEcJ+Q$D z)=xELUWd(U?C*vB+u+rJzl6yBicp68Xt{j@PQIs*>hQ*h)c&HX#rA{O>1L9_vLe9!w- z;i5{~4`11UrHg}B?3je}7sS$lg#xBphH~J%`u(oQ=f4&VhFpXE_xV_lSNA_Plx4vE z;MHD_g+xELCFS^#_Pi?VvDC7KrH3Ctf4*<)@iygI>4=4J{`_Cm<4Jafn(s=G-ysS0 zc%4#yaLo>AFY-=3_Nww+=@<>?E6KMWW3I+jFB!Nm(w*w@^xplMKd!ox{+Q?Mv61HN zndvsr^@jC$hn>=i$sl-M4j!t<*`h1j9y&ojOrm<+82vKpl^o1xr9wUS7H{&s!Up5r zEMAZAv?OkS@EG=6gTEfLJhY%~vOPrlGh0%R!=lx@5(Hs=d?xE~_q)@!VUke);nzB> zKe#gB_93_*D|+g%gI@C+r5&(7!*%m|c6H#|pYVE6ps)@z)e}8uHKD&fS#?<0bZmrw z4xX2nAJyR}Y*HD{aj-tIk##ugtC5oC2WYSQW*wgMh}e!ZAU`M`b(pqL{xat<#$8GFV~TO`JAL%hb8NFboVcY{psCThpo0Ko?R0T_o2}CI&9K8 zq<484~qypV-1WEOcrx&}|6j z*F02zrZmL18Zo1HoX?FnG@W5CI{}H@UU9kFEpLx8wdA?l3OiK z3*7Yd?KQX$+l*?l3E$cmBHr+N*h9S*`uegI^Z-+Xb(J@l5B|;7&Q?09ueKDW4l(g9o-JOfOe9 zC;F;y4Gv&ek7197@v2$XVEZ4FKP#GHe4K}Cuq=-?OK=_JPxsauY&@t?`K!u|)PEsR zgH85nZz(DQePgB?_iWPd6V8VB8^#0Gm~%GXaitfGk5*cZ3&p8s7WXVj{q@hP@$`nU zt$yw>UiQ#xeEq_cZ4w>u{26tq#w{m}4qnuP_TQbX#=IM5*L8=%d2d41xc0Es`^_n^ zUX|kW^&2@a`E)^km#|mklh>cWyO|Bo!{YB%Snk|P+xQYh`Y&m$!a7@y^O~-K^3~Z@ zxJ}8TJah}(Uv05fIK1}g^~^$JQvQQi74E#~xb3Hf0nvXftMKEl_n&!dAYV8SRpEoD zc5ZXgh4q$HsKNy&CEa#xy-3RMT~&pn6i&~+aDw?+PFLb-ZEx3D&tZ;-aRG@D!{+J-z}*isXt`JHvjr`&MAfeOKSD z3Ry|oSG2Cc`$X@BXZx5CefLNOW{R5kA2YVYzK)x&34_xOyIn3&?v|EL}GX<2ci6nE#+7>TrBC+ z9moeNcR7CS#^oD$luG7PJzj>F3tcX|<_7C;+Fgcc+*iia8(_SX1!Xw+c8R^`Vi;e< z<1(z=TxI5ZZ5yet5>$pa1!CfPMWuM}&@%InHjv*tKbPQZ z%3-%-J>dQjsw=@6g)!Q1{yneevPy8-OjJdU60Gls=n_0W^VIY4OD!_~de0Jk`GVx* zqw8S)Ov@51_AO?&%rvY|#-S3d^E2+*^)E1<$6HHqIal7A-XrjSGGTQI4qkp|_W3B( zzdu)ug?R;;a$O#z{rm5Wu_XVj{I?~LFUgg~IJo4)m2_{&uhjHnY-5+(z2_L5mz?lo z{7||wZs&+Rsb7Az7>hGx%Ys?p^-tH?V(h(YN$PI|;~70rj2%wcJQS0F_2iH%#sQ8m z%H7>yzoht!F^8%Yf4#FPY46Z<5ngak!Nu_<^k+LzgqImyxjShN>lag2gq7pJZC$tn z&S%;4`SLFQdb9=Fr2fR+BAh;2z|xm}m}n`tBK-MM?CLOoXwS@~2;bEdDO>h}i}D(?|-_bi|{pG>!TfYkUyflMR=1?<3>>?Sj_%ca~jNg@~5VLT+3m>=%&$D+E z1$e!dS;CAVyq-MVSAdyoZr;t?3HK$lqyYcyOWT927LfXisRj7bzRWgC7KP}icM5QD zVdE1;XDBb>T7cIrYUz26G>QMvxBwrh-Wj~0TZiY|ryIL4ok@6N92IuNK&>a)x+v2I+od<6%budH`W+$_74 z(_9-*mL=U;K9-Hl#E0%z{AuWPNzPy$fgJ&B?oJnK5u45^4rSYT0FJH~Xk{;X=cU{4cp)hg3 zVhg)VBiy%xH5e;jTYr1mdszSQ7>pH9y_M3mUqR|0vckC4>eZSlM|eJRsbKs)bWNlE zG03kLR*VI+`@gSv1^E--n1{1(28F*~4fnNULLLqpIgVdx!F_V{avnyn8kc#D!Fp}o zm4`3vdfXym1^c&VSss>{^j(grI;8(4?QikJtD>IY+@Za>hi|dh0=>8We6U|L_HQxE zX&v|9nV(4#MDgzs|o@kAE z0I#2px-oDp!}_XIHspu%0R|qtw*S`+1m`Ph6$7ueD9OC=@8A2{-sj@PRV*i+FG2Yg znYozec5lJG!82t1N4#?JP5T4;d&l6uxpyRY{yuHh3=4+m!3U9CoEd#|RiQ16Pvu(< zu9LD@y6Gh=sedmw2eWTEQD-G?Nc6aW4z>{WTqmKdNA&3vIrtsJZ}wg}oQJB7Ir!X1 zlYZ8JugBDWzrnbo`thZ=a3AFrzQJ)~!TTTDLH~Phzrot?w{PfFf&MFu-{8+0UxppG z!Fn6YzQJu?ADzt;;5-b^WaCA5Z?SgU!1@MNWn=E`*0*gv;r>*N&c^K`QAycBd&&5E z&S&G@ZY+vsb}+s`m2B)A$M#xM0?xX zyR30D9maph?lqRl5p3No2<@5gd5wq8y_MRt3HA@Ie2t%f9h9Zsg!V=IUg1wCzBPZl zCqc%u@Wm@U$>XZNSPS;!$JJL@WQgXSECcubpw=s#G!q=Kon;Rx-y!%4Khfq+)liit zy6bZmwu~_Jwupi8^uEc$#t|p$M^{1rKm4+=wz%dBd&MK9{G5IkzAN*#Z&DcYf3-vw zE^B4~;V+;|{GDT&xW37u$*~La-LyCpZ(Ft0>4YMj@4&m6I6AW|OUw(#TW~fL?^!E1 z5Xu4drxY^r<%mOU*D~RL+`cdqtBI6tY#xO2^!k^0pD_DD8&%MC@h>sU;<9WGT^R4W zD=+b>2YVln+=AC1Zs;YxeC|Q1`BLb=n{(c`;Ip-Afc@CplYv9u|<~JY+!#E$v($#me>94AB6j&ttJ&m(G^S#JK;XWmr}8)e(%$%QkZ`l z=e#~PVs~zd7HRL<^Jmy^y}TKB-BzMAw4dP{1uF%2w8HtT{QeX-?Eh?{9|-gN9`qCk zFr)MhB)}JveTpv)1iIb+3|g=D34WHOs`iy-2Wcj|SrpQ%S~=A_UOUhn zXA<#n?%2V|pD-V-xd(Wp2bD^{~PA<+M4)d$#9b!XAhqyOgjE&0?I3HOu#2uhFT{c!1MT3X*~9;6=!khcv z{{4Pyx>zg@V!QD`;x^=mxn&IgbH|e1#22*u(`dZ@{;Ku;=h#VmJU^oF;Rl^ea~}nw zmv4>2%Ub*7MOfiH2s=gMs2y_-4cRKh*UOE-8@BuTcS>;+eRnP#SI!%Z_GM;mOVff1Y&(~gU)+GM-s(V<&E^M{rB%dhmYUI zE3-{&H>mx~_vkyAxxwnir=HEEJf-h8E-}3-G4F$>n~yziUp1J zBWbEo-{3_EPCcRY@cl8++dl>4tFfks8hYS-|F8?fQc71pH*A9Q^LzFdHh*+*))d&*)x@___rcp=h;wM4f&5LV^TGlu7rw0IhxKJY?TK$p6vuQl?;_>*HeSP= z25Eitw;PC#{OXQZB!5qH8x$fsh|Lu{INYH0cWxy5!&)c&tp5$~SW*;Of1{oDc#rd! z^sqH>e%+4SU=ABr%9wx{DR2Mo0ybSG#jWkSoMo&<%m zZR=FZF8*Qkx;i^*lSwqygzmIEYRfP>y~OaCcZdzc_u8c)KDA+VsoZI`P+|zf-j}a2 z&0rXrXF4Pe*acF1#=19IUl~Rlsp$i~p|==i(GCK8Zw#Y3pA5~s>n2q1(UOYYal>ev ziM)XG{!l8H|HOq8S;J_lN!LM{hY{3q4O^+(Rl~^U@Bn|8NC@>oeWSwHcf&}>typ5! z4jNUkarTA9)G%^;t6lUh+M03Hkh^XH&j{Kct-gIlaTudY{sQyu{O^G+O}_AwH|r>) zPdep!)SeL(r!*3UW$!SK1|^q8%>RB`_NU+9Skb(wZbz?Dvu#I^LqO{r)euj{=fGPk z69FU0nk&3sY(*%;q4M$w^e6h3 zeD|(LiWgPI)Zvn=%1>m=TKdW(Es}~JW*n|L`V%Gn`jw}bA3*JPA28o*{S&o+qD5|f z>qYfE`@6r_=O?<#fo|>4iemKli2ja^`-$|pQ(p{mU#Et&chp_W{)rOTsI+t~Rb?z= z8GPv5@DnwucIs*@451#E-JSAc{`X{ii#6}%s<5H*y_R1(%QlJzz2qCLeqE=^w`omZ zSvQK@7YPJ?j0vF5@tb8Vp^lh}DHNHp`5!Tgv|nIp3BOIzM`b z5&rl{`)~PQD8j|)U3aM`L)zcOc**?lr>~{|SmYYLpQ=w0{-$d63poau)ob33q1I9J zvmRXkg@#Q-UM1$+QF|I&hc_qwLdWy!M@=gusS=x&nmh0>G_dFEi*U88RF3%{RL|)8 zg|<3dF*?6SP#(@PaM5k<^*e@FwoS-{_-olwtop zFX|@U{oRY7&ifksShW?4mJB+o3Rf_x6#*l)4tOIrbEyjlRdR{7~ zV`!_8!439T(G0s3ttLIsF=V!TT>ZI@}!`|rYkb~$rigfk6u5rne zVegr|KMIYboz3PK+8>87$}RUC|6(+b8ZXN08;FN6(CMDT=jr2U3;)8U*%lGh8w?lrr0B^Lcb zo5L@fUU$FE;HlAy^xyCYwJPv632VhNQcK15tkmX z|CHQkL|O#2mj?VnJF?tI3+_fzJL5O+dH?JW+NgQ`_{gU)>MivweudgU=*hcJ3TK+H zFqEA5BA<`^K^MZ`J>aSGrIyTvE;HnvKw=wC$hfq`GTs+grztB>pj?kE&r%~x2A57* zrTWPUw0$@^%w5xwaYVc4zSq?WROc(`ZYU7T$XQ%*Wh8zADSW62eQOuW2pLZF3N4yI zc|UE^_PM)L#l+sNK07plE@^#mt`K*on!i8oX0dz{DKrb6K45T%u~quu*J!y(^i-+q z>M6M}>gf%;Gg$N{QNL-_h=tqUhn-Gz@8inoIqsf{Ni?+;BP&#Kdk)d}HLi&uf07IRJ^@j<%Q@1AJJ6yM?O z2V1Am;#MEIGjvnN4ukiBwgyw^-Nl^TUYi((#+j*~j@PEpj%T_ahfg>#4zeZ4r6o@x znN7N!jni?AhJ4Ksk*X==6DRFjx66ylF4AgP@N){;##p0@nK(v_j&FDL>S@%y|A@c& z3QwwQ-JH==+B8~P;@zjbH=3$huP-xVIX!>A_Rk&iyG_md$aeQ)@HA3CMc>bOWuJ<^;8T4iivxAC@U-5t-f3hT>ve2rTOh;TfAK--#WN_z)kRI25ySZD&#~l& z>u8Dyv_aJV`-l(8w{H}AfUvnY($)l=eC zIAaXm{3vr|76n(O(Ea1Qsoq+pQ%7BAQGej_iuKL6sU0Cn4_+kAqC1i?tHfgB7$cTJ z()(*?(XG^#nWJ}N7!oHNxkhy47s9q8X8uq1{GY1%KZEms{`$$Z?S_BJG5<$p{xyS{8ym&!B7Edg z{9oh$@$1NZ`^Ii;EB=0XmU!s=XL1zG`u(Iv$tP~l0 zb7y<;iYf`F>>1o0-^~h;REFn;!@HTtXQ+xw97YpUWosAFZaND}F+ae6H4( z|BjvfTTkx4Vh2b$#s7|xaw`87J3`7)|2sy?(f%u@OUkLw$Cl6cB}2xdOUfOYkFEGT zAG7^Chxt#6n%|qhA3p|K+|C)oWY7NY-M_f2tE-vm{PZX>SN~Jq{;c=`RnkxVf5lFc zevNTl`yczG_&0Wn&PLfXpL+l5D*cU7Lf9zA^8=CjH&^3``FbMr z+SHDG1|WsWMp-*w%t%LFm8@jleEE4TV{2!7R$NYg{;w3{`B=pNjgc|^jsNej+4)cH z`WvhJ$Ny+kUC7`6=%)YW5B)Fyf7YMYV_hM5{J-nB{g3+pr@b!^ucFA_?rdzbL<|s+ zB|sDe0=;*2cU5-+37a7aB&<4ILUMtN*|@m@f`|x_MNk7Go5(~3K{kN_MMOkdMGyoP zR6s-oWD^t+0r7jgZ=w;MdFFe*=bPUjziB;mclB0v>eM;!d5cSp9vl%l4N_4TTypC$ z7qW0cLRRF+YKZ=vjZrLvPxR^hgwY(=HA@JUs;0LnI1DvL!~ z3Ci|YDoaG!T$EL-RF@$r+mEup+P0xiUqF^Zo`H;p42E=t$dDLFDCE?HD%@_!8<2&N z36SBCWXNH(^%Uebq(07Nh_gkaZ3g5Po^OPG6^OH~!~QU2Mfv$=?32;v6WB*%?`&US zFGAjjyb39S42SfCSdiQ0&yL1^2xMmYc_gkmTW!>3Eu;)m3JE|4LwZ3hNG!w|1Ggb( zA%`J5AS)mXAd?_@5NE50Ztj?$pX2F_r7n~6v3_P*geR@o)3L~xliepXr^xF`_l@yl zXtoSVD^41n<>^(F=PbfmzPe}4^3rap!Gbo<`-%hJLQg_rdccoWCKK|qoi}hh-1nyB z=Xp_HlojB(1GpDYd9W;M@K#PKf1CT^@-KKo(~46E5BFvTP)DzqyMlXq0QkmxC3*_WS*vutsRWi*aj&r4?rs7kE9ryqVd>9QQ_f zO;YlEcysgpD3N|^hohK3wxp`llJY90ct>&j+?Hkdi+*d_QoO%+o)1f%A#liwHcWo721qrq69l;hThC3`bR zdjC}3H_REHKCEgw=FW>rqq$lkiQXJ<;La;tdgZ6`^Rn@V{JcJyeqW}uNa+5EzL}4B zvEJw%<#`e5IbLtUpDuJt$NGsFZN&(HD}7Uugqqce*9-Za0r(3=gN8G(3iM~QdkHMRheS`g({^Cwp7`BibP)YCU z$-crsSLlTs34J7b2Nw+;>h)LX;lZR{DM`uj!LE&T=5oEcSp~4juFeq_&E>c*&QWgu zNH2FE=kXKP_us7la-H0^SC~pdi74p z=++}ikon-35CuG$S^j{>mp|Auq$n?o3k$y8mtX#nXXKCqjOf4+pgi}xm97+)Uy0_1 zID?dH$T`JpALS|Vd$W9nxTgUJJ9qCHTKS%w{GkH>`(5=o z&tUIReAYE3FVI3mZUoFHzzw_Oso$R=9JJvJplfrnOy_UM9xoSPp%Fy%1kO|F9p)M0 z8kxsYcS8 zMk9Cz++oGVI$!l>6$QMWKU`>l?>YBzTxNkUF1OH$zH#V-ICQEnKQ2dz6XJs1bI0{z z-pqo^m+yQYD-;j=SJ(YPCtmrMJHAj9@a160R=&dx82|m_Kdyn*-*S;Lr?|-d*vFsd zA|oNCkkwbY$i~QzVj!`Q){u4(9wI{sghJvWiIA?4WJt=X__xXDV71#SFbxia0=-tnglA7V^oZ34j5o>2xlyyt#laSmk(StRzd-q66$-u+EUF(>T z=qZQQzm@e!>XF*3zsFs(y7IlwyOUBo1? z?tu5-ufsjY+}B<%3|=q4%niweht76Z!^Yr-dj$B1@jC05$6zh-!pxy?MV!yq&F5}7 z{{8;nhkT6JS@_)RkI8oflbbX6%GVUn%EUq89~Tw>y-ry!==lA47s_yBTHa*Ia0>wsrxqqTv|^7O}D zx7&HfS-;!aJL_*(-aBh>JLlMQ2=agW)}Pvk71)FN3AV4Bvq4LaqJGz>0|sK?83Vx; z%5g0n3UG9gnVlV!O6!$ZUc1~`syrdjm+P)SkBB|gi$H~dhe!W(>>5XTdF5m0!xi^e z91qJZ^Z@aBJwyDNumX8_1E?4aI1?X$1eH(DR3$o?0;Q1#wKJJ{437((F@pVX9`FTzBV>BeK z{G9*)(64{pivO1WXEbo>@!)qV_Sap0kK-!#|Cw6+_bdO?8VKQ{Q3c5OKh`9~{i_=M zUzAseYwL=e9sYX8A0Kkhs69G2CuU?Y#IjaGd%jf=t^%pBR=qPi$B|Ysg#mCgnK?*b zS*v1iVJq9JRfCozwBi`NAg_?MD)Q$Ug;~SAxtWD=xxOraeqsKQKpZFsBeO8K{Yarz zOm1eLZwNSw@)#ccn)9j-74O2yU)1q`brGT(`jrde+wM!h6C=;ffF{))X6x&BX^q zOY9-`68nkE#G7JIDO(CiPe@ax=cRX~J<=!A*V1>=H7Qn>UIlTx8v>S?N{tg_E!5e{&oZO zF^J<C_Z;N$sT{3E=dFBYZcmgD6v z@^E>AJXKCp1}R0#Jf%!|SNTM_uKWrOSZcO9LVZe|p{`fAtH;!D)d;PgCTpg40s6R) zv?D!oxAneyzCKcaUms|WHs52*?6>f*Hea@XcIsNdx$|!i z@%j9d{Hy#bzNa`y93{>b%f#&vgq?7~&nos*uJE482`A8pKHBK4wV7sBpUM+;A7>^pujL(h7&86l$PCbsh z!-f--uawJ5b#(yx_7Sy6eO#TbmZ{6tz3AVoYO0p4Jr1ic)7EMGw9mAY+V|QuEs99c z{-b09d5P4tmRWotsMqm_|rWE#1~uasvh^RRq2j%{Hzt-6+JJ!lQEj#+1{n^uU;+llzMu&>#UbBRYi ztMheu3*%`qpCYUhVil_NMeoI`k$OvgJw3>7vKE$rar!qaU`@29S#Ma|tO=I_I@6Q&g~kWQapS5{!)##QZ)TWTW}Z2N z&Y?@_O1g%=N#CaL(e3m@x{rQJKc`>OZ|HaQ0{xNxM1P?ntSY;U-OcK;ds#DfAA5jx zU=q_AW1UzR)`RtAec3}SlX=-A&{h#EW{VNOl_#<*G6k&wF%lJZMs&f&4%|b(-vvVv{kU@4ccbyeQg)U{{dL` z5$(8kORGidlIElp5eXrbbR?ZgGD(B24}hP~Cc|M(0WzA5gXK@b$exL@y?~UFP3VgQ z1eGlaalug(-<9vl58xN^tNDZcb-unJ2qB~@-W^RElNN{@?O>lOF-SZ~B;830$sqm6 zKr)z2L@b$yQMCm9y8-WgpX?xe$bRw}`2zm*Bsohik}L45w@Ij8O|Plf)$8kx^%$M% zJ@j5WH$KGqt0Y`)TeUs*6q_pz;j(c)0%L0eKZT#p&*W$G3-~hl*=4BPI({R+ncv3m z;y>aK@Q3*${0aUPf1ba@*A$uvEreR)d*Uszg=E05c-&F9Lf#^8(zomT^w0H^`UM>? zFAL%3!nWIq3S#Rs;x_R+sVzoicXgne18?$%dRDzxYpYQ$4O;(FI|nUCqRj&lDaMf* zuKpI0rDO$J4L|O*c?;P_J|>6A337&q<_;@j&YA`3;V z?F`#b)BETH5OcHj;d-7P&`0az5PzrW)AgD9Y<+=VroXB$(^u>3;E6XQBJa{a(hul| z^&|QT{gi%QzocK&Z|Iy6ZqzVp8&U8PO^p^tYonbZ8md8!c%!q?-AFSsi~+_#Bik5e zPl0>2tIt3xz@#ApPFBox6Jy84$oPiSaaglmjT+5A@i9KTiQEk>Ht*^gFLTR}Vtal#&aafxtJjFKIDjYd>VCcVi+#6!Hq zNAgJ_qWfd8(#hm$^xYizp_j;FvYfmQ5BnB*7jgIljD>^fy`$u7c&BsZGPz1_0tZCs z)%801J$ggEiLUG2^;G>{gF$zffrVO|Bg|3eIAEbE<}>C@b2$(ZcRa+!jSq=~#S(Fv zXvy~|oyi6AwB7+x>@@A>_=rm(E67i(?qi9OQ zr4iCj<*-skt*?2s5!!m-hSSCjbD0@K6X_#VU@0uodd6CAaWSE8A2k3H3KwrmPpf^= z=N@=%AFy<&+ujC3OQDN2PhF$Fg;@8q_9z*rzplTjzpJk|a?K_*oo3Tj3>AtGb^SrC ztf^Cs<~ElW%C$!E5^=k95Lown=@+S!d{FC${yhrsvQ9rl_d0qS6#UL*;V0p?5H3~| zYeQGjVq>v|c)w_iiQ+JEs`$FRUOuGmG;n`Gs2lrx3Vnrvh--O*Ul=Wn1rDDCBtBc1 zFO&(3gk^}CJB2+$1N9a2Amzq~a*24fRQObAi&&p6J}yoY=ZLGs1L8F?QtAlIctQVJ zuV=(zoUOEeu)5p5?MLm|_KWr^d%NwfqFNe!M>W13&nx|vua$GkU8$k7+{4(V^5615^EHGHLXvPoY%3*6 zZ%RiIkAIZzmJ5{E)vnr1#Eq}CAGI)YH*oH27~54%(PZeI64ua~X|1w$VFVtxE@C`Q z#ut9Hxz(X=46DaC5xa=riC4t_QeEJeA##pfAdi&C$m8V_`6>Asd6qm^UWj~Wsk}m7 zE59Lcf}htR~jiXO03dGX|Ko%Q7quC zu1d1fOX;IL4D>!k8LkunfsIkdDJ9AjW;f{u-&)C4CzT}g)~aNq&GAaW4Ce3Xkh-txc$L<9ur;_HVWw&pUcHj z%6{@QsRciK2q^0i<&KAPW1-g`{7C*OzNL^MJSudNw*cQpkokydr^)-~4s(yW-~0?7 z?6`T-JZoMwub9`(+h!=OMr+c#v_5T2V}OC%P?4%Y!tt~-?M~BZ1|2{L!p4WuJnE;T z=~y~}PNLIkDVqmR%5hSLx()cOi`5U=@qA=@t6^2&TQ{r-JJOD}V{8HWUSE3{ z^4_Q5cfwqLr7B;Wug6P#H~wK{QO_c_|ASvCzbV&KrvWSU(2MakYK$=6HEtS>V6ltM zd#x$fQDl!}?LE#IhzaAIxuy_4m7j*E_wouxpqF(w)x8}%__2AH2aeZ+@x zo3J~`cNPW+`S1{HghX++_@UTP8YqpyR~sq@Fk2*fl58ZOz+Qd^(ygnv(M?2;0s3G> z`f2)e`Xa>hefrmK3)dRF*~RQ{W|{@y24;Yn*o7Yd&TN5vI)@fPv-^Q}T5pG(p5e}s3+Vns6uD>zd?deD2C^I0UmFi@Q&~qB263kx2|HE=n*H2&msrk zAs!N+0q4L$hlAv?@^Xy$o$@~U8*mK~7}?RveTtwYAiEfb9DF=1Yz^$I5owKhoC+jb zfG9kTyoh+aiyTITy-BJ98^!1k=mUTm9y6ac%Md}|GCwqrn!lRWXfze5NxNX=45B_d z6Qg7SEu*i}Wpp)NM>o>V^Z@;g9-+tS5$hMLrJaUW=h@@n#Y*kv_BwkPM#y>l7UD-3 zSAurm%{Ss(^20GI)*v_g5o}FOxt`oq*5!_JAMgib;M4vNU$#cRp@geF^xk@FgGbap zZfrF>P#xoV7rr={4PiN~fQ@8h*mzdLo?_3iS%}vQ*~^I8E7)H4DRPI4>?&Jey>IQX z90y7IKLN;`_Yo+1le0VG*yw4ejn zcb3aH6@+oy(2nXDD^rDs#hS>!Hc2*e%Z^HCc+fO>&;jtE+3=uw@SvmNK_|e2PKO7b z4G&s|9$BWWR@NySmCedFWtZ|1`sc86L^+|HQqC)vlxxZjg;T@T8ftAdN{v>Vsx8#k zYCBa_Rh6poYG>f%G-P!HfReM-Vd^M#tJ+u-w283k`TAn8M(g#TbOFe7fHByZW4uhy z(FisQnbuPF5B9MW+sB8wyhJ$i(NeybK*f5Fjf`@mx>?<(?ovNe52%OLBkBqDlzLvhgiQK|%4y+R z4Xw5orA2E^wH8`ymM$!da@qm9>|(_RK2bX#i=3^0_Chme$|NUY3yI~wxhZp#CaBg#WO+1BIk|Gr$ zt6zl3-a%=vN}2)Au#GMw=csBlHu@MtjR5k9HO5=Ue&h)k(R-n06fy(ew9L*x|8vY& z%(K+TZd+;ga6~Qcc$kZ0pG59M%pP&l^4jb0GoX$Uy@rWg|OO1 zN`l%4x$`b{xHeLYBRUxYHsq!rVe~bY7%}v2Sk`jb6?ZAj#h%l}m!$2|9Q7pFwsU49 z`WUi%jth6&79*sAiP)xx!!CE5b%7cBAQq3Hk0N@_pzEQTv#``!U=rGcJMgjB*xktP zdxH}xu*M*!m0Ihpz1DZuWviwgWjD4BI~Bfl4U*mToL%mPv4G%j)C=s3!=EBGB5-tfhh5BMsAk###KM>?j@k{X=U`S4?A=O6| z9|G(>9Sqq5X}z>tIxY=W-c-EmLA8O#>r2>hAh&%OBj>E!RyDh>-PG=Ac@zd;riBGiKScTi(*`23HBZ-om&6){q5g!*(B zpAu(^OT~5KCh;@zJaTCPXksG#=0a(yizZG0T?+7VZK^ zg7=xClq!prmC6qAU9*5ctCBiIBMIa|uoB}*Uvnt@{flN9T?+1HE3$}@)-*?te7GB5 zEwHMig!RH@AwsN$I`N_*b{2<=i@^l%1rvM$TyS$qkP4&{Xlb$ZI(VpE(hrgZ4lz?M zmYe?r0i5KC|8wQKs*B2xBlu}Ff{AH8Xi)=hUaLc_;^aIN=0(s+Ci0IW2wW2W&lJ$p?yOh{7p!4^gy2ppRKK?Nv z$0g|X6Z|4^gwzVWYY(-bdN;gK8!*9V$g{=*W4rOSam{EBzUmM=!z8PfJppWZ8Ddp9 z=TI`e_$-XX2Err4IAN+_VfLc0*osUyOln$*)+lSd^)j-qtLXg}c3bD$gM!~ahuMy{ zLNB2dekV$N5Hkkzp|Q(iHEEl)S9%nEbw#eNY*5})hN$`Al7Cij84<|pqs`_fR}jvf z!KBuOs~?L^jD16>Z}gChc#qP zSWDK5#W8_t%mmw<#2#d+tT*cqmNX0bbSZlt%-&&kpOxn1-{ZsGyf2)u#osUR;1gP@ zb+zqaiXYOa>O1v=$OQJ7b!cDIF#xXBV4r}K3g;a77b;W{Y6_7;eW8&MgL$P|QYbi{ zny`ra;CN!d@w5TQBZK3)W=2^#))MD?Wx;0!zAr{l02upY&6yQAiG1%OxcKXcMfFG{ zl0^>dvyF460bCsdtoODXE5cnq}31dqwsA@tu+?6Kb%{D zs%{k;i`~R1sg2wiqvUb5w)UFV0od&-iGya&>-n(VW@a+_y(>+nEx_%!L!45fqj;8x z$dZD3_hSRuU^WaW$q$q?7AR>FP*N#S(tMz#MZf~9*jl!MZDQ|(;n;&(e8#?D$Jt4C z7P#pOyUuR2P^+3%)5T8kW5>f?9y$gIZ|qHA6dT zjzlf1S&>$A@VpixfEPU&;eNj_Uq>7uekI09lcgx|bRkA{aPl3EAB>-jB(snC5aQiN zGZlH>UV4fqTW?vL5ifqWxX1_>AB4bW!jN@-C^nZ~kZ)>tfmK~hn(CeO(dIdG2aST& zKFtJhDG{!%4F~%ie3SidyD75+RqZoH)E~Y z5pY$Pz`QrGnz(Fx2jn}{>ST2X)85bWAn(aTv>0bSg*nB!)+QGg_b_{d1`Uefj$qdXe2IxzJRdWyn-GZ)3*QO9A{Mt5MUf!- zWnlK^UBu$|z%`wds>pTZC}fK^W>rUk^Y~IeE_cv+fSF&V)kbU>1wL^%GR8Q4sJ=$u zq1QK?f*X}E3j3K}%w>!OJGdG=MOAtaykT2+rt}fu%kSXDcxGXaqCdvSlj!+*>@Cbe z9A$N_Mpk>YxI55?7xOW*FjuwK`oQ|sI%{3CLhbr?dwY^S(_U+D1`BZ3zTvd30Kc&W zpPj}}MHa0i0;~eZ@vWN;hluxxO~f{$gqf+n;?v@5Zu|_9s!L6z`!G-03(@^vxh*({ zXXQEa5_z@!4lHe-d|Lh<^ITTpiHPlG8zS`K$3fil(YPdN;vf2yr?Jy#R z!}MRqeCDqt8hm#vy`668S;%-t=wtN9^||^&eTlvTOu|*5xKN|6(Ezp}8k%7NOXeCY zjei(>!8%_z!pytOj%GKo$SX~XSTUSVrE}>Q(Af=Ig*9d^*lbqYY5*;5vNqTsf>lG7 z$8qC>cH4yK`QE@fPXo!WN8wA`ak zRHtKp=R=^g=Gy)6Bk9`f@aRoQU(DnMFhlSr`5f9gMN;$({S9RPTQRqO3iEnD>QP|p z6OG=+5U_<)jpvNN8_S`EJwVi-7>A*Y03xmPJHaS4FBbERn}jXGHvAR?KRt3e(ym%E zW+*Z=j>GTeoO|rnnE#V)irIB1Kj8}S`!mU%F1+_G9808CZ#S81q$5)H|a LB0J#c|8e_2(5l4G literal 0 HcmV?d00001 diff --git a/imagecrunch/PIL/features.py b/imagecrunch/PIL/features.py new file mode 100644 index 0000000..9926445 --- /dev/null +++ b/imagecrunch/PIL/features.py @@ -0,0 +1,85 @@ +from . import Image + +modules = { + "pil": "PIL._imaging", + "tkinter": "PIL._tkinter_finder", + "freetype2": "PIL._imagingft", + "littlecms2": "PIL._imagingcms", + "webp": "PIL._webp", +} + + +def check_module(feature): + if not (feature in modules): + raise ValueError("Unknown module %s" % feature) + + module = modules[feature] + + try: + __import__(module) + return True + except ImportError: + return False + + +def get_supported_modules(): + return [f for f in modules if check_module(f)] + + +codecs = { + "jpg": "jpeg", + "jpg_2000": "jpeg2k", + "zlib": "zip", + "libtiff": "libtiff" +} + + +def check_codec(feature): + if feature not in codecs: + raise ValueError("Unknown codec %s" % feature) + + codec = codecs[feature] + + return codec + "_encoder" in dir(Image.core) + + +def get_supported_codecs(): + return [f for f in codecs if check_codec(f)] + + +features = { + "webp_anim": ("PIL._webp", 'HAVE_WEBPANIM'), + "webp_mux": ("PIL._webp", 'HAVE_WEBPMUX'), + "transp_webp": ("PIL._webp", "HAVE_TRANSPARENCY"), + "raqm": ("PIL._imagingft", "HAVE_RAQM") +} + + +def check_feature(feature): + if feature not in features: + raise ValueError("Unknown feature %s" % feature) + + module, flag = features[feature] + + try: + imported_module = __import__(module, fromlist=['PIL']) + return getattr(imported_module, flag) + except ImportError: + return None + + +def get_supported_features(): + return [f for f in features if check_feature(f)] + + +def check(feature): + return (feature in modules and check_module(feature) or + feature in codecs and check_codec(feature) or + feature in features and check_feature(feature)) + + +def get_supported(): + ret = get_supported_modules() + ret.extend(get_supported_features()) + ret.extend(get_supported_codecs()) + return ret diff --git a/imagecrunch/PIL_COPYRIGHT.txt b/imagecrunch/PIL_COPYRIGHT.txt new file mode 100644 index 0000000..2c1dd3b --- /dev/null +++ b/imagecrunch/PIL_COPYRIGHT.txt @@ -0,0 +1,26 @@ +Software License + +The Python Imaging Library (PIL) is + + Copyright © 1997-2011 by Secret Labs AB + Copyright © 1995-2011 by Fredrik Lundh + +By obtaining, using, and/or copying this software and/or its associated +documentation, you agree that you have read, understood, and will comply with +the following terms and conditions: + +Permission to use, copy, modify, and distribute this software and its associated +documentation for any purpose and without fee is hereby granted, provided that +the above copyright notice appears in all copies, and that both that copyright +notice and this permission notice appear in supporting documentation, and that +the name of Secret Labs AB or the author not be used in advertising or publicity +pertaining to distribution of the software without specific, written prior +permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/imagecrunch/README.md b/imagecrunch/README.md new file mode 100644 index 0000000..e3c1ab4 --- /dev/null +++ b/imagecrunch/README.md @@ -0,0 +1,6 @@ +imagecrunch +=========== + +Recompress your jpeg images. + +As a proponent of digital archiving and media conservation I'd like to kindly encourage you to use this for creating secondary copies e.g. to go on your phone while leaving the original copy intact, thanks. diff --git a/imagecrunch/plugin.py b/imagecrunch/plugin.py new file mode 100644 index 0000000..58760b5 --- /dev/null +++ b/imagecrunch/plugin.py @@ -0,0 +1,118 @@ +import tkinter +import tkinter.messagebox +import io +import re +import PIL.Image +import xml.etree.ElementTree + +def find_cover_id(book): + for (id, href, mimetype) in book.manifest_iter(): + properties = book.id_to_properties(id) + if properties == 'cover-image': + return id + + metadata = xml.etree.ElementTree.fromstring(book.getmetadataxml()) + cover = [x for x in metadata.findall('meta') if x.get('name') == 'cover'] + if cover: + return cover[0].get('content') + + return None + +def fit_into_bounds(image_width, image_height, frame_width, frame_height, only_shrink=False): + ''' + Given the w+h of the image and the w+h of the frame, + return new w+h that fits the image into the frame + while maintaining the aspect ratio. + + (1920, 1080, 400, 400) -> (400, 225) + ''' + width_ratio = frame_width / image_width + height_ratio = frame_height / image_height + ratio = min(width_ratio, height_ratio) + + new_width = int(image_width * ratio) + new_height = int(image_height * ratio) + + if only_shrink and (new_width > image_width or new_height > image_height): + return (image_width, image_height) + + return (new_width, new_height) + +def collect_images(book, do_cover=False): + images = [] + if do_cover: + cover_id = None + else: + cover_id = find_cover_id(book) + + for (id, href, mimetype) in book.manifest_iter(): + if id == cover_id: + continue + + if mimetype == 'image/jpeg': + images.append(id) + return images + +def choose_options(): + options = {} + t = tkinter.Tk() + t.grid_columnconfigure(1, weight=1) + t.grid_rowconfigure(3, weight=1) + t.title('imagecrunch') + do_cover_intvar = tkinter.IntVar() + do_cover_intvar.set(1) + do_cover_checkbox = tkinter.Checkbutton(t, text='Compress the cover?', variable=do_cover_intvar) + do_cover_checkbox.grid(row=0, column=0, columnspan=2, sticky='w') + tkinter.Label(t, text='max dimension').grid(row=1, column=0, sticky='w') + dimension_slider = tkinter.Scale(t, from_=100, to=2000, resolution=10, orient=tkinter.HORIZONTAL) + dimension_slider.grid(row=1, column=1, sticky='we') + dimension_slider.set(500) + tkinter.Label(t, text='jpeg quality').grid(row=2, column=0, sticky='w') + quality_slider = tkinter.Scale(t, from_=1, to=100, orient=tkinter.HORIZONTAL) + quality_slider.grid(row=2, column=1, sticky='we') + quality_slider.set(50) + def commit(): + options['do_cover'] = do_cover_intvar.get() + options['quality'] = quality_slider.get() + options['max_dimension'] = dimension_slider.get() + t.destroy() + ok_button = tkinter.Button(t, text='OK', command=commit, bg='#00ff00') + ok_button.grid(row=3, column=0, columnspan=2, sticky='ews') + t.mainloop() + return options + +def imagecrunch(book, options): + total_original_size = 0 + total_new_size = 0 + + for id in collect_images(book, do_cover=options['do_cover']): + data = io.BytesIO(book.readfile(id)) + original_size = len(data.read()) + total_original_size += original_size + data.seek(0) + i = PIL.Image.open(data) + data = io.BytesIO() + # i = i.convert('L') + new_dimension = fit_into_bounds(*i.size, options['max_dimension'], options['max_dimension'], only_shrink=True) + i = i.resize(new_dimension, resample=PIL.Image.ANTIALIAS) + i.save(data, format='jpeg', quality=options['quality']) + data.seek(0) + new_size = len(data.read()) + if new_size >= original_size: + total_new_size += original_size + continue + total_new_size += new_size + data.seek(0) + book.writefile(id, data.read()) + print(id, 'shrunk from', int(original_size / 1024), 'K', 'to', int(new_size / 1024), 'K') + + print('Total shrunk from', int(total_original_size / 1024), 'K', 'to', int(total_new_size / 1024), 'K') + +def run(book): + options = choose_options() + print(options) + if not options: + return 1 + + imagecrunch(book, options) + return 0 diff --git a/imagecrunch/plugin.xml b/imagecrunch/plugin.xml new file mode 100644 index 0000000..3a3a80d --- /dev/null +++ b/imagecrunch/plugin.xml @@ -0,0 +1,11 @@ + + + imagecrunch + edit + voussoir + Murder your jpegs + python3.4 + 1.0 + true + osx,win,unx +