diff --git a/PIL/BdfFontFile.py b/PIL/BdfFontFile.py index b02c44fd2..c525c1343 100644 --- a/PIL/BdfFontFile.py +++ b/PIL/BdfFontFile.py @@ -17,10 +17,8 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - -from PIL import Image -from PIL import FontFile +from PIL import Image, FontFile +from .exceptions import InvalidFileType # -------------------------------------------------------------------- @@ -89,14 +87,12 @@ def bdf_char(f): # 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") + raise InvalidFileType("not a valid BDF file") props = {} comments = [] @@ -111,20 +107,6 @@ class BdfFontFile(FontFile.FontFile): 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: diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index b04981af9..4cc9a04b2 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -23,9 +23,10 @@ # See the README file for information on usage and redistribution. # - -from PIL import Image, ImageFile, ImagePalette, _binary import math +from PIL import Image, ImageFile, ImagePalette, _binary +from .exceptions import InvalidFileType, PILReadError + __version__ = "0.7" @@ -199,7 +200,7 @@ class BmpImageFile(ImageFile.ImageFile): 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") + raise InvalidFileType("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) diff --git a/PIL/BufrStubImagePlugin.py b/PIL/BufrStubImagePlugin.py index 5184546e4..b3b4a22a1 100644 --- a/PIL/BufrStubImagePlugin.py +++ b/PIL/BufrStubImagePlugin.py @@ -10,6 +10,7 @@ # from PIL import Image, ImageFile +from .exceptions import InvalidFileType _handler = None @@ -37,11 +38,10 @@ class BufrStubImageFile(ImageFile.StubImageFile): format_description = "BUFR" def _open(self): - offset = self.fp.tell() if not _accept(self.fp.read(8)): - raise SyntaxError("Not a BUFR file") + raise InvalidFileType("Not a BUFR file") self.fp.seek(offset) diff --git a/PIL/CurImagePlugin.py b/PIL/CurImagePlugin.py index 3a9a10e01..ece3f5db7 100644 --- a/PIL/CurImagePlugin.py +++ b/PIL/CurImagePlugin.py @@ -16,9 +16,9 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - from PIL import Image, BmpImagePlugin, _binary +from .exceptions import InvalidFileType + __version__ = "0.1" @@ -49,7 +49,7 @@ class CurImageFile(BmpImagePlugin.BmpImageFile): # check magic s = self.fp.read(6) if not _accept(s): - raise SyntaxError("not a CUR file") + raise InvalidFileType("not a CUR file") # pick the largest cursor in the file m = b"" @@ -59,14 +59,6 @@ class CurImageFile(BmpImagePlugin.BmpImageFile): 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") diff --git a/PIL/DcxImagePlugin.py b/PIL/DcxImagePlugin.py index f9034d15c..b3bb00b0b 100644 --- a/PIL/DcxImagePlugin.py +++ b/PIL/DcxImagePlugin.py @@ -23,6 +23,8 @@ from PIL import Image, _binary from PIL.PcxImagePlugin import PcxImageFile +from .exceptions import InvalidFileType + __version__ = "0.2" @@ -44,11 +46,10 @@ class DcxImageFile(PcxImageFile): format_description = "Intel DCX" def _open(self): - # Header s = self.fp.read(4) if i32(s) != MAGIC: - raise SyntaxError("not a DCX file") + raise InvalidFileType("Invalid DCS header") # Component directory self._offset = [] diff --git a/PIL/EpsImagePlugin.py b/PIL/EpsImagePlugin.py index 77a7e7e1c..e0804c4d8 100644 --- a/PIL/EpsImagePlugin.py +++ b/PIL/EpsImagePlugin.py @@ -20,10 +20,12 @@ # See the README file for information on usage and redistribution. # -import re import io +import re import sys from PIL import Image, ImageFile, _binary +from .exceptions import InvalidFileType, PILReadError + __version__ = "0.5" @@ -235,12 +237,12 @@ class EpsImageFile(ImageFile.ImageFile): while s: if len(s) > 255: - raise SyntaxError("not an EPS file") + raise PILReadError("Size too large: %r" % (len(s))) try: m = split.match(s) except re.error as v: - raise SyntaxError("not an EPS file") + raise InvalidFileType("not an EPS file") if m: k, v = m.group(1, 2) @@ -273,7 +275,7 @@ class EpsImageFile(ImageFile.ImageFile): # tools mistakenly put in the Comments section pass else: - raise IOError("bad EPS header") + raise PILReadError("bad EPS header") s = fp.readline().strip('\r\n') @@ -284,9 +286,8 @@ class EpsImageFile(ImageFile.ImageFile): # Scan for an "ImageData" descriptor while s[:1] == "%": - if len(s) > 255: - raise SyntaxError("not an EPS file") + raise PILReadError("Size too large: %r" % (len(s))) if s[:11] == "%ImageData:": # Encoded bitmapped image. @@ -307,7 +308,7 @@ class EpsImageFile(ImageFile.ImageFile): break if not box: - raise IOError("cannot determine EPS bounding box") + raise PILReadError("cannot determine EPS bounding box") def _find_offset(self, fp): @@ -327,7 +328,7 @@ class EpsImageFile(ImageFile.ImageFile): offset = i32(s[4:8]) length = i32(s[8:12]) else: - raise SyntaxError("not an EPS file") + raise InvalidFileType("not an EPS file") return (length, offset) diff --git a/PIL/FitsStubImagePlugin.py b/PIL/FitsStubImagePlugin.py index b6ea0e37d..16f892fd8 100644 --- a/PIL/FitsStubImagePlugin.py +++ b/PIL/FitsStubImagePlugin.py @@ -10,6 +10,8 @@ # from PIL import Image, ImageFile +from .exceptions import InvalidFileType + _handler = None @@ -41,7 +43,7 @@ class FITSStubImageFile(ImageFile.StubImageFile): offset = self.fp.tell() if not _accept(self.fp.read(6)): - raise SyntaxError("Not a FITS file") + raise InvalidFileType("Not a FITS file") # FIXME: add more sanity checks here; mandatory header items # include SIMPLE, BITPIX, NAXIS, etc. diff --git a/PIL/FliImagePlugin.py b/PIL/FliImagePlugin.py index a07dc29b0..88ad530ef 100644 --- a/PIL/FliImagePlugin.py +++ b/PIL/FliImagePlugin.py @@ -17,6 +17,8 @@ from PIL import Image, ImageFile, ImagePalette, _binary +from .exceptions import InvalidFileType + __version__ = "0.2" @@ -50,7 +52,7 @@ class FliImageFile(ImageFile.ImageFile): 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") + raise InvalidFileType("not an FLI/FLC file") # image characteristics self.mode = "P" diff --git a/PIL/FontFile.py b/PIL/FontFile.py index 807984a8c..d55b7a86c 100644 --- a/PIL/FontFile.py +++ b/PIL/FontFile.py @@ -14,8 +14,6 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - import os from PIL import Image, _binary @@ -90,7 +88,6 @@ class FontFile(object): 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): diff --git a/PIL/FpxImagePlugin.py b/PIL/FpxImagePlugin.py index 08e7f0da1..c98cebdfb 100644 --- a/PIL/FpxImagePlugin.py +++ b/PIL/FpxImagePlugin.py @@ -15,11 +15,10 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - -from PIL import Image, ImageFile, _binary - import olefile +from PIL import Image, ImageFile, _binary +from .exceptions import InvalidFileType, PILReadError + __version__ = "0.1" @@ -65,10 +64,10 @@ class FpxImageFile(ImageFile.ImageFile): try: self.ole = olefile.OleFileIO(self.fp) except IOError: - raise SyntaxError("not an FPX file; invalid OLE file") + raise InvalidFileType("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") + raise InvalidFileType("not an FPX file; bad root CLSID") self._open_index(1) @@ -116,8 +115,6 @@ class FpxImageFile(ImageFile.ImageFile): 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): @@ -145,10 +142,8 @@ class FpxImageFile(ImageFile.ImageFile): offset = i32(s, 28) length = i32(s, 32) - # print(size, self.mode, self.rawmode) - if size != self.size: - raise IOError("subimage mismatch") + raise PILReadError("subimage mismatch") # get tile descriptors fp.seek(28 + offset) @@ -203,7 +198,7 @@ class FpxImageFile(ImageFile.ImageFile): self.tile_prefix = self.jpeg[jpeg_tables] else: - raise IOError("unknown/invalid compression") + raise PILReadError("unknown/invalid compression") x = x + xtile if x >= xsize: diff --git a/PIL/GbrImagePlugin.py b/PIL/GbrImagePlugin.py index d62981c28..f3b6c7e4b 100644 --- a/PIL/GbrImagePlugin.py +++ b/PIL/GbrImagePlugin.py @@ -25,6 +25,8 @@ # the color depth field. This is currently unsupported by Pillow. from PIL import Image, ImageFile, _binary +from .exceptions import InvalidFileType + i32 = _binary.i32be @@ -42,20 +44,24 @@ class GbrImageFile(ImageFile.ImageFile): format_description = "GIMP brush file" def _open(self): - header_size = i32(self.fp.read(4)) - version = i32(self.fp.read(4)) + s = self.fp.read(4) + t = self.fp.read(4) + if len(s) < 4 or len(t) < 4: + raise InvalidFileType("not a GIMP brush") + header_size = i32(s) + version = i32(t) if header_size < 20: - raise SyntaxError("not a GIMP brush") + raise InvalidFileType("not a GIMP brush") if version not in (1, 2): - raise SyntaxError("Unsupported GIMP brush version: %s" % version) + raise NotImplementedError("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") + raise InvalidFileType("not a GIMP brush") if color_depth not in (1, 4): - raise SyntaxError("Unsupported GIMP brush color depth: %s" % color_depth) + raise NotImplementedError("Unsupported GIMP brush color depth: %s" % color_depth) if version == 1: comment_length = header_size-20 @@ -63,7 +69,7 @@ class GbrImageFile(ImageFile.ImageFile): 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") + raise InvalidFileType("not a GIMP brush, bad magic number") self.info['spacing'] = i32(self.fp.read(4)) comment = self.fp.read(comment_length)[:-1] diff --git a/PIL/GdImageFile.py b/PIL/GdImageFile.py index 5a07ee230..b6d1b4fcd 100644 --- a/PIL/GdImageFile.py +++ b/PIL/GdImageFile.py @@ -25,6 +25,8 @@ from PIL import ImageFile, ImagePalette, _binary from PIL._util import isPath +from .exceptions import PILReadError + __version__ = "0.1" @@ -49,7 +51,6 @@ class GdImageFile(ImageFile.ImageFile): format_description = "GD uncompressed images" def _open(self): - # Header s = self.fp.read(775) @@ -87,5 +88,5 @@ def open(fp, mode="r"): try: return GdImageFile(fp, filename) - except SyntaxError: - raise IOError("cannot identify this image file") + except Exception as e: + raise PILReadError("cannot identify this image file: %s" % (e)) diff --git a/PIL/GifImagePlugin.py b/PIL/GifImagePlugin.py index a50af6c02..b69d693c3 100644 --- a/PIL/GifImagePlugin.py +++ b/PIL/GifImagePlugin.py @@ -26,6 +26,8 @@ from PIL import Image, ImageFile, ImagePalette, \ ImageChops, ImageSequence, _binary +from .exceptions import InvalidFileType + __version__ = "0.9" @@ -63,11 +65,10 @@ class GifImageFile(ImageFile.ImageFile): 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") + raise InvalidFileType("Invalid GIF header") self.info["version"] = s[:6] self.size = i16(s[6:]), i16(s[8:]) diff --git a/PIL/GimpGradientFile.py b/PIL/GimpGradientFile.py index 45af573bb..1c35d562b 100644 --- a/PIL/GimpGradientFile.py +++ b/PIL/GimpGradientFile.py @@ -15,6 +15,8 @@ from math import pi, log, sin, sqrt from PIL._binary import o8 +from .exceptions import InvalidFileType + # -------------------------------------------------------------------- # Stuff to translate curve segments to palette values (derived from @@ -102,9 +104,8 @@ class GradientFile(object): class GimpGradientFile(GradientFile): def __init__(self, fp): - if fp.readline()[:13] != b"GIMP Gradient": - raise SyntaxError("not a GIMP gradient file") + raise InvalidFileType("not a GIMP gradient file") line = fp.readline() diff --git a/PIL/GimpPaletteFile.py b/PIL/GimpPaletteFile.py index e4b4641e5..1ae798af0 100644 --- a/PIL/GimpPaletteFile.py +++ b/PIL/GimpPaletteFile.py @@ -16,21 +16,20 @@ import re from PIL._binary import o8 +from .exceptions import InvalidFileType, PILReadError ## # 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") + raise InvalidFileType("not a GIMP palette file") i = 0 @@ -44,11 +43,11 @@ class GimpPaletteFile(object): if re.match(br"\w+:|#", s): continue if len(s) > 100: - raise SyntaxError("bad palette file") + raise PILReadError("bad palette file") v = tuple(map(int, s.split()[:3])) if len(v) != 3: - raise ValueError("bad palette entry") + raise PILReadError("bad palette entry") if 0 <= i <= 255: self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) @@ -58,5 +57,4 @@ class GimpPaletteFile(object): self.palette = b"".join(self.palette) def getpalette(self): - return self.palette, self.rawmode diff --git a/PIL/GribStubImagePlugin.py b/PIL/GribStubImagePlugin.py index e880e5281..4ce8b7a99 100644 --- a/PIL/GribStubImagePlugin.py +++ b/PIL/GribStubImagePlugin.py @@ -10,6 +10,8 @@ # from PIL import Image, ImageFile +from .exceptions import InvalidFileType + _handler = None @@ -37,11 +39,10 @@ class GribStubImageFile(ImageFile.StubImageFile): format_description = "GRIB" def _open(self): - offset = self.fp.tell() if not _accept(self.fp.read(8)): - raise SyntaxError("Not a GRIB file") + raise InvalidFileType("Not a GRIB file") self.fp.seek(offset) diff --git a/PIL/Hdf5StubImagePlugin.py b/PIL/Hdf5StubImagePlugin.py index dc85084d8..039dee91f 100644 --- a/PIL/Hdf5StubImagePlugin.py +++ b/PIL/Hdf5StubImagePlugin.py @@ -10,6 +10,8 @@ # from PIL import Image, ImageFile +from .exceptions import InvalidFileType + _handler = None @@ -41,7 +43,7 @@ class HDF5StubImageFile(ImageFile.StubImageFile): offset = self.fp.tell() if not _accept(self.fp.read(8)): - raise SyntaxError("Not an HDF file") + raise InvalidFileType("Not an HDF file") self.fp.seek(offset) diff --git a/PIL/IcnsImagePlugin.py b/PIL/IcnsImagePlugin.py index 089fc2a44..97e40473f 100644 --- a/PIL/IcnsImagePlugin.py +++ b/PIL/IcnsImagePlugin.py @@ -15,13 +15,15 @@ # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFile, PngImagePlugin, _binary import io import os import shutil import struct import sys import tempfile +from PIL import Image, ImageFile, PngImagePlugin, _binary +from .exceptions import InvalidFileType, PILReadError + enable_jpeg2k = hasattr(Image.core, 'jp2klib_version') if enable_jpeg2k: @@ -42,7 +44,7 @@ def read_32t(fobj, start_length, size): fobj.seek(start) sig = fobj.read(4) if sig != b'\x00\x00\x00\x00': - raise SyntaxError('Unknown signature, expecting 0x00000000') + raise PILReadError("Unknown signature, expecting 0x00000000") return read_32(fobj, (start + 4, length - 4), size) @@ -64,8 +66,8 @@ def read_32(fobj, start_length, size): im = Image.new("RGB", pixel_size, None) for band_ix in range(3): data = [] - bytesleft = sizesq - while bytesleft > 0: + rem = sizesq + while rem > 0: byte = fobj.read(1) if not byte: break @@ -78,13 +80,11 @@ def read_32(fobj, start_length, size): else: blocksize = byte + 1 data.append(fobj.read(blocksize)) - bytesleft -= blocksize - if bytesleft <= 0: + rem -= blocksize + if rem <= 0: break - if bytesleft != 0: - raise SyntaxError( - "Error reading channel [%r left]" % bytesleft - ) + if rem != 0: + raise PILReadError("Error reading channel (%r bytes left)" % rem) band = Image.frombuffer( "L", pixel_size, b"".join(data), "raw", "L", 0, 1 ) @@ -187,12 +187,12 @@ class IcnsFile(object): self.fobj = fobj sig, filesize = nextheader(fobj) if sig != b'icns': - raise SyntaxError('not an icns file') + raise InvalidFileType("not an icns file") i = HEADERSIZE while i < filesize: sig, blocksize = nextheader(fobj) if blocksize <= 0: - raise SyntaxError('invalid block header') + raise PILReadError("invalid block header") i += HEADERSIZE blocksize -= HEADERSIZE dct[sig] = (i, blocksize) @@ -211,7 +211,7 @@ class IcnsFile(object): def bestsize(self): sizes = self.itersizes() if not sizes: - raise SyntaxError("No 32bit icon resources found") + raise PILReadError("No 32bit icon resources found") return max(sizes) def dataforsize(self, size): diff --git a/PIL/IcoImagePlugin.py b/PIL/IcoImagePlugin.py index 3436ae84f..540e7c4a0 100644 --- a/PIL/IcoImagePlugin.py +++ b/PIL/IcoImagePlugin.py @@ -21,12 +21,11 @@ # * https://en.wikipedia.org/wiki/ICO_(file_format) # * https://msdn.microsoft.com/en-us/library/ms997538.aspx - import struct from io import BytesIO - -from PIL import Image, ImageFile, BmpImagePlugin, PngImagePlugin, _binary from math import log, ceil +from PIL import Image, ImageFile, BmpImagePlugin, PngImagePlugin, _binary +from .exceptions import InvalidFileType __version__ = "0.1" @@ -91,7 +90,7 @@ class IcoFile(object): # check magic s = buf.read(6) if not _accept(s): - raise SyntaxError("not an ICO file") + raise InvalidFileType("not an ICO file") self.buf = buf self.entry = [] diff --git a/PIL/ImImagePlugin.py b/PIL/ImImagePlugin.py index dd4f82900..8a003bdb4 100644 --- a/PIL/ImImagePlugin.py +++ b/PIL/ImImagePlugin.py @@ -29,6 +29,8 @@ import re from PIL import Image, ImageFile, ImagePalette from PIL._binary import i8 +from .exceptions import InvalidFileType, PILReadError + __version__ = "0.7" @@ -111,12 +113,11 @@ class ImImageFile(ImageFile.ImageFile): format_description = "IFUNC Image Memory" 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") + raise InvalidFileType("not an IM file") self.fp.seek(0) n = 0 @@ -129,7 +130,6 @@ class ImImageFile(ImageFile.ImageFile): self.rawmode = "L" while True: - s = self.fp.read(1) # Some versions of IFUNC uses \n\r instead of \r\n... @@ -143,7 +143,7 @@ class ImImageFile(ImageFile.ImageFile): s = s + self.fp.readline() if len(s) > 100: - raise SyntaxError("not an IM file") + raise InvalidFileType("not an IM file") if s[-2:] == b'\r\n': s = s[:-2] @@ -153,10 +153,9 @@ class ImImageFile(ImageFile.ImageFile): try: m = split.match(s) except re.error as v: - raise SyntaxError("not an IM file") + raise InvalidFileType("not an IM file") if m: - k, v = m.group(1, 2) # Don't know if this is the correct encoding, @@ -187,12 +186,11 @@ class ImImageFile(ImageFile.ImageFile): n += 1 else: - - raise SyntaxError("Syntax error in IM header: " + - s.decode('ascii', 'replace')) + s = s.decode("ascii", "replace") + raise PILReadError("Bad IM header: %r" % (s)) if not n: - raise SyntaxError("Not an IM file") + raise InvalidFileType("Not an IM file") # Basic attributes self.size = self.info[SIZE] @@ -202,7 +200,7 @@ class ImImageFile(ImageFile.ImageFile): while s and s[0:1] != b'\x1A': s = self.fp.read(1) if not s: - raise SyntaxError("File truncated") + raise PILReadError("File truncated") if LUT in self.info: # convert lookup table to palette or lut attribute diff --git a/PIL/Image.py b/PIL/Image.py index e368ef187..3c3516f8b 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -24,13 +24,11 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - -from PIL import VERSION, PILLOW_VERSION, _plugins - import logging -import warnings import math +import warnings +from PIL import VERSION, PILLOW_VERSION, _plugins +from .exceptions import PILReadError, NoPluginFound logger = logging.getLogger(__name__) @@ -418,7 +416,6 @@ def _getdecoder(mode, decoder_name, args, extra=()): 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) @@ -435,7 +432,6 @@ def _getencoder(mode, encoder_name, args, extra=()): 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) @@ -1583,7 +1579,7 @@ class Image(object): angle = angle % 360.0 # Fast paths regardless of filter, as long as we're not - # translating or changing the center. + # translating or changing the center. if not (center or translate): if angle == 0: return self.copy() @@ -2194,7 +2190,6 @@ def fromarray(obj, mode=None): 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 @@ -2329,7 +2324,7 @@ def open(fp, mode="r"): im = factory(fp, filename) _decompression_bomb_check(im.size) return im - except (SyntaxError, IndexError, TypeError, struct.error): + except (PILReadError, NoPluginFound, IndexError, TypeError, struct.error): # Leave disabled by default, spams the logs with image # opening failures that are entirely expected. # logger.debug("", exc_info=True) diff --git a/PIL/ImageCms.py b/PIL/ImageCms.py index 267afa4c6..327b27cb7 100644 --- a/PIL/ImageCms.py +++ b/PIL/ImageCms.py @@ -15,7 +15,6 @@ # 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 @@ -28,6 +27,7 @@ except ImportError as ex: _imagingcms = deferred_error(ex) from PIL._util import isStringType + DESCRIPTION = """ pyCMS @@ -149,7 +149,6 @@ for flag in FLAGS.values(): # Profile. class ImageCmsProfile(object): - def __init__(self, profile): """ :param profile: Either a string representing a filename, @@ -166,7 +165,6 @@ class ImageCmsProfile(object): self._set(profile) else: raise TypeError("Invalid type for Profile") - def _set(self, profile, filename=None): self.profile = profile diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index a56795751..616e2c092 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -27,12 +27,14 @@ # See the README file for information on usage and redistribution. # -from PIL import Image -from PIL._util import isPath import io import os import sys import struct +from PIL import Image +from PIL._util import isPath +from .exceptions import PILReadError, NoPluginFound + MAXBLOCK = 65536 @@ -100,10 +102,10 @@ class ImageFile(Image.Image): KeyError, # unsupported mode EOFError, # got header but not the first frame struct.error) as v: - raise SyntaxError(v) + raise PILReadError(v) if not self.mode or self.size[0] <= 0: - raise SyntaxError("not identified by this driver") + raise NoPluginFound("not identified by this driver") def draft(self, mode, size): "Set draft mode" diff --git a/PIL/ImageFont.py b/PIL/ImageFont.py index 49494b33f..acc1ff215 100644 --- a/PIL/ImageFont.py +++ b/PIL/ImageFont.py @@ -25,10 +25,11 @@ # See the README file for information on usage and redistribution. # -from PIL import Image -from PIL._util import isDirectory, isPath import os import sys +from PIL import Image +from PIL._util import isDirectory, isPath +from .exceptions import InvalidFileType class _imagingft_not_installed(object): @@ -61,7 +62,6 @@ class ImageFont(object): "PIL font wrapper" def _load_pilfont(self, filename): - with open(filename, "rb") as fp: for ext in (".png", ".gif", ".pbm"): try: @@ -80,10 +80,9 @@ class ImageFont(object): 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") + raise InvalidFileType("Not a PILfont file") file.readline().split(b";") self.info = [] # FIXME: should be a dictionary while True: diff --git a/PIL/ImageMorph.py b/PIL/ImageMorph.py index 3ad708291..6814858e8 100644 --- a/PIL/ImageMorph.py +++ b/PIL/ImageMorph.py @@ -5,11 +5,10 @@ # # Copyright (c) 2014 Dov Grobgeld -from __future__ import print_function - +import re from PIL import Image from PIL import _imagingmorph -import re + LUT_SIZE = 1 << 9 @@ -152,11 +151,6 @@ class LutBuilder(object): 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]') diff --git a/PIL/ImagePalette.py b/PIL/ImagePalette.py index 8bf09385c..84fc268b0 100644 --- a/PIL/ImagePalette.py +++ b/PIL/ImagePalette.py @@ -17,10 +17,8 @@ # import array -from PIL import ImageColor -from PIL import GimpPaletteFile -from PIL import GimpGradientFile -from PIL import PaletteFile +from PIL import GimpPaletteFile, GimpGradientFile, ImageColor, PaletteFile +from .exceptions import PILReadError class ImagePalette(object): @@ -198,7 +196,6 @@ def load(filename): # FIXME: supports GIMP gradients only with open(filename, "rb") as fp: - for paletteHandler in [ GimpPaletteFile.GimpPaletteFile, GimpGradientFile.GimpGradientFile, @@ -209,11 +206,9 @@ def load(filename): lut = paletteHandler(fp).getpalette() if lut: break - except (SyntaxError, ValueError): - # import traceback - # traceback.print_exc() + except (PILReadError, ValueError): pass else: raise IOError("cannot load palette") - return lut # data, rawmode + return lut diff --git a/PIL/ImageShow.py b/PIL/ImageShow.py index 33f059d74..d439190d6 100644 --- a/PIL/ImageShow.py +++ b/PIL/ImageShow.py @@ -12,8 +12,6 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - from PIL import Image import os import sys diff --git a/PIL/ImtImagePlugin.py b/PIL/ImtImagePlugin.py index e95f7aeba..323a74c7b 100644 --- a/PIL/ImtImagePlugin.py +++ b/PIL/ImtImagePlugin.py @@ -14,10 +14,10 @@ # See the README file for information on usage and redistribution. # - import re - from PIL import Image, ImageFile +from .exceptions import InvalidFileType + __version__ = "0.2" @@ -37,12 +37,11 @@ class ImtImageFile(ImageFile.ImageFile): 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") + raise InvalidFileType("not an IM file") self.fp.seek(0) xsize = ysize = 0 diff --git a/PIL/IptcImagePlugin.py b/PIL/IptcImagePlugin.py index 319e6abfe..a1240b8d2 100644 --- a/PIL/IptcImagePlugin.py +++ b/PIL/IptcImagePlugin.py @@ -15,11 +15,11 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - -from PIL import Image, ImageFile, _binary import os import tempfile +from PIL import Image, ImageFile, _binary +from .exceptions import InvalidFileType + __version__ = "0.3" @@ -43,12 +43,6 @@ 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. @@ -72,7 +66,7 @@ class IptcImageFile(ImageFile.ImageFile): # syntax if i8(s[0]) != 0x1C or tag[0] < 1 or tag[0] > 9: - raise SyntaxError("invalid IPTC/NAA file") + raise InvalidFileType("invalid IPTC/NAA file") # field size size = i8(s[3]) @@ -107,8 +101,6 @@ class IptcImageFile(ImageFile.ImageFile): 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]) diff --git a/PIL/Jpeg2KImagePlugin.py b/PIL/Jpeg2KImagePlugin.py index 66de34bfa..f6d76a40a 100644 --- a/PIL/Jpeg2KImagePlugin.py +++ b/PIL/Jpeg2KImagePlugin.py @@ -12,10 +12,12 @@ # # See the README file for information on usage and redistribution. # -from PIL import Image, ImageFile -import struct -import os import io +import os +import struct +from PIL import Image, ImageFile +from .exceptions import PILReadError, InvalidFileType + __version__ = "0.1" @@ -70,7 +72,7 @@ def _parse_jp2_header(fp): hlen = 8 if lbox < hlen: - raise SyntaxError('Invalid JP2 header length') + raise PILReadError("Invalid JP2 header length") if tbox == b'jp2h': header = fp.read(lbox - hlen) @@ -79,7 +81,7 @@ def _parse_jp2_header(fp): fp.seek(lbox - hlen, os.SEEK_CUR) if header is None: - raise SyntaxError('could not find JP2 header') + raise PILReadError("Could not find JP2 header") size = None mode = None @@ -143,7 +145,7 @@ def _parse_jp2_header(fp): break if size is None or mode is None: - raise SyntaxError("Malformed jp2 header") + raise PILReadError("Malformed jp2 header") return (size, mode) @@ -167,10 +169,10 @@ class Jpeg2KImageFile(ImageFile.ImageFile): self.codec = "jp2" self.size, self.mode = _parse_jp2_header(self.fp) else: - raise SyntaxError('not a JPEG 2000 file') + raise InvalidFileType("not a JPEG 2000 file") if self.size is None or self.mode is None: - raise SyntaxError('unable to determine size/mode') + raise PILReadError("unable to determine size/mode") self.reduce = 0 self.layers = 0 diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 3976ff55a..38422c136 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -32,16 +32,16 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - import array import struct import io import warnings from PIL import Image, ImageFile, TiffImagePlugin, _binary +from .exceptions import InvalidFileType, PILReadError from PIL.JpegPresets import presets from PIL._util import isStringType + i8 = _binary.i8 o8 = _binary.o8 i16 = _binary.i16be @@ -146,7 +146,7 @@ def SOF(self, marker): self.bits = i8(s[0]) if self.bits != 8: - raise SyntaxError("cannot handle %d-bit layers" % self.bits) + raise NotImplementedError("cannot handle %d-bit layers" % self.bits) self.layers = i8(s[5]) if self.layers == 1: @@ -156,7 +156,7 @@ def SOF(self, marker): elif self.layers == 4: self.mode = "CMYK" else: - raise SyntaxError("cannot handle %d-layer images" % self.layers) + raise NotImplementedError("cannot handle %d-layer images" % self.layers) if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: self.info["progressive"] = self.info["progression"] = 1 @@ -193,14 +193,13 @@ def DQT(self, marker): s = ImageFile._safe_read(self.fp, n) while len(s): if len(s) < 65: - raise SyntaxError("bad quantization table marker") + raise PILReadError("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" # @@ -290,7 +289,7 @@ class JpegImageFile(ImageFile.ImageFile): s = self.fp.read(1) if i8(s) != 255: - raise SyntaxError("not a JPEG file") + raise InvalidFileType("not a JPEG file") # Create attributes self.bits = self.layers = 0 @@ -317,7 +316,6 @@ class JpegImageFile(ImageFile.ImageFile): 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 @@ -335,7 +333,7 @@ class JpegImageFile(ImageFile.ImageFile): elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) s = self.fp.read(1) else: - raise SyntaxError("no marker found") + raise PILReadError("no marker found") def draft(self, mode, size): @@ -481,12 +479,12 @@ def _getmp(self): info.load(file_contents) mp = dict(info) except: - raise SyntaxError("malformed MP Index (unreadable directory)") + raise PILReadError("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)") + raise PILReadError("malformed MP Index (no number of images)") # get MP entries mpentries = [] try: @@ -511,7 +509,7 @@ def _getmp(self): if mpentryattr['ImageDataFormat'] == 0: mpentryattr['ImageDataFormat'] = 'JPEG' else: - raise SyntaxError("unsupported picture format in MPO") + raise PILReadError("unsupported picture format in MPO") mptypemap = { 0x000000: 'Undefined', 0x010001: 'Large Thumbnail (VGA Equivalent)', @@ -527,7 +525,7 @@ def _getmp(self): mpentries.append(mpentry) mp[0xB002] = mpentries except KeyError: - raise SyntaxError("malformed MP Index (bad MP Entry)") + raise PILReadError("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. @@ -758,7 +756,7 @@ def jpeg_factory(fp=None, filename=None): except (TypeError, IndexError): # It is really a JPEG pass - except SyntaxError: + except PILReadError: warnings.warn("Image appears to be a malformed MPO file, it will be " "interpreted as a base JPEG file") return im diff --git a/PIL/McIdasImagePlugin.py b/PIL/McIdasImagePlugin.py index b75360353..986f86bbb 100644 --- a/PIL/McIdasImagePlugin.py +++ b/PIL/McIdasImagePlugin.py @@ -18,6 +18,8 @@ import struct from PIL import Image, ImageFile +from .exceptions import InvalidFileType + __version__ = "0.2" @@ -35,11 +37,10 @@ class McIdasImageFile(ImageFile.ImageFile): 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") + raise InvalidFileType("not an McIdas area file") self.area_descriptor_raw = s self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) @@ -56,7 +57,7 @@ class McIdasImageFile(ImageFile.ImageFile): mode = "I" rawmode = "I;32B" else: - raise SyntaxError("unsupported McIdas format") + raise NotImplementedError("unsupported McIdas format: %r" % (w[11])) self.mode = mode self.size = w[10], w[9] diff --git a/PIL/MicImagePlugin.py b/PIL/MicImagePlugin.py index 125e297ac..4397e54f3 100644 --- a/PIL/MicImagePlugin.py +++ b/PIL/MicImagePlugin.py @@ -16,10 +16,10 @@ # See the README file for information on usage and redistribution. # - -from PIL import Image, TiffImagePlugin - import olefile +from PIL import Image, TiffImagePlugin +from .exceptions import InvalidFileType, PILReadError + __version__ = "0.1" @@ -48,7 +48,7 @@ class MicImageFile(TiffImagePlugin.TiffImageFile): try: self.ole = olefile.OleFileIO(self.fp) except IOError: - raise SyntaxError("not an MIC file; invalid OLE file") + raise InvalidFileType("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... ;-) @@ -61,7 +61,7 @@ class MicImageFile(TiffImagePlugin.TiffImageFile): # 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") + raise PILReadError("not an MIC file; no image entries") self.__fp = self.fp self.frame = 0 diff --git a/PIL/MpegImagePlugin.py b/PIL/MpegImagePlugin.py index 6671b8691..4f0da938f 100644 --- a/PIL/MpegImagePlugin.py +++ b/PIL/MpegImagePlugin.py @@ -16,6 +16,8 @@ from PIL import Image, ImageFile from PIL._binary import i8 +from .exceptions import InvalidFileType + __version__ = "0.1" @@ -65,11 +67,10 @@ class MpegImageFile(ImageFile.ImageFile): format_description = "MPEG" def _open(self): - s = BitStream(self.fp) if s.read(32) != 0x1B3: - raise SyntaxError("not an MPEG file") + raise InvalidFileType("not an MPEG file") self.mode = "RGB" self.size = s.read(12), s.read(12) diff --git a/PIL/MspImagePlugin.py b/PIL/MspImagePlugin.py index 85f8e764b..e60a76f14 100644 --- a/PIL/MspImagePlugin.py +++ b/PIL/MspImagePlugin.py @@ -18,6 +18,8 @@ from PIL import Image, ImageFile, _binary +from .exceptions import InvalidFileType, PILReadError + __version__ = "0.1" @@ -46,14 +48,14 @@ class MspImageFile(ImageFile.ImageFile): # Header s = self.fp.read(32) if s[:4] not in [b"DanM", b"LinS"]: - raise SyntaxError("not an MSP file") + raise InvalidFileType("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") + raise PILReadError("bad MSP checksum") self.mode = "1" self.size = i16(s[4:]), i16(s[6:]) diff --git a/PIL/PaletteFile.py b/PIL/PaletteFile.py index ef50feefd..5c983ba3e 100644 --- a/PIL/PaletteFile.py +++ b/PIL/PaletteFile.py @@ -14,6 +14,7 @@ # from PIL._binary import o8 +from .exceptions import InvalidFileType ## @@ -24,11 +25,9 @@ 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: @@ -36,7 +35,7 @@ class PaletteFile(object): if s[0:1] == b"#": continue if len(s) > 100: - raise SyntaxError("bad palette file") + raise PILReadError("bad palette file") v = [int(x) for x in s.split()] try: diff --git a/PIL/PcdImagePlugin.py b/PIL/PcdImagePlugin.py index 24186bcfc..aca7fb05a 100644 --- a/PIL/PcdImagePlugin.py +++ b/PIL/PcdImagePlugin.py @@ -14,8 +14,9 @@ # See the README file for information on usage and redistribution. # - from PIL import Image, ImageFile, _binary +from .exceptions import InvalidFileType + __version__ = "0.1" @@ -39,7 +40,7 @@ class PcdImageFile(ImageFile.ImageFile): s = self.fp.read(2048) if s[:4] != b"PCD_": - raise SyntaxError("not a PCD file") + raise InvalidFileType("not a PCD file") orientation = i8(s[1538]) & 3 self.tile_post_rotate = None diff --git a/PIL/PcfFontFile.py b/PIL/PcfFontFile.py index c2006905e..9a6cb1e9a 100644 --- a/PIL/PcfFontFile.py +++ b/PIL/PcfFontFile.py @@ -16,9 +16,9 @@ # See the README file for information on usage and redistribution. # -from PIL import Image -from PIL import FontFile -from PIL import _binary +from PIL import FontFile, Image, _binary +from .exceptions import InvalidFileType, PILReadError + # -------------------------------------------------------------------- # declarations @@ -64,7 +64,7 @@ class PcfFontFile(FontFile.FontFile): magic = l32(fp.read(4)) if magic != PCF_MAGIC: - raise SyntaxError("not a PCF file") + raise InvalidFileType("not a PCF file") FontFile.FontFile.__init__(self) @@ -194,7 +194,7 @@ class PcfFontFile(FontFile.FontFile): nbitmaps = i32(fp.read(4)) if nbitmaps != len(metrics): - raise IOError("Wrong number of bitmaps") + raise PILReadError("Wrong number of bitmaps") offsets = [] for i in range(nbitmaps): diff --git a/PIL/PcxImagePlugin.py b/PIL/PcxImagePlugin.py index 9440d5362..f103a4d39 100644 --- a/PIL/PcxImagePlugin.py +++ b/PIL/PcxImagePlugin.py @@ -25,10 +25,10 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - import logging from PIL import Image, ImageFile, ImagePalette, _binary +from .exceptions import InvalidFileType, PILReadError + logger = logging.getLogger(__name__) @@ -52,16 +52,15 @@ class PcxImageFile(ImageFile.ImageFile): format_description = "Paintbrush" def _open(self): - # header s = self.fp.read(128) if not _accept(s): - raise SyntaxError("not a PCX file") + raise InvalidFileType("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") + raise PILReadError("bad PCX image size") logger.debug("BBox: %s %s %s %s", *bbox) # format diff --git a/PIL/PixarImagePlugin.py b/PIL/PixarImagePlugin.py index fd002d9cf..0c0d6e763 100644 --- a/PIL/PixarImagePlugin.py +++ b/PIL/PixarImagePlugin.py @@ -20,6 +20,8 @@ # from PIL import Image, ImageFile, _binary +from .exceptions import InvalidFileType + __version__ = "0.1" @@ -46,7 +48,7 @@ class PixarImageFile(ImageFile.ImageFile): # assuming a 4-byte magic label s = self.fp.read(4) if s != b"\200\350\000\000": - raise SyntaxError("not a PIXAR file") + raise InvalidFileType("not a PIXAR file") # read rest of header s = s + self.fp.read(508) diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index 4d6f9d7ff..e2dda77c3 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -31,14 +31,13 @@ # See the README file for information on usage and redistribution. # -from __future__ import print_function - import logging import re import zlib import struct - from PIL import Image, ImageFile, ImagePalette, _binary +from .exceptions import InvalidFileType, PILReadError + __version__ = "0.9" @@ -118,7 +117,7 @@ class ChunkStream(object): length = i32(s) if not is_cid(cid): - raise SyntaxError("broken PNG file (chunk %s)" % repr(cid)) + raise PILReadError("broken PNG file (chunk %s)" % repr(cid)) return cid, pos, length @@ -148,11 +147,9 @@ class ChunkStream(object): crc1 = Image.core.crc32(data, Image.core.crc32(cid)) crc2 = i16(self.fp.read(2)), i16(self.fp.read(2)) if crc1 != crc2: - raise SyntaxError("broken PNG file (bad header checksum in %r)" - % cid) + raise PILReadError("Bad header checksum in %r)" % (cid)) except struct.error: - raise SyntaxError("broken PNG file (incomplete checksum in %r)" - % cid) + raise PILReadError("Incomplete checksum in %r" % (cid)) def crc_skip(self, cid, data): "Read checksum. Used if the C module is not present" @@ -313,8 +310,7 @@ class PngStream(ChunkStream): 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) + raise PILReadError("Unknown compression method %s" % (comp_method))() try: icc_profile = _safe_zlib_decompress(s[i+2:]) except ValueError: @@ -339,7 +335,7 @@ class PngStream(ChunkStream): if i8(s[12]): self.im_info["interlace"] = 1 if i8(s[11]): - raise SyntaxError("unknown filter category") + raise PILReadError("unknown filter category") return s def chunk_IDAT(self, pos, length): @@ -437,7 +433,7 @@ class PngStream(ChunkStream): else: comp_method = 0 if comp_method != 0: - raise SyntaxError("Unknown compression method %s in zTXt chunk" % + raise PILReadError("Unknown compression method %s in zTXt chunk" % comp_method) try: v = _safe_zlib_decompress(v[1:]) @@ -520,7 +516,7 @@ class PngImageFile(ImageFile.ImageFile): def _open(self): if self.fp.read(8) != _MAGIC: - raise SyntaxError("not a PNG file") + raise InvalidFileType("not a PNG file") # # Parse headers up to the first IDAT chunk diff --git a/PIL/PpmImagePlugin.py b/PIL/PpmImagePlugin.py index adaf8384c..2c3c37004 100644 --- a/PIL/PpmImagePlugin.py +++ b/PIL/PpmImagePlugin.py @@ -14,10 +14,10 @@ # See the README file for information on usage and redistribution. # - import string - from PIL import Image, ImageFile +from .exceptions import InvalidFileType, PILReadError, PILWriteError + __version__ = "0.2" @@ -31,7 +31,7 @@ try: if locale_enc is None: locale_lang, locale_enc = locale.getdefaultlocale() b_whitespace = b_whitespace.decode(locale_enc) -except: +except Exception: pass b_whitespace = b_whitespace.encode('ascii', 'ignore') @@ -67,10 +67,10 @@ class PpmImageFile(ImageFile.ImageFile): if not c or c in b_whitespace: break if c > b'\x79': - raise ValueError("Expected ASCII value, found binary") + raise PILReadError("Expected ASCII value, found binary") s = s + c if (len(s) > 9): - raise ValueError("Expected int, got > 9 digits") + raise PILReadError("Expected int, got > 9 digits") return s def _open(self): @@ -78,7 +78,7 @@ class PpmImageFile(ImageFile.ImageFile): # check magic s = self.fp.read(1) if s != b"P": - raise SyntaxError("not a PPM file") + raise InvalidFileType("not a PPM file") mode = MODES[self._token(s)] if mode == "1": @@ -94,7 +94,7 @@ class PpmImageFile(ImageFile.ImageFile): if s not in b_whitespace: break if s == b"": - raise ValueError("File does not extend beyond magic number") + raise PILReadError("File does not extend beyond magic number") if s != b"#": break s = self.fp.readline() @@ -109,7 +109,7 @@ class PpmImageFile(ImageFile.ImageFile): # maxgrey if s > 255: if not mode == 'L': - raise ValueError("Too many colors for band: %s" % s) + raise PILReadError("Too many colors for band: %s" % s) if s < 2**16: self.mode = 'I' rawmode = 'I;16B' @@ -142,7 +142,7 @@ def _save(im, fp, filename): elif im.mode == "RGBA": rawmode, head = "RGB", b"P6" else: - raise IOError("cannot write mode %s as PPM" % im.mode) + raise PILWriteError("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") diff --git a/PIL/PsdImagePlugin.py b/PIL/PsdImagePlugin.py index d06e320b0..be38ba051 100644 --- a/PIL/PsdImagePlugin.py +++ b/PIL/PsdImagePlugin.py @@ -16,9 +16,11 @@ # See the README file for information on usage and redistribution. # -__version__ = "0.4" - from PIL import Image, ImageFile, ImagePalette, _binary +from .exceptions import InvalidFileType, PILReadError + + +__version__ = "0.4" MODES = { # (photoshop mode, bits) -> (pil mode, required channels) @@ -57,7 +59,6 @@ class PsdImageFile(ImageFile.ImageFile): format_description = "Adobe Photoshop" def _open(self): - read = self.fp.read # @@ -65,7 +66,7 @@ class PsdImageFile(ImageFile.ImageFile): s = read(26) if s[:4] != b"8BPS" or i16(s[4:]) != 1: - raise SyntaxError("not a PSD file") + raise InvalidFileType("not a PSD file") psd_bits = i16(s[22:]) psd_channels = i16(s[12:]) @@ -74,7 +75,7 @@ class PsdImageFile(ImageFile.ImageFile): mode, channels = MODES[(psd_mode, psd_bits)] if channels > psd_channels: - raise IOError("not enough channels") + raise PILReadError("not enough channels") self.mode = mode self.size = i32(s[18:]), i32(s[14:]) diff --git a/PIL/PyAccess.py b/PIL/PyAccess.py index 8b67a8ea2..dd7e9e264 100644 --- a/PIL/PyAccess.py +++ b/PIL/PyAccess.py @@ -20,11 +20,8 @@ # Access.c implementation. # -from __future__ import print_function - import logging import sys - from cffi import FFI diff --git a/PIL/SpiderImagePlugin.py b/PIL/SpiderImagePlugin.py index aa332bf02..f2a38dfb0 100644 --- a/PIL/SpiderImagePlugin.py +++ b/PIL/SpiderImagePlugin.py @@ -14,12 +14,6 @@ # 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 # @@ -33,12 +27,11 @@ # http://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 +from .exceptions import InvalidFileType, PILReadError def isInt(f): @@ -75,9 +68,9 @@ def isSpiderHeader(t): 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 @@ -112,14 +105,14 @@ class SpiderImageFile(ImageFile.ImageFile): t = struct.unpack('<27f', f) # little-endian hdrlen = isSpiderHeader(t) if hdrlen == 0: - raise SyntaxError("not a valid Spider file") + raise InvalidFileType("not a valid Spider file") except struct.error: - raise SyntaxError("not a valid Spider file") + raise InvalidFileType("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") + raise InvalidFileType("not a Spider 2D image") self.size = int(h[12]), int(h[2]) # size in pixels (width, height) self.istack = int(h[24]) @@ -142,7 +135,7 @@ class SpiderImageFile(ImageFile.ImageFile): offset = hdrlen + self.stkoffset self.istack = 2 # So Image knows it's still a stack else: - raise SyntaxError("inconsistent stack header values") + raise PILReadError("inconsistent stack header values") if self.bigendian: self.rawmode = "F;32BF" @@ -195,30 +188,6 @@ class SpiderImageFile(ImageFile.ImageFile): 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 @@ -288,34 +257,3 @@ def _save_spider(im, fp, filename): Image.register_open(SpiderImageFile.format, SpiderImageFile) Image.register_save(SpiderImageFile.format, _save_spider) - -if __name__ == "__main__": - - if not sys.argv[1:]: - 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() - - outfile = "" - if len(sys.argv[1:]) > 1: - outfile = sys.argv[2] - - 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 outfile != "": - # 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/PIL/SunImagePlugin.py b/PIL/SunImagePlugin.py index c3e2bc402..5608cb42a 100644 --- a/PIL/SunImagePlugin.py +++ b/PIL/SunImagePlugin.py @@ -16,8 +16,9 @@ # See the README file for information on usage and redistribution. # - from PIL import Image, ImageFile, ImagePalette, _binary +from .exceptions import InvalidFileType + __version__ = "0.3" @@ -56,18 +57,18 @@ class SunImageFile(ImageFile.ImageFile): # HEAD s = self.fp.read(32) if i32(s) != 0x59a66a95: - raise SyntaxError("not an SUN raster file") + raise InvalidFileType("not a 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. + 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: @@ -85,23 +86,23 @@ class SunImageFile(ImageFile.ImageFile): else: self.mode, rawmode = 'RGB', 'BGRX' else: - raise SyntaxError("Unsupported Mode/Bit Depth") - + raise NotImplementedError("Unsupported Mode/Bit Depth") + if palette_length: if palette_length > 1024: - raise SyntaxError("Unsupported Color Palette Length") + raise NotImplementedError("Unsupported Color Palette Length") if palette_type != 1: - raise SyntaxError("Unsupported Palette Type") - + raise NotImplementedError("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 + 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 @@ -126,8 +127,9 @@ class SunImageFile(ImageFile.ImageFile): elif file_type == 2: self.tile = [("sun_rle", (0, 0)+self.size, offset, rawmode)] else: - raise SyntaxError('Unsupported Sun Raster file type') - + raise NotImplementedError('Unsupported Sun Raster file type') + + # # registry diff --git a/PIL/TgaImagePlugin.py b/PIL/TgaImagePlugin.py index a75ce2986..61a12a887 100644 --- a/PIL/TgaImagePlugin.py +++ b/PIL/TgaImagePlugin.py @@ -16,8 +16,9 @@ # See the README file for information on usage and redistribution. # - from PIL import Image, ImageFile, ImagePalette, _binary +from .exceptions import InvalidFileType, PILReadError, PILWriteError + __version__ = "0.3" @@ -69,7 +70,7 @@ class TgaImageFile(ImageFile.ImageFile): 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") + raise InvalidFileType("not a TGA file") # image mode if imagetype in (3, 11): @@ -83,7 +84,7 @@ class TgaImageFile(ImageFile.ImageFile): if depth == 32: self.mode = "RGBA" else: - raise SyntaxError("unknown TGA mode") + raise PILReadError("unknown TGA mode") # orientation orientation = flags & 0x30 @@ -92,7 +93,7 @@ class TgaImageFile(ImageFile.ImageFile): elif not orientation: orientation = -1 else: - raise SyntaxError("unknown TGA orientation") + raise PILReadError("unknown TGA orientation") self.info["orientation"] = orientation @@ -150,7 +151,7 @@ def _save(im, fp, filename, check=0): try: rawmode, bits, colormaptype, imagetype = SAVE[im.mode] except KeyError: - raise IOError("cannot write mode %s as TGA" % im.mode) + raise PILWriteError("cannot write mode %s as TGA" % im.mode) if check: return check diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index ae98831d2..38ef43793 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -41,23 +41,18 @@ from __future__ import division, print_function -from PIL import Image, ImageFile -from PIL import ImagePalette -from PIL import _binary -from PIL import TiffTags - import collections -from fractions import Fraction -from numbers import Number, Rational - import io import itertools import os import struct import sys import warnings - +from fractions import Fraction +from numbers import Number, Rational from .TiffTags import TYPES +from PIL import Image, ImageFile, ImagePalette, TiffTags, _binary +from .exceptions import InvalidFileType __version__ = "1.3.5" @@ -436,14 +431,14 @@ class ImageFileDirectory_v2(collections.MutableMapping): :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) + raise InvalidFileType("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") + raise InvalidFileType("not a TIFF IFD") self.reset() self.next, = self._unpack("L", ifh[4:]) self._legacy_api = False @@ -1156,7 +1151,7 @@ class TiffImageFile(ImageFile.ImageFile): except KeyError: if DEBUG: print("- unsupported format") - raise SyntaxError("unknown pixel mode") + raise PILReadError("unknown pixel mode") if DEBUG: print("- raw mode:", rawmode) @@ -1276,7 +1271,7 @@ class TiffImageFile(ImageFile.ImageFile): else: if DEBUG: print("- unsupported data organization") - raise SyntaxError("unknown data organization") + raise PILReadError("unknown data organization") # Fix up info. if ICCPROFILE in self.tag_v2: diff --git a/PIL/WalImageFile.py b/PIL/WalImageFile.py index 1167fa739..c77fa26bc 100644 --- a/PIL/WalImageFile.py +++ b/PIL/WalImageFile.py @@ -21,8 +21,6 @@ # http://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml # and has been tested with a few sample files found using google. -from __future__ import print_function - from PIL import Image, _binary try: diff --git a/PIL/WmfImagePlugin.py b/PIL/WmfImagePlugin.py index 99e498226..b904fa9c8 100644 --- a/PIL/WmfImagePlugin.py +++ b/PIL/WmfImagePlugin.py @@ -19,9 +19,9 @@ # http://wvware.sourceforge.net/caolan/index.html # http://wvware.sourceforge.net/caolan/ora-wmf.html -from __future__ import print_function - from PIL import Image, ImageFile, _binary +from .exceptions import InvalidFileType + __version__ = "0.2" @@ -110,11 +110,9 @@ class WmfStubImageFile(ImageFile.StubImageFile): 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") + raise NotImplementedError("Unsupported WMF file format") elif dword(s) == 1 and s[40:44] == b" EMF": # enhanced metafile @@ -143,7 +141,7 @@ class WmfStubImageFile(ImageFile.StubImageFile): self.info["dpi"] = xdpi, ydpi else: - raise SyntaxError("Unsupported file format") + raise InvalidFileType("Not a WMF file") self.mode = "RGB" self.size = size diff --git a/PIL/XVThumbImagePlugin.py b/PIL/XVThumbImagePlugin.py index 0034ff7d0..c178b02d0 100644 --- a/PIL/XVThumbImagePlugin.py +++ b/PIL/XVThumbImagePlugin.py @@ -18,6 +18,8 @@ # from PIL import Image, ImageFile, ImagePalette, _binary +from .exceptions import InvalidFileType, PILReadError + __version__ = "0.1" @@ -46,10 +48,9 @@ class XVThumbImageFile(ImageFile.ImageFile): format_description = "XV thumbnail image" def _open(self): - # check magic if self.fp.read(6) != _MAGIC: - raise SyntaxError("not an XV thumbnail file") + raise InvalidFileType("not an XV thumbnail file") # Skip to beginning of next line self.fp.readline() @@ -58,7 +59,7 @@ class XVThumbImageFile(ImageFile.ImageFile): while True: s = self.fp.readline() if not s: - raise SyntaxError("Unexpected EOF reading XV thumbnail file") + raise PILReadError("Unexpected EOF reading XV thumbnail file") if s[0] != b'#': break diff --git a/PIL/XpmImagePlugin.py b/PIL/XpmImagePlugin.py index 556adb8f7..5fb72b480 100644 --- a/PIL/XpmImagePlugin.py +++ b/PIL/XpmImagePlugin.py @@ -18,6 +18,8 @@ import re from PIL import Image, ImageFile, ImagePalette from PIL._binary import i8, o8 +from .exceptions import InvalidFileType, PILReadError + __version__ = "0.2" @@ -40,13 +42,13 @@ class XpmImageFile(ImageFile.ImageFile): def _open(self): if not _accept(self.fp.read(9)): - raise SyntaxError("not an XPM file") + raise InvalidFileType("not an XPM file") # skip forward to next string while True: s = self.fp.readline() if not s: - raise SyntaxError("broken XPM file") + raise PILReadError("broken XPM file") m = xpm_head.match(s) if m: break diff --git a/PIL/exceptions.py b/PIL/exceptions.py new file mode 100644 index 000000000..3915d25e4 --- /dev/null +++ b/PIL/exceptions.py @@ -0,0 +1,37 @@ +""" +PIL Exceptions +""" + + +class PILError(Exception): + """ + Base exception for all PIL exceptions + """ + pass + + +class PILReadError(PILError): + """ + Some error happened while reading a file. + """ + pass + + +class InvalidFileType(PILReadError): + """ + The given file is not of the expected type. + """ + + +class NoPluginFound(PILError): + """ + No plugin was found for the given format. + """ + pass + + +class PILWriteError(PILError): + """ + Some error happened while writing a file. + """ + pass diff --git a/Tests/helper.py b/Tests/helper.py index f4b6b52cf..bd9ba83d5 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -1,12 +1,10 @@ """ Helper functions. """ -from __future__ import print_function +import os import sys import tempfile -import os import unittest - from PIL import Image, ImageMath diff --git a/Tests/import_all.py b/Tests/import_all.py index c5960d8bb..c7f5d6818 100644 --- a/Tests/import_all.py +++ b/Tests/import_all.py @@ -7,6 +7,7 @@ import traceback import sys sys.path.insert(0, ".") + for file in glob.glob("PIL/*.py"): module = os.path.basename(file)[:-3] try: diff --git a/Tests/test_bmp_reference.py b/Tests/test_bmp_reference.py index fa4571e60..56c113d3c 100644 --- a/Tests/test_bmp_reference.py +++ b/Tests/test_bmp_reference.py @@ -1,8 +1,7 @@ -from __future__ import print_function +import os +from PIL import Image from helper import unittest, PillowTestCase -from PIL import Image -import os base = os.path.join('Tests', 'images', 'bmp') @@ -22,7 +21,6 @@ class TestBmpReference(PillowTestCase): im.load() except Exception: # as msg: pass - # print("Bad Image %s: %s" %(f,msg)) def test_questionable(self): """ These shouldn't crash/dos, but it's not well defined that these @@ -47,7 +45,6 @@ class TestBmpReference(PillowTestCase): except Exception: # as msg: if os.path.basename(f) in supported: raise - # print("Bad Image %s: %s" %(f,msg)) def test_good(self): """ These should all work. There's a set of target files in the diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py index 36bc84d84..cbf424d99 100644 --- a/Tests/test_file_bmp.py +++ b/Tests/test_file_bmp.py @@ -1,7 +1,7 @@ -from helper import unittest, PillowTestCase, hopper - -from PIL import Image, BmpImagePlugin import io +from PIL import Image, BmpImagePlugin +from PIL.exceptions import InvalidFileType +from helper import unittest, PillowTestCase, hopper class TestFileBmp(PillowTestCase): @@ -27,7 +27,7 @@ class TestFileBmp(PillowTestCase): def test_invalid_file(self): with open("Tests/images/flower.jpg", "rb") as fp: - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: BmpImagePlugin.BmpImageFile(fp)) def test_save_to_bytes(self): diff --git a/Tests/test_file_bufrstub.py b/Tests/test_file_bufrstub.py index 6872ca339..65ce467dc 100644 --- a/Tests/test_file_bufrstub.py +++ b/Tests/test_file_bufrstub.py @@ -1,6 +1,6 @@ -from helper import unittest, PillowTestCase - from PIL import BufrStubImagePlugin +from PIL.exceptions import InvalidFileType +from helper import unittest, PillowTestCase class TestFileBufrStub(PillowTestCase): @@ -8,7 +8,7 @@ class TestFileBufrStub(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: BufrStubImagePlugin.BufrStubImageFile(invalid_file)) diff --git a/Tests/test_file_cur.py b/Tests/test_file_cur.py index 5ae0e7eff..c53c42242 100644 --- a/Tests/test_file_cur.py +++ b/Tests/test_file_cur.py @@ -1,6 +1,7 @@ +from PIL import Image, CurImagePlugin +from PIL.exceptions import InvalidFileType from helper import unittest, PillowTestCase -from PIL import Image, CurImagePlugin TEST_FILE = "Tests/images/deerstalker.cur" @@ -20,7 +21,7 @@ class TestFileCur(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: CurImagePlugin.CurImageFile(invalid_file)) no_cursors_file = "Tests/images/no_cursors.cur" diff --git a/Tests/test_file_dcx.py b/Tests/test_file_dcx.py index 09da3c439..6698a65f8 100644 --- a/Tests/test_file_dcx.py +++ b/Tests/test_file_dcx.py @@ -1,6 +1,8 @@ from helper import unittest, PillowTestCase, hopper from PIL import Image, DcxImagePlugin +from PIL.exceptions import InvalidFileType + # Created with ImageMagick: convert hopper.ppm hopper.dcx TEST_FILE = "Tests/images/hopper.dcx" @@ -22,7 +24,7 @@ class TestFileDcx(PillowTestCase): def test_invalid_file(self): with open("Tests/images/flower.jpg", "rb") as fp: - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: DcxImagePlugin.DcxImageFile(fp)) def test_tell(self): diff --git a/Tests/test_file_eps.py b/Tests/test_file_eps.py index c16d2669c..571b9854c 100644 --- a/Tests/test_file_eps.py +++ b/Tests/test_file_eps.py @@ -1,7 +1,8 @@ +import io +from PIL import Image, EpsImagePlugin +from PIL.exceptions import InvalidFileType from helper import unittest, PillowTestCase -from PIL import Image, EpsImagePlugin -import io # Our two EPS test files (they are identical except for their bounding boxes) file1 = "Tests/images/zero_bb.eps" @@ -54,7 +55,7 @@ class TestFileEps(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: EpsImagePlugin.EpsImageFile(invalid_file)) def test_cmyk(self): diff --git a/Tests/test_file_fitsstub.py b/Tests/test_file_fitsstub.py index 89e10acf1..7aaa38570 100644 --- a/Tests/test_file_fitsstub.py +++ b/Tests/test_file_fitsstub.py @@ -1,6 +1,7 @@ from helper import unittest, PillowTestCase from PIL import FitsStubImagePlugin +from PIL.exceptions import InvalidFileType class TestFileFitsStub(PillowTestCase): @@ -8,7 +9,7 @@ class TestFileFitsStub(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: FitsStubImagePlugin.FITSStubImageFile(invalid_file)) diff --git a/Tests/test_file_fli.py b/Tests/test_file_fli.py index a49301de1..b740aaeb2 100644 --- a/Tests/test_file_fli.py +++ b/Tests/test_file_fli.py @@ -1,6 +1,7 @@ +from PIL import Image, FliImagePlugin +from PIL.exceptions import InvalidFileType from helper import unittest, PillowTestCase -from PIL import Image, FliImagePlugin # sample ppm stream # created as an export of a palette image from Gimp2.6 @@ -20,7 +21,7 @@ class TestFileFli(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: FliImagePlugin.FliImageFile(invalid_file)) def test_n_frames(self): diff --git a/Tests/test_file_fpx.py b/Tests/test_file_fpx.py index e2b472ca6..fc91587bc 100644 --- a/Tests/test_file_fpx.py +++ b/Tests/test_file_fpx.py @@ -1,6 +1,6 @@ -from helper import unittest, PillowTestCase - from PIL import FpxImagePlugin +from PIL.exceptions import InvalidFileType +from helper import unittest, PillowTestCase class TestFileFpx(PillowTestCase): @@ -8,12 +8,12 @@ class TestFileFpx(PillowTestCase): def test_invalid_file(self): # Test an invalid OLE file invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: FpxImagePlugin.FpxImageFile(invalid_file)) # Test a valid OLE file, but not an FPX file ole_file = "Tests/images/test-ole-file.doc" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: FpxImagePlugin.FpxImageFile(ole_file)) diff --git a/Tests/test_file_gbr.py b/Tests/test_file_gbr.py index 97b2e97b3..287e8b334 100644 --- a/Tests/test_file_gbr.py +++ b/Tests/test_file_gbr.py @@ -1,14 +1,14 @@ -from helper import unittest, PillowTestCase - from PIL import Image, GbrImagePlugin +from PIL.exceptions import InvalidFileType +from helper import unittest, PillowTestCase class TestFileGbr(PillowTestCase): def test_invalid_file(self): - invalid_file = "Tests/images/flower.jpg" + invalid_file = "Tests/images/no_cursors.cur" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: GbrImagePlugin.GbrImageFile(invalid_file)) def test_gbr_file(self): diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py index d987f6851..61cd283b7 100644 --- a/Tests/test_file_gif.py +++ b/Tests/test_file_gif.py @@ -1,9 +1,8 @@ +from io import BytesIO +from PIL import Image, GifImagePlugin +from PIL.exceptions import InvalidFileType from helper import unittest, PillowTestCase, hopper, netpbm_available -from PIL import Image -from PIL import GifImagePlugin - -from io import BytesIO codecs = dir(Image.core) @@ -31,7 +30,7 @@ class TestFileGif(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: GifImagePlugin.GifImageFile(invalid_file)) def test_optimize(self): @@ -425,7 +424,7 @@ class TestFileGif(PillowTestCase): reloaded = Image.open(out) self.assertEqual(reloaded.info['transparency'], 253) - + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_gimppalette.py b/Tests/test_file_gimppalette.py index d04458726..41f5bf959 100644 --- a/Tests/test_file_gimppalette.py +++ b/Tests/test_file_gimppalette.py @@ -1,6 +1,7 @@ from helper import unittest, PillowTestCase from PIL.GimpPaletteFile import GimpPaletteFile +from PIL.exceptions import InvalidFileType, PILReadError class TestImage(PillowTestCase): @@ -10,13 +11,13 @@ class TestImage(PillowTestCase): GimpPaletteFile(fp) with open('Tests/images/hopper.jpg', 'rb') as fp: - self.assertRaises(SyntaxError, lambda: GimpPaletteFile(fp)) + self.assertRaises(InvalidFileType, lambda: GimpPaletteFile(fp)) with open('Tests/images/bad_palette_file.gpl', 'rb') as fp: - self.assertRaises(SyntaxError, lambda: GimpPaletteFile(fp)) + self.assertRaises(PILReadError, lambda: GimpPaletteFile(fp)) with open('Tests/images/bad_palette_entry.gpl', 'rb') as fp: - self.assertRaises(ValueError, lambda: GimpPaletteFile(fp)) + self.assertRaises(PILReadError, lambda: GimpPaletteFile(fp)) def test_get_palette(self): # Arrange diff --git a/Tests/test_file_gribstub.py b/Tests/test_file_gribstub.py index 786ce42dd..2460f0531 100644 --- a/Tests/test_file_gribstub.py +++ b/Tests/test_file_gribstub.py @@ -1,6 +1,6 @@ -from helper import unittest, PillowTestCase - from PIL import GribStubImagePlugin +from PIL.exceptions import InvalidFileType +from helper import unittest, PillowTestCase class TestFileGribStub(PillowTestCase): @@ -8,7 +8,7 @@ class TestFileGribStub(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: GribStubImagePlugin.GribStubImageFile(invalid_file)) diff --git a/Tests/test_file_hdf5stub.py b/Tests/test_file_hdf5stub.py index 4545c8212..d1b799658 100644 --- a/Tests/test_file_hdf5stub.py +++ b/Tests/test_file_hdf5stub.py @@ -1,6 +1,6 @@ -from helper import unittest, PillowTestCase - from PIL import Hdf5StubImagePlugin +from PIL.exceptions import InvalidFileType +from helper import unittest, PillowTestCase class TestFileHdf5Stub(PillowTestCase): @@ -8,7 +8,7 @@ class TestFileHdf5Stub(PillowTestCase): def test_invalid_file(self): test_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: Hdf5StubImagePlugin.HDF5StubImageFile(test_file)) diff --git a/Tests/test_file_ico.py b/Tests/test_file_ico.py index 3904340f3..2a7a7bc11 100644 --- a/Tests/test_file_ico.py +++ b/Tests/test_file_ico.py @@ -1,7 +1,8 @@ -from helper import unittest, PillowTestCase, hopper - import io from PIL import Image, IcoImagePlugin +from PIL.exceptions import InvalidFileType +from helper import unittest, PillowTestCase, hopper + # sample ppm stream TEST_ICO_FILE = "Tests/images/hopper.ico" @@ -18,7 +19,7 @@ class TestFileIco(PillowTestCase): def test_invalid_file(self): with open("Tests/images/flower.jpg", "rb") as fp: - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: IcoImagePlugin.IcoImageFile(fp)) def test_save_to_bytes(self): diff --git a/Tests/test_file_im.py b/Tests/test_file_im.py index 94d8bcce6..81329c86f 100644 --- a/Tests/test_file_im.py +++ b/Tests/test_file_im.py @@ -1,6 +1,8 @@ from helper import unittest, PillowTestCase, hopper from PIL import Image, ImImagePlugin +from PIL.exceptions import InvalidFileType + # sample im TEST_IM = "Tests/images/hopper.im" @@ -43,7 +45,7 @@ class TestFileIm(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: ImImagePlugin.ImImageFile(invalid_file)) diff --git a/Tests/test_file_iptc.py b/Tests/test_file_iptc.py index a29e1a4a6..085b007c0 100644 --- a/Tests/test_file_iptc.py +++ b/Tests/test_file_iptc.py @@ -39,27 +39,6 @@ class TestFileIptc(PillowTestCase): # Assert self.assertEqual(ret, 97) - def test_dump(self): - # Arrange - c = b"abc" - # Temporarily redirect stdout - try: - from cStringIO import StringIO - except ImportError: - from io import StringIO - import sys - old_stdout = sys.stdout - sys.stdout = mystdout = StringIO() - - # Act - IptcImagePlugin.dump(c) - - # Reset stdout - sys.stdout = old_stdout - - # Assert - self.assertEqual(mystdout.getvalue(), "61 62 63 \n") - if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 8aeb7ecae..d71bbb92a 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -1,7 +1,9 @@ from helper import unittest, PillowTestCase -from PIL import Image, Jpeg2KImagePlugin from io import BytesIO +from PIL import Image, Jpeg2KImagePlugin +from PIL.exceptions import InvalidFileType + codecs = dir(Image.core) @@ -43,7 +45,7 @@ class TestFileJpeg2k(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: Jpeg2KImagePlugin.Jpeg2KImageFile(invalid_file)) diff --git a/Tests/test_file_mcidas.py b/Tests/test_file_mcidas.py index cd601cca3..6cf68f568 100644 --- a/Tests/test_file_mcidas.py +++ b/Tests/test_file_mcidas.py @@ -1,6 +1,6 @@ -from helper import unittest, PillowTestCase - from PIL import McIdasImagePlugin +from PIL.exceptions import InvalidFileType +from helper import unittest, PillowTestCase class TestFileMcIdas(PillowTestCase): @@ -8,7 +8,7 @@ class TestFileMcIdas(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: McIdasImagePlugin.McIdasImageFile(invalid_file)) diff --git a/Tests/test_file_mic.py b/Tests/test_file_mic.py index 044248f3a..1287b1e79 100644 --- a/Tests/test_file_mic.py +++ b/Tests/test_file_mic.py @@ -1,6 +1,7 @@ from helper import unittest, PillowTestCase from PIL import MicImagePlugin +from PIL.exceptions import PILReadError, InvalidFileType class TestFileMic(PillowTestCase): @@ -8,12 +9,12 @@ class TestFileMic(PillowTestCase): def test_invalid_file(self): # Test an invalid OLE file invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: MicImagePlugin.MicImageFile(invalid_file)) # Test a valid OLE file, but not a MIC file ole_file = "Tests/images/test-ole-file.doc" - self.assertRaises(SyntaxError, + self.assertRaises(PILReadError, lambda: MicImagePlugin.MicImageFile(ole_file)) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index e174d0061..00b82ceb1 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -1,6 +1,7 @@ +from PIL import Image, MspImagePlugin +from PIL.exceptions import InvalidFileType from helper import unittest, PillowTestCase, hopper -from PIL import Image, MspImagePlugin TEST_FILE = "Tests/images/hopper.msp" @@ -21,7 +22,7 @@ class TestFileMsp(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: MspImagePlugin.MspImageFile(invalid_file)) def test_open(self): diff --git a/Tests/test_file_pcx.py b/Tests/test_file_pcx.py index 7621c1cc6..2e909aa84 100644 --- a/Tests/test_file_pcx.py +++ b/Tests/test_file_pcx.py @@ -1,6 +1,7 @@ from helper import unittest, PillowTestCase, hopper from PIL import Image, ImageFile, PcxImagePlugin +from PIL.exceptions import InvalidFileType class TestFilePcx(PillowTestCase): @@ -22,7 +23,7 @@ class TestFilePcx(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: PcxImagePlugin.PcxImageFile(invalid_file)) def test_odd(self): diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index cab0e01fa..4a82e083e 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -1,11 +1,9 @@ +import zlib +from io import BytesIO +from PIL import Image, ImageFile, PngImagePlugin +from PIL.exceptions import InvalidFileType, PILReadError from helper import unittest, PillowTestCase, hopper -from io import BytesIO - -from PIL import Image -from PIL import ImageFile -from PIL import PngImagePlugin -import zlib codecs = dir(Image.core) @@ -84,7 +82,7 @@ class TestFilePng(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: PngImagePlugin.PngImageFile(invalid_file)) def test_broken(self): @@ -317,7 +315,7 @@ class TestFilePng(PillowTestCase): im = Image.open(BytesIO(test_file)) self.assertTrue(im.fp is not None) - self.assertRaises((IOError, SyntaxError), im.verify) + self.assertRaises((IOError, PILReadError), im.verify) def test_verify_ignores_crc_error(self): # check ignores crc errors in ancillary chunks @@ -326,7 +324,7 @@ class TestFilePng(PillowTestCase): broken_crc_chunk_data = chunk_data[:-1] + b'q' # break CRC image_data = HEAD + broken_crc_chunk_data + TAIL - self.assertRaises(SyntaxError, PngImagePlugin.PngImageFile, BytesIO(image_data)) + self.assertRaises(PILReadError, PngImagePlugin.PngImageFile, BytesIO(image_data)) ImageFile.LOAD_TRUNCATED_IMAGES = True try: @@ -342,7 +340,7 @@ class TestFilePng(PillowTestCase): ImageFile.LOAD_TRUNCATED_IMAGES = True try: - self.assertRaises(SyntaxError, PngImagePlugin.PngImageFile, BytesIO(image_data)) + self.assertRaises(PILReadError, PngImagePlugin.PngImageFile, BytesIO(image_data)) finally: ImageFile.LOAD_TRUNCATED_IMAGES = False diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py index a798466b7..e96f1f827 100644 --- a/Tests/test_file_ppm.py +++ b/Tests/test_file_ppm.py @@ -1,6 +1,7 @@ from helper import unittest, PillowTestCase from PIL import Image +from PIL.exceptions import PILReadError # sample ppm stream test_file = "Tests/images/hopper.ppm" @@ -39,7 +40,7 @@ class TestFilePpm(PillowTestCase): with open(path, 'w') as f: f.write('P6') - self.assertRaises(ValueError, lambda: Image.open(path)) + self.assertRaises(IOError, lambda: Image.open(path)) def test_neg_ppm(self): diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 2b4825734..294ac893b 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -1,6 +1,8 @@ from helper import unittest, PillowTestCase from PIL import Image, PsdImagePlugin +from PIL.exceptions import InvalidFileType + # sample ppm stream test_file = "Tests/images/hopper.psd" @@ -18,7 +20,7 @@ class TestImagePsd(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: PsdImagePlugin.PsdImageFile(invalid_file)) def test_n_frames(self): diff --git a/Tests/test_file_spider.py b/Tests/test_file_spider.py index 96f82054e..8c127570d 100644 --- a/Tests/test_file_spider.py +++ b/Tests/test_file_spider.py @@ -48,29 +48,6 @@ class TestImageSpider(PillowTestCase): self.assertEqual(im.n_frames, 1) self.assertFalse(im.is_animated) - def test_loadImageSeries(self): - # Arrange - not_spider_file = "Tests/images/hopper.ppm" - file_list = [TEST_FILE, not_spider_file, "path/not_found.ext"] - - # Act - img_list = SpiderImagePlugin.loadImageSeries(file_list) - - # Assert - self.assertEqual(len(img_list), 1) - self.assertIsInstance(img_list[0], Image.Image) - self.assertEqual(img_list[0].size, (128, 128)) - - def test_loadImageSeries_no_input(self): - # Arrange - file_list = None - - # Act - img_list = SpiderImagePlugin.loadImageSeries(file_list) - - # Assert - self.assertEqual(img_list, None) - def test_isInt_not_a_number(self): # Arrange not_a_number = "a" diff --git a/Tests/test_file_sun.py b/Tests/test_file_sun.py index 40eb73898..9d13c5ae9 100644 --- a/Tests/test_file_sun.py +++ b/Tests/test_file_sun.py @@ -1,8 +1,8 @@ +import os +from PIL import Image, SunImagePlugin +from PIL.exceptions import InvalidFileType from helper import unittest, PillowTestCase, hopper -from PIL import Image, SunImagePlugin - -import os EXTRA_DIR = 'Tests/images/sunraster' @@ -20,9 +20,9 @@ class TestFileSun(PillowTestCase): self.assertEqual(im.size, (128, 128)) self.assert_image_similar(im, hopper(), 5) # visually verified - + invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: SunImagePlugin.SunImageFile(invalid_file)) def test_im1(self): @@ -39,12 +39,12 @@ class TestFileSun(PillowTestCase): in ('.sun', '.SUN', '.ras')) for path in files: with Image.open(path) as im: - im.load() + im.load() self.assertIsInstance(im, SunImagePlugin.SunImageFile) target_path = "%s.png" % os.path.splitext(path)[0] #im.save(target_file) with Image.open(target_path) as target: self.assert_image_equal(im, target) - + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_tga.py b/Tests/test_file_tga.py index ef3acfe65..db1b97a30 100644 --- a/Tests/test_file_tga.py +++ b/Tests/test_file_tga.py @@ -1,7 +1,7 @@ from helper import unittest, PillowTestCase from PIL import Image - +from PIL.exceptions import PILWriteError class TestFileTga(PillowTestCase): @@ -42,7 +42,7 @@ class TestFileTga(PillowTestCase): self.assertEqual(test_im.size, (100, 100)) # Unsupported mode save - self.assertRaises(IOError, lambda: im.convert("LA").save(test_file)) + self.assertRaises(PILWriteError, lambda: im.convert("LA").save(test_file)) def test_save_rle(self): test_file = "Tests/images/rgb32rle.tga" @@ -61,7 +61,7 @@ class TestFileTga(PillowTestCase): self.assertEqual(test_im.size, (199, 199)) # Unsupported mode save - self.assertRaises(IOError, lambda: im.convert("LA").save(test_file)) + self.assertRaises(PILWriteError, lambda: im.convert("LA").save(test_file)) if __name__ == '__main__': diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index bf19947a1..8ec3b3ae0 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -1,11 +1,10 @@ -from __future__ import print_function import logging -from io import BytesIO import struct - +from io import BytesIO +from PIL import Image, TiffImagePlugin +from PIL.exceptions import InvalidFileType from helper import unittest, PillowTestCase, hopper, py3 -from PIL import Image, TiffImagePlugin logger = logging.getLogger(__name__) @@ -116,11 +115,11 @@ class TestFileTiff(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: TiffImagePlugin.TiffImageFile(invalid_file)) TiffImagePlugin.PREFIXES.append(b"\xff\xd8\xff\xe0") - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: TiffImagePlugin.TiffImageFile(invalid_file)) TiffImagePlugin.PREFIXES.pop() @@ -462,12 +461,12 @@ class TestFileTiff(PillowTestCase): # however does. im = Image.new('RGB', (1, 1)) im.info['icc_profile'] = 'Dummy value' - + # Try save-load round trip to make sure both handle icc_profile. tmpfile = self.tempfile('temp.tif') im.save(tmpfile, 'TIFF', compression='raw') reloaded = Image.open(tmpfile) - + self.assertEqual(b'Dummy value', reloaded.info['icc_profile']) diff --git a/Tests/test_file_xpm.py b/Tests/test_file_xpm.py index 5940620ba..16081a8f8 100644 --- a/Tests/test_file_xpm.py +++ b/Tests/test_file_xpm.py @@ -1,6 +1,7 @@ +from PIL import Image, XpmImagePlugin +from PIL.exceptions import InvalidFileType from helper import unittest, PillowTestCase, hopper -from PIL import Image, XpmImagePlugin # sample ppm stream TEST_FILE = "Tests/images/hopper.xpm" @@ -21,7 +22,7 @@ class TestFileXpm(PillowTestCase): def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" - self.assertRaises(SyntaxError, + self.assertRaises(InvalidFileType, lambda: XpmImagePlugin.XpmImageFile(invalid_file)) def test_load_read(self): diff --git a/Tests/test_font_bdf.py b/Tests/test_font_bdf.py index e3b7fbbd3..251615754 100644 --- a/Tests/test_font_bdf.py +++ b/Tests/test_font_bdf.py @@ -1,6 +1,8 @@ from helper import unittest, PillowTestCase from PIL import FontFile, BdfFontFile +from PIL.exceptions import InvalidFileType + filename = "Tests/images/courB08.bdf" @@ -17,7 +19,7 @@ class TestFontBdf(PillowTestCase): def test_invalid_file(self): with open("Tests/images/flower.jpg", "rb") as fp: - self.assertRaises(SyntaxError, lambda: BdfFontFile.BdfFontFile(fp)) + self.assertRaises(InvalidFileType, lambda: BdfFontFile.BdfFontFile(fp)) if __name__ == '__main__': diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py index 25c5d7001..2dafbb5d4 100644 --- a/Tests/test_font_pcf.py +++ b/Tests/test_font_pcf.py @@ -1,7 +1,7 @@ +from PIL import FontFile, Image, ImageDraw, ImageFont, PcfFontFile +from PIL.exceptions import InvalidFileType from helper import unittest, PillowTestCase -from PIL import Image, FontFile, PcfFontFile -from PIL import ImageFont, ImageDraw codecs = dir(Image.core) @@ -32,7 +32,7 @@ class TestFontPcf(PillowTestCase): def test_invalid_file(self): with open("Tests/images/flower.jpg", "rb") as fp: - self.assertRaises(SyntaxError, lambda: PcfFontFile.PcfFontFile(fp)) + self.assertRaises(InvalidFileType, lambda: PcfFontFile.PcfFontFile(fp)) def xtest_draw(self): diff --git a/Tests/test_format_hsv.py b/Tests/test_format_hsv.py index eea29b3f1..89c065dab 100644 --- a/Tests/test_format_hsv.py +++ b/Tests/test_format_hsv.py @@ -1,10 +1,7 @@ -from __future__ import print_function -from helper import unittest, PillowTestCase, hopper - -from PIL import Image - import colorsys import itertools +from PIL import Image +from helper import unittest, PillowTestCase, hopper class TestFormatHSV(PillowTestCase): @@ -47,10 +44,6 @@ class TestFormatHSV(PillowTestCase): img = Image.merge('RGB', (r, g, b)) - # print(("%d, %d -> "% (int(1.75*px),int(.25*px))) + \ - # "(%s, %s, %s)"%img.getpixel((1.75*px, .25*px))) - # print(("%d, %d -> "% (int(.75*px),int(.25*px))) + \ - # "(%s, %s, %s)"%img.getpixel((.75*px, .25*px))) return img def to_xxx_colorsys(self, im, func, mode): @@ -95,15 +88,6 @@ class TestFormatHSV(PillowTestCase): im = src.convert('HSV') comparable = self.to_hsv_colorsys(src) - # print(im.getpixel((448, 64))) - # print(comparable.getpixel((448, 64))) - - # print(im.split()[0].histogram()) - # print(comparable.split()[0].histogram()) - - # im.split()[0].show() - # comparable.split()[0].show() - self.assert_image_similar(im.split()[0], comparable.split()[0], 1, "Hue conversion is wrong") self.assert_image_similar(im.split()[1], comparable.split()[1], @@ -111,16 +95,9 @@ class TestFormatHSV(PillowTestCase): self.assert_image_similar(im.split()[2], comparable.split()[2], 1, "Value conversion is wrong") - # print(im.getpixel((192, 64))) - comparable = src im = im.convert('RGB') - # im.split()[0].show() - # comparable.split()[0].show() - # print(im.getpixel((192, 64))) - # print(comparable.getpixel((192, 64))) - self.assert_image_similar(im.split()[0], comparable.split()[0], 3, "R conversion is wrong") self.assert_image_similar(im.split()[1], comparable.split()[1], @@ -132,12 +109,6 @@ class TestFormatHSV(PillowTestCase): im = hopper('RGB').convert('HSV') comparable = self.to_hsv_colorsys(hopper('RGB')) -# print([ord(x) for x in im.split()[0].tobytes()[:80]]) -# print([ord(x) for x in comparable.split()[0].tobytes()[:80]]) - -# print(im.split()[0].histogram()) -# print(comparable.split()[0].histogram()) - self.assert_image_similar(im.split()[0], comparable.split()[0], 1, "Hue conversion is wrong") self.assert_image_similar(im.split()[1], comparable.split()[1], @@ -150,12 +121,6 @@ class TestFormatHSV(PillowTestCase): converted = comparable.convert('RGB') comparable = self.to_rgb_colorsys(comparable) - # print(converted.split()[1].histogram()) - # print(target.split()[1].histogram()) - - # print([ord(x) for x in target.split()[1].tobytes()[:80]]) - # print([ord(x) for x in converted.split()[1].tobytes()[:80]]) - self.assert_image_similar(converted.split()[0], comparable.split()[0], 3, "R conversion is wrong") self.assert_image_similar(converted.split()[1], comparable.split()[1], diff --git a/Tests/test_image_resample.py b/Tests/test_image_resample.py index 7ae687e2f..0a32e97de 100644 --- a/Tests/test_image_resample.py +++ b/Tests/test_image_resample.py @@ -1,6 +1,5 @@ -from __future__ import print_function -from helper import unittest, PillowTestCase, hopper from PIL import Image, ImageDraw, ImageMode +from helper import unittest, PillowTestCase, hopper class TestImagingResampleVulnerability(PillowTestCase): @@ -324,10 +323,8 @@ class CoreResamplePassesTest(PillowTestCase): class CoreResampleCoefficientsTest(PillowTestCase): def test_reduce(self): test_color = 254 - # print() for size in range(400000, 400010, 2): - # print(size) i = Image.new('L', (size, 1), 0) draw = ImageDraw.Draw(i) draw.rectangle((0, 0, i.size[0] // 2 - 1, 0), test_color) @@ -335,7 +332,6 @@ class CoreResampleCoefficientsTest(PillowTestCase): px = i.resize((5, i.size[1]), Image.BICUBIC).load() if px[2, 0] != test_color // 2: self.assertEqual(test_color // 2, px[2, 0]) - # print('>', size, test_color // 2, px[2, 0]) def test_nonzero_coefficients(self): # regression test for the wrong coefficients calculation diff --git a/Tests/test_imagemath.py b/Tests/test_imagemath.py index 4f99eda93..a54d219d7 100644 --- a/Tests/test_imagemath.py +++ b/Tests/test_imagemath.py @@ -1,9 +1,6 @@ -from __future__ import print_function +from PIL import Image, ImageMath from helper import unittest, PillowTestCase -from PIL import Image -from PIL import ImageMath - def pixel(im): if hasattr(im, "im"): diff --git a/Tests/test_locale.py b/Tests/test_locale.py index 142753791..41f777592 100644 --- a/Tests/test_locale.py +++ b/Tests/test_locale.py @@ -1,9 +1,7 @@ -from __future__ import print_function +import locale +from PIL import Image from helper import unittest, PillowTestCase -from PIL import Image - -import locale # ref https://github.com/python-pillow/Pillow/issues/272 # on windows, in polish locale: diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 02ae5e50b..aeb78b04f 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -54,7 +54,6 @@ class TestNumpy(PillowTestCase): i = Image.fromarray(a) if list(i.split()[0].getdata()) != list(range(100)): print("data mismatch for", dtype) - # print(dtype, list(i.getdata())) return i # Check supported 1-bit integer formats diff --git a/Tests/test_tiff_ifdrational.py b/Tests/test_tiff_ifdrational.py index ffd4f9eac..ae4076aff 100644 --- a/Tests/test_tiff_ifdrational.py +++ b/Tests/test_tiff_ifdrational.py @@ -1,11 +1,7 @@ -from __future__ import print_function - -from helper import unittest, PillowTestCase, hopper - +from fractions import Fraction from PIL import TiffImagePlugin, Image from PIL.TiffImagePlugin import IFDRational - -from fractions import Fraction +from helper import unittest, PillowTestCase, hopper class Test_IFDRational(PillowTestCase): diff --git a/docs/handbook/writing-your-own-file-decoder.rst b/docs/handbook/writing-your-own-file-decoder.rst index f72851179..9d66df2d6 100644 --- a/docs/handbook/writing-your-own-file-decoder.rst +++ b/docs/handbook/writing-your-own-file-decoder.rst @@ -51,6 +51,7 @@ true color. **SpamImagePlugin.py**:: from PIL import Image, ImageFile + from PIL.exceptions import InvalidFileType, PILReadError import string class SpamImageFile(ImageFile.ImageFile): @@ -59,11 +60,10 @@ true color. format_description = "Spam raster image" def _open(self): - # check header header = self.fp.read(128) if header[:4] != "SPAM": - raise SyntaxError, "not a SPAM file" + raise InvalidFileType("not a SPAM file") header = string.split(header) @@ -79,7 +79,7 @@ true color. elif bits == 24: self.mode = "RGB" else: - raise SyntaxError, "unknown number of bits" + raise PILReadError("unknown number of bits") # data descriptor self.tile = [ @@ -95,7 +95,7 @@ The format handler must always set the :py:attr:`~PIL.Image.Image.size` and :py:attr:`~PIL.Image.Image.mode` attributes. If these are not set, the file cannot be opened. To simplify the decoder, the calling code considers exceptions like -:py:exc:`SyntaxError`, :py:exc:`KeyError`, :py:exc:`IndexError`, +:py:exc:`InvalidFileType`, :py:exc:`KeyError`, :py:exc:`IndexError`, :py:exc:`EOFError` and :py:exc:`struct.error` as a failure to identify the file.