Merge branch 'master' into refs-const

This commit is contained in:
nulano 2020-06-28 10:55:26 +01:00 committed by GitHub
commit 9019af5f32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 318 additions and 299 deletions

View File

@ -249,8 +249,8 @@ class DXT1Decoder(ImageFile.PyDecoder):
def decode(self, buffer):
try:
self.set_as_raw(_dxt1(self.fd, self.state.xsize, self.state.ysize))
except struct.error:
raise OSError("Truncated DDS file")
except struct.error as e:
raise OSError("Truncated DDS file") from e
return 0, 0
@ -260,8 +260,8 @@ class DXT5Decoder(ImageFile.PyDecoder):
def decode(self, buffer):
try:
self.set_as_raw(_dxt5(self.fd, self.state.xsize, self.state.ysize))
except struct.error:
raise OSError("Truncated DDS file")
except struct.error as e:
raise OSError("Truncated DDS file") from e
return 0, 0

View File

@ -8,7 +8,7 @@ Over 30 different file formats can be identified and read by the library.
Write support is less extensive, but most common interchange and presentation
formats are supported.
The :py:meth:`~PIL.Image.Image.open` function identifies files from their
The :py:meth:`~PIL.Image.open` function identifies files from their
contents, not their names, but the :py:meth:`~PIL.Image.Image.save` method
looks at the name to determine which format to use, unless the format is given
explicitly.
@ -25,7 +25,7 @@ Pillow reads and writes Windows and OS/2 BMP files containing ``1``, ``L``, ``P`
or ``RGB`` data. 16-colour images are read as ``P`` images. Run-length encoding
is not supported.
The :py:meth:`~PIL.Image.Image.open` method sets the following
The :py:meth:`~PIL.Image.open` method sets the following
:py:attr:`~PIL.Image.Image.info` properties:
**compression**
@ -74,7 +74,7 @@ are used or GIF89a is already in use.
Note that GIF files are always read as grayscale (``L``)
or palette mode (``P``) images.
The :py:meth:`~PIL.Image.Image.open` method sets the following
The :py:meth:`~PIL.Image.open` method sets the following
:py:attr:`~PIL.Image.Image.info` properties:
**background**
@ -203,7 +203,7 @@ ICNS
Pillow reads and (macOS only) writes macOS ``.icns`` files. By default, the
largest available icon is read, though you can override this by setting the
:py:attr:`~PIL.Image.Image.size` property before calling
:py:meth:`~PIL.Image.Image.load`. The :py:meth:`~PIL.Image.Image.open` method
:py:meth:`~PIL.Image.Image.load`. The :py:meth:`~PIL.Image.open` method
sets the following :py:attr:`~PIL.Image.Image.info` property:
**sizes**
@ -257,7 +257,7 @@ Using the :py:meth:`~PIL.Image.Image.draft` method, you can speed things up by
converting ``RGB`` images to ``L``, and resize images to 1/2, 1/4 or 1/8 of
their original size while loading them.
The :py:meth:`~PIL.Image.Image.open` method may set the following
The :py:meth:`~PIL.Image.open` method may set the following
:py:attr:`~PIL.Image.Image.info` properties if available:
**jfif**
@ -697,7 +697,7 @@ Pillow also reads SPIDER stack files containing sequences of SPIDER images. The
:py:meth:`~PIL.Image.Image.seek` and :py:meth:`~PIL.Image.Image.tell` methods are supported, and
random access is allowed.
The :py:meth:`~PIL.Image.Image.open` method sets the following attributes:
The :py:meth:`~PIL.Image.open` method sets the following attributes:
**format**
Set to ``SPIDER``
@ -750,7 +750,7 @@ uncompressed files.
support for reading Packbits, LZW and JPEG compressed TIFFs
without using libtiff.
The :py:meth:`~PIL.Image.Image.open` method sets the following
The :py:meth:`~PIL.Image.open` method sets the following
:py:attr:`~PIL.Image.Image.info` properties:
**compression**
@ -1021,7 +1021,7 @@ FLI, FLC
Pillow reads Autodesk FLI and FLC animations.
The :py:meth:`~PIL.Image.Image.open` method sets the following
The :py:meth:`~PIL.Image.open` method sets the following
:py:attr:`~PIL.Image.Image.info` properties:
**duration**
@ -1054,7 +1054,7 @@ GBR
The GBR decoder reads GIMP brush files, version 1 and 2.
The :py:meth:`~PIL.Image.Image.open` method sets the following
The :py:meth:`~PIL.Image.open` method sets the following
:py:attr:`~PIL.Image.Image.info` properties:
**comment**
@ -1069,7 +1069,7 @@ GD
Pillow reads uncompressed GD2 files. Note that you must use
:py:func:`PIL.GdImageFile.open` to read such a file.
The :py:meth:`~PIL.Image.Image.open` method sets the following
The :py:meth:`~PIL.Image.open` method sets the following
:py:attr:`~PIL.Image.Image.info` properties:
**transparency**
@ -1185,7 +1185,7 @@ XPM
Pillow reads X pixmap files (mode ``P``) with 256 colors or less.
The :py:meth:`~PIL.Image.Image.open` method sets the following
The :py:meth:`~PIL.Image.open` method sets the following
:py:attr:`~PIL.Image.Image.info` properties:
**transparency**

View File

@ -76,9 +76,16 @@ Constructing images
.. autofunction:: new
.. autofunction:: fromarray
.. autofunction:: frombytes
.. autofunction:: fromstring
.. autofunction:: frombuffer
Generating images
^^^^^^^^^^^^^^^^^
.. autofunction:: effect_mandelbrot
.. autofunction:: effect_noise
.. autofunction:: linear_gradient
.. autofunction:: radial_gradient
Registering plugins
^^^^^^^^^^^^^^^^^^^
@ -88,12 +95,14 @@ Registering plugins
ignore them.
.. autofunction:: register_open
.. autofunction:: register_decoder
.. autofunction:: register_mime
.. autofunction:: register_save
.. autofunction:: register_encoder
.. autofunction:: register_save_all
.. autofunction:: register_extension
.. autofunction:: register_extensions
.. autofunction:: registered_extensions
.. autofunction:: register_decoder
.. autofunction:: register_encoder
The Image Class
---------------
@ -140,6 +149,8 @@ This crops the input image with the provided coordinates:
.. automethod:: PIL.Image.Image.draft
.. automethod:: PIL.Image.Image.effect_spread
.. automethod:: PIL.Image.Image.entropy
.. automethod:: PIL.Image.Image.filter
This blurs the input image using a filter from the ``ImageFilter`` module:
@ -176,12 +187,14 @@ This helps to get the bounding box coordinates of the input image:
print(im.getbbox())
# Returns four coordinates in the format (left, upper, right, lower)
.. automethod:: PIL.Image.Image.getchannel
.. automethod:: PIL.Image.Image.getcolors
.. automethod:: PIL.Image.Image.getdata
.. automethod:: PIL.Image.Image.getextrema
.. automethod:: PIL.Image.Image.getexif
.. automethod:: PIL.Image.Image.getextrema
.. automethod:: PIL.Image.Image.getpalette
.. automethod:: PIL.Image.Image.getpixel
.. automethod:: PIL.Image.Image.getprojection
.. automethod:: PIL.Image.Image.histogram
.. automethod:: PIL.Image.Image.offset
.. automethod:: PIL.Image.Image.paste
@ -191,6 +204,8 @@ This helps to get the bounding box coordinates of the input image:
.. automethod:: PIL.Image.Image.putpalette
.. automethod:: PIL.Image.Image.putpixel
.. automethod:: PIL.Image.Image.quantize
.. automethod:: PIL.Image.Image.reduce
.. automethod:: PIL.Image.Image.remap_palette
.. automethod:: PIL.Image.Image.resize
This resizes the given image from ``(width, height)`` to ``(width/2, height/2)``:
@ -205,7 +220,6 @@ This resizes the given image from ``(width, height)`` to ``(width/2, height/2)``
(width, height) = (im.width // 2, im.height // 2)
im_resized = im.resize((width, height))
.. automethod:: PIL.Image.Image.remap_palette
.. automethod:: PIL.Image.Image.rotate
This rotates the input image by ``theta`` degrees counter clockwise:
@ -225,7 +239,6 @@ This rotates the input image by ``theta`` degrees counter clockwise:
.. automethod:: PIL.Image.Image.seek
.. automethod:: PIL.Image.Image.show
.. automethod:: PIL.Image.Image.split
.. automethod:: PIL.Image.Image.getchannel
.. automethod:: PIL.Image.Image.tell
.. automethod:: PIL.Image.Image.thumbnail
.. automethod:: PIL.Image.Image.tobitmap
@ -260,57 +273,51 @@ Attributes
Instances of the :py:class:`Image` class have the following attributes:
.. py:attribute:: filename
.. py:attribute:: Image.filename
:type: str
The filename or path of the source file. Only images created with the
factory function ``open`` have a filename attribute. If the input is a
file like object, the filename attribute is set to an empty string.
:type: :py:class:`string`
.. py:attribute:: format
.. py:attribute:: Image.format
:type: Optional[str]
The file format of the source file. For images created by the library
itself (via a factory function, or by running a method on an existing
image), this attribute is set to ``None``.
:type: :py:class:`string` or ``None``
.. py:attribute:: mode
.. py:attribute:: Image.mode
:type: str
Image mode. This is a string specifying the pixel format used by the image.
Typical values are “1”, “L”, “RGB”, or “CMYK.” See
:ref:`concept-modes` for a full list.
:type: :py:class:`string`
.. py:attribute:: size
.. py:attribute:: Image.size
:type: tuple[int]
Image size, in pixels. The size is given as a 2-tuple (width, height).
:type: ``(width, height)``
.. py:attribute:: width
.. py:attribute:: Image.width
:type: int
Image width, in pixels.
:type: :py:class:`int`
.. py:attribute:: height
.. py:attribute:: Image.height
:type: int
Image height, in pixels.
:type: :py:class:`int`
.. py:attribute:: palette
.. py:attribute:: Image.palette
:type: Optional[PIL.ImagePalette.ImagePalette]
Colour palette table, if any. If mode is "P" or "PA", this should be an
instance of the :py:class:`~PIL.ImagePalette.ImagePalette` class.
Otherwise, it should be set to ``None``.
:type: :py:class:`~PIL.ImagePalette.ImagePalette` or ``None``
.. py:attribute:: info
.. py:attribute:: Image.info
:type: dict
A dictionary holding data associated with the image. This dictionary is
used by file handlers to pass on various non-image information read from
@ -323,8 +330,6 @@ Instances of the :py:class:`Image` class have the following attributes:
Unless noted elsewhere, this dictionary does not affect saving files.
:type: :py:class:`dict`
Constants
---------

View File

@ -8,9 +8,30 @@ The :py:mod:`ImageCms` module provides color profile management
support using the LittleCMS2 color management engine, based on Kevin
Cazabon's PyCMS library.
.. automodule:: PIL.ImageCms
:members:
:noindex:
.. autoclass:: ImageCmsTransform
.. autoexception:: PyCMSError
Functions
---------
.. autofunction:: applyTransform
.. autofunction:: buildProofTransform
.. autofunction:: buildProofTransformFromOpenProfiles
.. autofunction:: buildTransform
.. autofunction:: buildTransformFromOpenProfiles
.. autofunction:: createProfile
.. autofunction:: getDefaultIntent
.. autofunction:: getOpenProfile
.. autofunction:: getProfileCopyright
.. autofunction:: getProfileDescription
.. autofunction:: getProfileInfo
.. autofunction:: getProfileManufacturer
.. autofunction:: getProfileModel
.. autofunction:: getProfileName
.. autofunction:: get_display_profile
.. autofunction:: isIntentSupported
.. autofunction:: profileToProfile
.. autofunction:: versions
CmsProfile
----------
@ -25,31 +46,30 @@ can be easily displayed in a chromaticity diagram, for example).
.. py:class:: CmsProfile
.. py:attribute:: creation_date
:type: Optional[datetime.datetime]
Date and time this profile was first created (see 7.2.1 of ICC.1:2010).
:type: :py:class:`datetime.datetime` or ``None``
.. py:attribute:: version
:type: float
The version number of the ICC standard that this profile follows
(e.g. ``2.0``).
:type: :py:class:`float`
.. py:attribute:: icc_version
:type: int
Same as ``version``, but in encoded format (see 7.2.4 of ICC.1:2010).
.. py:attribute:: device_class
:type: str
4-character string identifying the profile class. One of
``scnr``, ``mntr``, ``prtr``, ``link``, ``spac``, ``abst``,
``nmcl`` (see 7.2.5 of ICC.1:2010 for details).
:type: :py:class:`string`
.. py:attribute:: xcolor_space
:type: str
4-character string (padded with whitespace) identifying the color
space, e.g. ``XYZ␣``, ``RGB␣`` or ``CMYK`` (see 7.2.6 of
@ -59,9 +79,8 @@ can be easily displayed in a chromaticity diagram, for example).
interpreted (non-padded) variant of this (but can be empty on
unknown input).
:type: :py:class:`string`
.. py:attribute:: connection_space
:type: str
4-character string (padded with whitespace) identifying the color
space on the B-side of the transform (see 7.2.7 of ICC.1:2010 for
@ -70,42 +89,37 @@ can be easily displayed in a chromaticity diagram, for example).
Note that the deprecated attribute ``pcs`` contains an interpreted
(non-padded) variant of this (but can be empty on unknown input).
:type: :py:class:`string`
.. py:attribute:: header_flags
:type: int
The encoded header flags of the profile (see 7.2.11 of ICC.1:2010
for details).
:type: :py:class:`int`
.. py:attribute:: header_manufacturer
:type: str
4-character string (padded with whitespace) identifying the device
manufacturer, which shall match the signature contained in the
appropriate section of the ICC signature registry found at
www.color.org (see 7.2.12 of ICC.1:2010).
:type: :py:class:`string`
.. py:attribute:: header_model
:type: str
4-character string (padded with whitespace) identifying the device
model, which shall match the signature contained in the
appropriate section of the ICC signature registry found at
www.color.org (see 7.2.13 of ICC.1:2010).
:type: :py:class:`string`
.. py:attribute:: attributes
:type: int
Flags used to identify attributes unique to the particular device
setup for which the profile is applicable (see 7.2.14 of
ICC.1:2010 for details).
:type: :py:class:`int`
.. py:attribute:: rendering_intent
:type: int
The rendering intent to use when combining this profile with
another profile (usually overridden at run-time, but provided here
@ -114,84 +128,82 @@ can be easily displayed in a chromaticity diagram, for example).
One of ``ImageCms.INTENT_ABSOLUTE_COLORIMETRIC``, ``ImageCms.INTENT_PERCEPTUAL``,
``ImageCms.INTENT_RELATIVE_COLORIMETRIC`` and ``ImageCms.INTENT_SATURATION``.
:type: :py:class:`int`
.. py:attribute:: profile_id
:type: bytes
A sequence of 16 bytes identifying the profile (via a specially
constructed MD5 sum), or 16 binary zeroes if the profile ID has
not been calculated (see 7.2.18 of ICC.1:2010).
:type: :py:class:`bytes`
.. py:attribute:: copyright
:type: Optional[str]
The text copyright information for the profile (see 9.2.21 of ICC.1:2010).
:type: :py:class:`unicode` or ``None``
.. py:attribute:: manufacturer
:type: Optional[str]
The (English) display string for the device manufacturer (see
9.2.22 of ICC.1:2010).
:type: :py:class:`unicode` or ``None``
.. py:attribute:: model
:type: Optional[str]
The (English) display string for the device model of the device
for which this profile is created (see 9.2.23 of ICC.1:2010).
:type: :py:class:`unicode` or ``None``
.. py:attribute:: profile_description
:type: Optional[str]
The (English) display string for the profile description (see
9.2.41 of ICC.1:2010).
:type: :py:class:`unicode` or ``None``
.. py:attribute:: target
:type: Optional[str]
The name of the registered characterization data set, or the
measurement data for a characterization target (see 9.2.14 of
ICC.1:2010).
:type: :py:class:`unicode` or ``None``
.. py:attribute:: red_colorant
:type: Optional[tuple[tuple[float]]]
The first column in the matrix used in matrix/TRC transforms (see 9.2.44 of ICC.1:2010).
:type: ``((X, Y, Z), (x, y, Y))`` or ``None``
The value is in the format ``((X, Y, Z), (x, y, Y))``, if available.
.. py:attribute:: green_colorant
:type: Optional[tuple[tuple[float]]]
The second column in the matrix used in matrix/TRC transforms (see 9.2.30 of ICC.1:2010).
:type: ``((X, Y, Z), (x, y, Y))`` or ``None``
The value is in the format ``((X, Y, Z), (x, y, Y))``, if available.
.. py:attribute:: blue_colorant
:type: Optional[tuple[tuple[float]]]
The third column in the matrix used in matrix/TRC transforms (see 9.2.4 of ICC.1:2010).
:type: ``((X, Y, Z), (x, y, Y))`` or ``None``
The value is in the format ``((X, Y, Z), (x, y, Y))``, if available.
.. py:attribute:: luminance
:type: Optional[tuple[tuple[float]]]
The absolute luminance of emissive devices in candelas per square
metre as described by the Y channel (see 9.2.32 of ICC.1:2010).
:type: ``((X, Y, Z), (x, y, Y))`` or ``None``
The value is in the format ``((X, Y, Z), (x, y, Y))``, if available.
.. py:attribute:: chromaticity
:type: Optional[tuple[tuple[float]]]
The data of the phosphor/colorant chromaticity set used (red,
green and blue channels, see 9.2.16 of ICC.1:2010).
:type: ``((x, y, Y), (x, y, Y), (x, y, Y))`` or ``None``
The value is in the format ``((x, y, Y), (x, y, Y), (x, y, Y))``, if available.
.. py:attribute:: chromatic_adaption
:type: tuple[tuple[float]]
The chromatic adaption matrix converts a color measured using the
actual illumination conditions and relative to the actual adopted
@ -199,58 +211,52 @@ can be easily displayed in a chromaticity diagram, for example).
complete adaptation from the actual adopted white chromaticity to
the PCS adopted white chromaticity (see 9.2.15 of ICC.1:2010).
Two matrices are returned, one in (X, Y, Z) space and one in (x, y, Y) space.
:type: 2-tuple of 3-tuple, the first with (X, Y, Z) and the second with (x, y, Y) values
Two 3-tuples of floats are returned in a 2-tuple,
one in (X, Y, Z) space and one in (x, y, Y) space.
.. py:attribute:: colorant_table
:type: list[str]
This tag identifies the colorants used in the profile by a unique
name and set of PCSXYZ or PCSLAB values (see 9.2.19 of
ICC.1:2010).
:type: list of strings
.. py:attribute:: colorant_table_out
:type: list[str]
This tag identifies the colorants used in the profile by a unique
name and set of PCSLAB values (for DeviceLink profiles only, see
9.2.19 of ICC.1:2010).
:type: list of strings
.. py:attribute:: colorimetric_intent
:type: Optional[str]
4-character string (padded with whitespace) identifying the image
state of PCS colorimetry produced using the colorimetric intent
transforms (see 9.2.20 of ICC.1:2010 for details).
:type: :py:class:`string` or ``None``
.. py:attribute:: perceptual_rendering_intent_gamut
:type: Optional[str]
4-character string (padded with whitespace) identifying the (one)
standard reference medium gamut (see 9.2.37 of ICC.1:2010 for
details).
:type: :py:class:`string` or ``None``
.. py:attribute:: saturation_rendering_intent_gamut
:type: Optional[str]
4-character string (padded with whitespace) identifying the (one)
standard reference medium gamut (see 9.2.37 of ICC.1:2010 for
details).
:type: :py:class:`string` or ``None``
.. py:attribute:: technology
:type: Optional[str]
4-character string (padded with whitespace) identifying the device
technology (see 9.2.47 of ICC.1:2010 for details).
:type: :py:class:`string` or ``None``
.. py:attribute:: media_black_point
:type: Optional[tuple[tuple[float]]]
This tag specifies the media black point and is used for
generating absolute colorimetry.
@ -258,57 +264,57 @@ can be easily displayed in a chromaticity diagram, for example).
This tag was available in ICC 3.2, but it is removed from
version 4.
:type: ``((X, Y, Z), (x, y, Y))`` or ``None``
The value is in the format ``((X, Y, Z), (x, y, Y))``, if available.
.. py:attribute:: media_white_point_temperature
:type: Optional[float]
Calculates the white point temperature (see the LCMS documentation
for more information).
:type: :py:class:`float` or ``None``
.. py:attribute:: viewing_condition
:type: Optional[str]
The (English) display string for the viewing conditions (see
9.2.48 of ICC.1:2010).
:type: :py:class:`unicode` or ``None``
.. py:attribute:: screening_description
:type: Optional[str]
The (English) display string for the screening conditions.
This tag was available in ICC 3.2, but it is removed from
version 4.
:type: :py:class:`unicode` or ``None``
.. py:attribute:: red_primary
:type: Optional[tuple[tuple[float]]]
The XYZ-transformed of the RGB primary color red (1, 0, 0).
:type: ``((X, Y, Z), (x, y, Y))`` or ``None``
The value is in the format ``((X, Y, Z), (x, y, Y))``, if available.
.. py:attribute:: green_primary
:type: Optional[tuple[tuple[float]]]
The XYZ-transformed of the RGB primary color green (0, 1, 0).
:type: ``((X, Y, Z), (x, y, Y))`` or ``None``
The value is in the format ``((X, Y, Z), (x, y, Y))``, if available.
.. py:attribute:: blue_primary
:type: Optional[tuple[tuple[float]]]
The XYZ-transformed of the RGB primary color blue (0, 0, 1).
:type: ``((X, Y, Z), (x, y, Y))`` or ``None``
The value is in the format ``((X, Y, Z), (x, y, Y))``, if available.
.. py:attribute:: is_matrix_shaper
:type: bool
True if this profile is implemented as a matrix shaper (see
documentation on LCMS).
:type: :py:class:`bool`
.. py:attribute:: clut
:type: dict[tuple[bool]]
Returns a dictionary of all supported intents and directions for
the CLUT model.
@ -326,9 +332,8 @@ can be easily displayed in a chromaticity diagram, for example).
The elements of the tuple are booleans. If the value is ``True``,
that intent is supported for that direction.
:type: :py:class:`dict` of boolean 3-tuples
.. py:attribute:: intent_supported
:type: dict[tuple[bool]]
Returns a dictionary of all supported intents and directions.
@ -345,53 +350,46 @@ can be easily displayed in a chromaticity diagram, for example).
The elements of the tuple are booleans. If the value is ``True``,
that intent is supported for that direction.
:type: :py:class:`dict` of boolean 3-tuples
.. py:attribute:: color_space
:type: str
Deprecated but retained for backwards compatibility.
Interpreted value of :py:attr:`.xcolor_space`. May be the
empty string if value could not be decoded.
:type: :py:class:`string`
.. py:attribute:: pcs
:type: str
Deprecated but retained for backwards compatibility.
Interpreted value of :py:attr:`.connection_space`. May be
the empty string if value could not be decoded.
:type: :py:class:`string`
.. py:attribute:: product_model
:type: str
Deprecated but retained for backwards compatibility.
ASCII-encoded value of :py:attr:`.model`.
:type: :py:class:`string`
.. py:attribute:: product_manufacturer
:type: str
Deprecated but retained for backwards compatibility.
ASCII-encoded value of :py:attr:`.manufacturer`.
:type: :py:class:`string`
.. py:attribute:: product_copyright
:type: str
Deprecated but retained for backwards compatibility.
ASCII-encoded value of :py:attr:`.copyright`.
:type: :py:class:`string`
.. py:attribute:: product_description
:type: str
Deprecated but retained for backwards compatibility.
ASCII-encoded value of :py:attr:`.profile_description`.
:type: :py:class:`string`
.. py:attribute:: product_desc
:type: str
Deprecated but retained for backwards compatibility.
ASCII-encoded value of :py:attr:`.profile_description`.
@ -401,8 +399,6 @@ can be easily displayed in a chromaticity diagram, for example).
depending on the value of the description, copyright,
manufacturer and model fields).
:type: :py:class:`string`
There is one function defined on the class:
.. py:method:: is_intent_supported(intent, direction)

View File

@ -34,14 +34,21 @@ Example: Parse an image
im.save("copy.jpg")
:py:class:`~PIL.ImageFile.Parser`
---------------------------------
Classes
-------
.. autoclass:: PIL.ImageFile.Parser()
:members:
:py:class:`~PIL.ImageFile.PyDecoder`
------------------------------------
.. autoclass:: PIL.ImageFile.PyDecoder()
:members:
.. autoclass:: PIL.ImageFile.ImageFile()
:member-order: bysource
:members:
:undoc-members:
:show-inheritance:
.. autoclass:: PIL.ImageFile.StubImageFile()
:members:
:show-inheritance:

View File

@ -98,20 +98,24 @@ These functions are applied to each individual pixel.
.. py:currentmodule:: None
.. py:function:: abs(image)
:noindex:
Absolute value.
.. py:function:: convert(image, mode)
:noindex:
Convert image to the given mode. The mode must be given as a string
constant.
.. py:function:: float(image)
:noindex:
Convert image to 32-bit floating point. This is equivalent to
convert(image, “F”).
.. py:function:: int(image)
:noindex:
Convert image to 32-bit integer. This is equivalent to convert(image, “I”).
@ -119,9 +123,11 @@ These functions are applied to each individual pixel.
integers if necessary to get a correct result.
.. py:function:: max(image1, image2)
:noindex:
Maximum value.
.. py:function:: min(image1, image2)
:noindex:
Minimum value.

View File

@ -282,8 +282,8 @@ class _BLPBaseDecoder(ImageFile.PyDecoder):
self.magic = self.fd.read(4)
self._read_blp_header()
self._load()
except struct.error:
raise OSError("Truncated Blp file")
except struct.error as e:
raise OSError("Truncated Blp file") from e
return 0, 0
def _read_palette(self):

View File

@ -304,8 +304,8 @@ def _dib_save(im, fp, filename):
def _save(im, fp, filename, bitmap_header=True):
try:
rawmode, bits, colors = SAVE[im.mode]
except KeyError:
raise OSError("cannot write mode %s as BMP" % im.mode)
except KeyError as e:
raise OSError("cannot write mode %s as BMP" % im.mode) from e
info = im.encoderinfo

View File

@ -231,8 +231,8 @@ class EpsImageFile(ImageFile.ImageFile):
try:
m = split.match(s)
except re.error:
raise SyntaxError("not an EPS file")
except re.error as e:
raise SyntaxError("not an EPS file") from e
if m:
k, v = m.group(1, 2)

View File

@ -59,8 +59,8 @@ class FpxImageFile(ImageFile.ImageFile):
try:
self.ole = olefile.OleFileIO(self.fp)
except OSError:
raise SyntaxError("not an FPX file; invalid OLE file")
except OSError as e:
raise SyntaxError("not an FPX file; invalid OLE file") from e
if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B":
raise SyntaxError("not an FPX file; bad root CLSID")

View File

@ -85,5 +85,5 @@ def open(fp, mode="r"):
try:
return GdImageFile(fp)
except SyntaxError:
raise UnidentifiedImageError("cannot identify this image file")
except SyntaxError as e:
raise UnidentifiedImageError("cannot identify this image file") from e

View File

@ -130,9 +130,9 @@ class GifImageFile(ImageFile.ImageFile):
for f in range(self.__frame + 1, frame + 1):
try:
self._seek(f)
except EOFError:
except EOFError as e:
self.seek(last_frame)
raise EOFError("no more images in GIF file")
raise EOFError("no more images in GIF file") from e
def _seek(self, frame):

View File

@ -163,8 +163,8 @@ class ImImageFile(ImageFile.ImageFile):
try:
m = split.match(s)
except re.error:
raise SyntaxError("not an IM file")
except re.error as e:
raise SyntaxError("not an IM file") from e
if m:
@ -341,8 +341,8 @@ def _save(im, fp, filename):
try:
image_type, rawmode = SAVE[im.mode]
except KeyError:
raise ValueError("Cannot save %s images as IM" % im.mode)
except KeyError as e:
raise ValueError("Cannot save %s images as IM" % im.mode) from e
frames = im.encoderinfo.get("frames", 1)

View File

@ -434,8 +434,8 @@ def _getdecoder(mode, decoder_name, args, extra=()):
try:
# get decoder
decoder = getattr(core, decoder_name + "_decoder")
except AttributeError:
raise OSError("decoder %s not available" % decoder_name)
except AttributeError as e:
raise OSError("decoder %s not available" % decoder_name) from e
return decoder(mode, *args + extra)
@ -457,8 +457,8 @@ def _getencoder(mode, encoder_name, args, extra=()):
try:
# get encoder
encoder = getattr(core, encoder_name + "_encoder")
except AttributeError:
raise OSError("encoder %s not available" % encoder_name)
except AttributeError as e:
raise OSError("encoder %s not available" % encoder_name) from e
return encoder(mode, *args + extra)
@ -971,10 +971,10 @@ class Image:
if isinstance(t, tuple):
try:
t = trns_im.palette.getcolor(t)
except Exception:
except Exception as e:
raise ValueError(
"Couldn't allocate a palette color for transparency"
)
) from e
trns_im.putpixel((0, 0), t)
if mode in ("L", "RGB"):
@ -1027,8 +1027,8 @@ class Image:
# normalize source image and try again
im = self.im.convert(getmodebase(self.mode))
im = im.convert(mode, dither)
except KeyError:
raise ValueError("illegal conversion")
except KeyError as e:
raise ValueError("illegal conversion") from e
new_im = self._new(im)
if delete_trns:
@ -1625,16 +1625,16 @@ class Image:
mode = getmodebase(self.mode) + "A"
try:
self.im.setmode(mode)
except (AttributeError, ValueError):
except (AttributeError, ValueError) as e:
# do things the hard way
im = self.im.convert(mode)
if im.mode not in ("LA", "PA", "RGBA"):
raise ValueError # sanity check
raise ValueError from e # sanity check
self.im = im
self.pyaccess = None
self.mode = self.im.mode
except (KeyError, ValueError):
raise ValueError("illegal image mode")
except (KeyError, ValueError) as e:
raise ValueError("illegal image mode") from e
if self.mode in ("LA", "PA"):
band = 1
@ -2136,8 +2136,8 @@ class Image:
init()
try:
format = EXTENSION[ext]
except KeyError:
raise ValueError("unknown file extension: {}".format(ext))
except KeyError as e:
raise ValueError("unknown file extension: {}".format(ext)) from e
if format.upper() not in SAVE:
init()
@ -2245,8 +2245,8 @@ class Image:
if isinstance(channel, str):
try:
channel = self.getbands().index(channel)
except ValueError:
raise ValueError('The image has no channel "{}"'.format(channel))
except ValueError as e:
raise ValueError('The image has no channel "{}"'.format(channel)) from e
return self._new(self.im.getband(channel))
@ -2743,12 +2743,12 @@ def fromarray(obj, mode=None):
if mode is None:
try:
typekey = (1, 1) + shape[2:], arr["typestr"]
except KeyError:
raise TypeError("Cannot handle this data type")
except KeyError as e:
raise TypeError("Cannot handle this data type") from e
try:
mode, rawmode = _fromarray_typemap[typekey]
except KeyError:
raise TypeError("Cannot handle this data type: %s, %s" % typekey)
except KeyError as e:
raise TypeError("Cannot handle this data type: %s, %s" % typekey) from e
else:
rawmode = mode
if mode in ["1", "L", "I", "P", "F"]:

View File

@ -295,11 +295,12 @@ def profileToProfile(
``inputProfile`` to ``outputProfile``.
If the input or output profiles specified are not valid filenames, a
``PyCMSError`` will be raised. If ``inPlace`` is ``True`` and
``outputMode != im.mode``, a ``PyCMSError`` will be raised. If an error
occurs during application of the profiles, a ``PyCMSError`` will be raised.
:exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and
``outputMode != im.mode``, a :exc:`PyCMSError` will be raised.
If an error occurs during application of the profiles,
a :exc:`PyCMSError` will be raised.
If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS),
a ``PyCMSError`` will be raised.
a :exc:`PyCMSError` will be raised.
This function applies an ICC transformation to im from ``inputProfile``'s
color space to ``outputProfile``'s color space using the specified rendering
@ -369,7 +370,7 @@ def profileToProfile(
else:
imOut = transform.apply(im)
except (OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
return imOut
@ -381,8 +382,8 @@ def getOpenProfile(profileFilename):
The PyCMSProfile object can be passed back into pyCMS for use in creating
transforms and such (as in ImageCms.buildTransformFromOpenProfiles()).
If ``profileFilename`` is not a valid filename for an ICC profile, a ``PyCMSError``
will be raised.
If ``profileFilename`` is not a valid filename for an ICC profile,
a :exc:`PyCMSError` will be raised.
:param profileFilename: String, as a valid filename path to the ICC profile
you wish to open, or a file-like object.
@ -393,7 +394,7 @@ def getOpenProfile(profileFilename):
try:
return ImageCmsProfile(profileFilename)
except (OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def buildTransform(
@ -410,11 +411,11 @@ def buildTransform(
image.
If the input or output profiles specified are not valid filenames, a
``PyCMSError`` will be raised. If an error occurs during creation of the
transform, a ``PyCMSError`` will be raised.
:exc:`PyCMSError` will be raised. If an error occurs during creation
of the transform, a :exc:`PyCMSError` will be raised.
If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile``
(or by pyCMS), a ``PyCMSError`` will be raised.
(or by pyCMS), a :exc:`PyCMSError` will be raised.
This function builds and returns an ICC transform from the ``inputProfile``
to the ``outputProfile`` using the ``renderingIntent`` to determine what to do
@ -474,7 +475,7 @@ def buildTransform(
inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags
)
except (OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def buildProofTransform(
@ -493,13 +494,13 @@ def buildProofTransform(
obtained on the ``proofProfile`` device.
If the input, output, or proof profiles specified are not valid
filenames, a ``PyCMSError`` will be raised.
filenames, a :exc:`PyCMSError` will be raised.
If an error occurs during creation of the transform, a ``PyCMSError``
will be raised.
If an error occurs during creation of the transform,
a :exc:`PyCMSError` will be raised.
If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile``
(or by pyCMS), a ``PyCMSError`` will be raised.
(or by pyCMS), a :exc:`PyCMSError` will be raised.
This function builds and returns an ICC transform from the ``inputProfile``
to the ``outputProfile``, but tries to simulate the result that would be
@ -585,7 +586,7 @@ def buildProofTransform(
flags,
)
except (OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
buildTransformFromOpenProfiles = buildTransform
@ -596,17 +597,17 @@ def applyTransform(im, transform, inPlace=False):
"""
(pyCMS) Applies a transform to a given image.
If ``im.mode != transform.inMode``, a ``PyCMSError`` is raised.
If ``im.mode != transform.inMode``, a :exc:`PyCMSError` is raised.
If ``inPlace`` is ``True`` and ``transform.inMode != transform.outMode``, a
``PyCMSError`` is raised.
:exc:`PyCMSError` is raised.
If ``im.mode``, ``transform.inMode`` or ``transform.outMode`` is not
supported by pyCMSdll or the profiles you used for the transform, a
``PyCMSError`` is raised.
:exc:`PyCMSError` is raised.
If an error occurs while the transform is being applied, a ``PyCMSError``
is raised.
If an error occurs while the transform is being applied,
a :exc:`PyCMSError` is raised.
This function applies a pre-calculated transform (from
ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles())
@ -640,7 +641,7 @@ def applyTransform(im, transform, inPlace=False):
else:
imOut = transform.apply(im)
except (TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
return imOut
@ -649,12 +650,14 @@ def createProfile(colorSpace, colorTemp=-1):
"""
(pyCMS) Creates a profile.
If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, a ``PyCMSError`` is raised.
If colorSpace not in ``["LAB", "XYZ", "sRGB"]``,
a :exc:`PyCMSError` is raised.
If using LAB and ``colorTemp`` is not a positive integer, a ``PyCMSError`` is
raised.
If using LAB and ``colorTemp`` is not a positive integer,
a :exc:`PyCMSError` is raised.
If an error occurs while creating the profile, a ``PyCMSError`` is raised.
If an error occurs while creating the profile,
a :exc:`PyCMSError` is raised.
Use this function to create common profiles on-the-fly instead of
having to supply a profile on disk and knowing the path to it. It
@ -682,15 +685,15 @@ def createProfile(colorSpace, colorTemp=-1):
if colorSpace == "LAB":
try:
colorTemp = float(colorTemp)
except (TypeError, ValueError):
except (TypeError, ValueError) as e:
raise PyCMSError(
'Color temperature must be numeric, "%s" not valid' % colorTemp
)
) from e
try:
return core.createProfile(colorSpace, colorTemp)
except (TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def getProfileName(profile):
@ -699,8 +702,8 @@ def getProfileName(profile):
(pyCMS) Gets the internal product name for the given profile.
If ``profile`` isn't a valid CmsProfile object or filename to a profile,
a ``PyCMSError`` is raised If an error occurs while trying to obtain the
name tag, a ``PyCMSError`` is raised.
a :exc:`PyCMSError` is raised If an error occurs while trying
to obtain the name tag, a :exc:`PyCMSError` is raised.
Use this function to obtain the INTERNAL name of the profile (stored
in an ICC tag in the profile itself), usually the one used when the
@ -732,7 +735,7 @@ def getProfileName(profile):
return "{} - {}\n".format(model, manufacturer)
except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def getProfileInfo(profile):
@ -740,10 +743,10 @@ def getProfileInfo(profile):
(pyCMS) Gets the internal product information for the given profile.
If ``profile`` isn't a valid CmsProfile object or filename to a profile,
a ``PyCMSError`` is raised.
a :exc:`PyCMSError` is raised.
If an error occurs while trying to obtain the info tag, a ``PyCMSError``
is raised.
If an error occurs while trying to obtain the info tag,
a :exc:`PyCMSError` is raised.
Use this function to obtain the information stored in the profile's
info tag. This often contains details about the profile, and how it
@ -772,7 +775,7 @@ def getProfileInfo(profile):
return "\r\n\r\n".join(arr) + "\r\n\r\n"
except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def getProfileCopyright(profile):
@ -780,10 +783,10 @@ def getProfileCopyright(profile):
(pyCMS) Gets the copyright for the given profile.
If ``profile`` isn't a valid CmsProfile object or filename to a profile, a
``PyCMSError`` is raised.
:exc:`PyCMSError` is raised.
If an error occurs while trying to obtain the copyright tag, a ``PyCMSError``
is raised.
If an error occurs while trying to obtain the copyright tag,
a :exc:`PyCMSError` is raised.
Use this function to obtain the information stored in the profile's
copyright tag.
@ -800,7 +803,7 @@ def getProfileCopyright(profile):
profile = ImageCmsProfile(profile)
return (profile.profile.copyright or "") + "\n"
except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def getProfileManufacturer(profile):
@ -808,10 +811,10 @@ def getProfileManufacturer(profile):
(pyCMS) Gets the manufacturer for the given profile.
If ``profile`` isn't a valid CmsProfile object or filename to a profile, a
``PyCMSError`` is raised.
:exc:`PyCMSError` is raised.
If an error occurs while trying to obtain the manufacturer tag, a
``PyCMSError`` is raised.
:exc:`PyCMSError` is raised.
Use this function to obtain the information stored in the profile's
manufacturer tag.
@ -828,7 +831,7 @@ def getProfileManufacturer(profile):
profile = ImageCmsProfile(profile)
return (profile.profile.manufacturer or "") + "\n"
except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def getProfileModel(profile):
@ -836,10 +839,10 @@ def getProfileModel(profile):
(pyCMS) Gets the model for the given profile.
If ``profile`` isn't a valid CmsProfile object or filename to a profile, a
``PyCMSError`` is raised.
:exc:`PyCMSError` is raised.
If an error occurs while trying to obtain the model tag, a ``PyCMSError``
is raised.
If an error occurs while trying to obtain the model tag,
a :exc:`PyCMSError` is raised.
Use this function to obtain the information stored in the profile's
model tag.
@ -857,7 +860,7 @@ def getProfileModel(profile):
profile = ImageCmsProfile(profile)
return (profile.profile.model or "") + "\n"
except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def getProfileDescription(profile):
@ -865,10 +868,10 @@ def getProfileDescription(profile):
(pyCMS) Gets the description for the given profile.
If ``profile`` isn't a valid CmsProfile object or filename to a profile, a
``PyCMSError`` is raised.
:exc:`PyCMSError` is raised.
If an error occurs while trying to obtain the description tag, a ``PyCMSError``
is raised.
If an error occurs while trying to obtain the description tag,
a :exc:`PyCMSError` is raised.
Use this function to obtain the information stored in the profile's
description tag.
@ -886,7 +889,7 @@ def getProfileDescription(profile):
profile = ImageCmsProfile(profile)
return (profile.profile.profile_description or "") + "\n"
except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def getDefaultIntent(profile):
@ -894,10 +897,10 @@ def getDefaultIntent(profile):
(pyCMS) Gets the default intent name for the given profile.
If ``profile`` isn't a valid CmsProfile object or filename to a profile, a
``PyCMSError`` is raised.
:exc:`PyCMSError` is raised.
If an error occurs while trying to obtain the default intent, a
``PyCMSError`` is raised.
:exc:`PyCMSError` is raised.
Use this function to determine the default (and usually best optimized)
rendering intent for this profile. Most profiles support multiple
@ -925,7 +928,7 @@ def getDefaultIntent(profile):
profile = ImageCmsProfile(profile)
return profile.profile.rendering_intent
except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def isIntentSupported(profile, intent, direction):
@ -940,8 +943,8 @@ def isIntentSupported(profile, intent, direction):
be used for others. Some profiles can only be used for certain
rendering intents, so it's best to either verify this before trying
to create a transform with them (using this function), or catch the
potential ``PyCMSError`` that will occur if they don't support the modes
you select.
potential :exc:`PyCMSError` that will occur if they don't
support the modes you select.
:param profile: EITHER a valid CmsProfile object, OR a string of the
filename of an ICC profile.
@ -976,7 +979,7 @@ def isIntentSupported(profile, intent, direction):
else:
return -1
except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v)
raise PyCMSError(v) from v
def versions():

View File

@ -106,7 +106,7 @@ class Draw:
def chord(self, xy, start, end, *options):
"""
Same as :py:meth:`~PIL.ImageDraw2.ImageDraw.arc`, but connects the end points
Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points
with a straight line.
.. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord`

View File

@ -85,7 +85,7 @@ def _tilesort(t):
class ImageFile(Image.Image):
"Base class for image file format handlers."
"""Base class for image file format handlers."""
def __init__(self, fp=None, filename=None):
super().__init__()
@ -122,7 +122,7 @@ class ImageFile(Image.Image):
EOFError, # got header but not the first frame
struct.error,
) as v:
raise SyntaxError(v)
raise SyntaxError(v) from v
if not self.mode or self.size[0] <= 0:
raise SyntaxError("not identified by this driver")
@ -241,12 +241,12 @@ class ImageFile(Image.Image):
while True:
try:
s = read(self.decodermaxblock)
except (IndexError, struct.error):
except (IndexError, struct.error) as e:
# truncated png/gif
if LOAD_TRUNCATED_IMAGES:
break
else:
raise OSError("image file is truncated")
raise OSError("image file is truncated") from e
if not s: # truncated jpeg
if LOAD_TRUNCATED_IMAGES:
@ -505,7 +505,7 @@ def _save(im, fp, tile, bufsize=0):
try:
fh = fp.fileno()
fp.flush()
except (AttributeError, io.UnsupportedOperation):
except (AttributeError, io.UnsupportedOperation) as e:
# compress to Python file-compatible object
for e, b, o, a in tile:
e = Image._getencoder(im.mode, e, a, im.encoderconfig)
@ -522,7 +522,7 @@ def _save(im, fp, tile, bufsize=0):
if s:
break
if s < 0:
raise OSError("encoder error %d when writing image file" % s)
raise OSError("encoder error %d when writing image file" % s) from e
e.cleanup()
else:
# slight speedup: compress to real file object

View File

@ -411,10 +411,10 @@ class Color3DLUT(MultibandFilter):
def _check_size(size):
try:
_, _, _ = size
except ValueError:
except ValueError as e:
raise ValueError(
"Size should be either an integer or a tuple of three integers."
)
) from e
except TypeError:
size = (size, size, size)
size = [int(x) for x in size]

View File

@ -505,8 +505,8 @@ class FreeTypeFont:
"""
try:
names = self.font.getvarnames()
except AttributeError:
raise NotImplementedError("FreeType 2.9.1 or greater is required")
except AttributeError as e:
raise NotImplementedError("FreeType 2.9.1 or greater is required") from e
return [name.replace(b"\x00", b"") for name in names]
def set_variation_by_name(self, name):
@ -535,8 +535,8 @@ class FreeTypeFont:
"""
try:
axes = self.font.getvaraxes()
except AttributeError:
raise NotImplementedError("FreeType 2.9.1 or greater is required")
except AttributeError as e:
raise NotImplementedError("FreeType 2.9.1 or greater is required") from e
for axis in axes:
axis["name"] = axis["name"].replace(b"\x00", b"")
return axes
@ -548,8 +548,8 @@ class FreeTypeFont:
"""
try:
self.font.setvaraxes(axes)
except AttributeError:
raise NotImplementedError("FreeType 2.9.1 or greater is required")
except AttributeError as e:
raise NotImplementedError("FreeType 2.9.1 or greater is required") from e
class TransposedFont:

View File

@ -57,8 +57,8 @@ class _Operand:
im1.load()
try:
op = getattr(_imagingmath, op + "_" + im1.mode)
except AttributeError:
raise TypeError("bad operand type for '%s'" % op)
except AttributeError as e:
raise TypeError("bad operand type for '%s'" % op) from e
_imagingmath.unop(op, out.im.id, im1.im.id)
else:
# binary operation
@ -85,8 +85,8 @@ class _Operand:
im2.load()
try:
op = getattr(_imagingmath, op + "_" + im1.mode)
except AttributeError:
raise TypeError("bad operand type for '%s'" % op)
except AttributeError as e:
raise TypeError("bad operand type for '%s'" % op) from e
_imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id)
return _Operand(out)

View File

@ -97,13 +97,13 @@ class ImagePalette:
if isinstance(color, tuple):
try:
return self.colors[color]
except KeyError:
except KeyError as e:
# allocate new color slot
if isinstance(self.palette, bytes):
self.palette = bytearray(self.palette)
index = len(self.colors)
if index >= 256:
raise ValueError("cannot allocate more than 256 colors")
raise ValueError("cannot allocate more than 256 colors") from e
self.colors[color] = index
self.palette[index] = color[0]
self.palette[index + 256] = color[1]

View File

@ -38,8 +38,8 @@ class Iterator:
try:
self.im.seek(ix)
return self.im
except EOFError:
raise IndexError # end of sequence
except EOFError as e:
raise IndexError from e # end of sequence
def __iter__(self):
return self
@ -49,8 +49,8 @@ class Iterator:
self.im.seek(self.position)
self.position += 1
return self.im
except EOFError:
raise StopIteration
except EOFError as e:
raise StopIteration from e
def all_frames(im, func=None):

View File

@ -118,8 +118,8 @@ class IptcImageFile(ImageFile.ImageFile):
# compression
try:
compression = COMPRESSION[self.getint((3, 120))]
except KeyError:
raise OSError("Unknown IPTC image compression")
except KeyError as e:
raise OSError("Unknown IPTC image compression") from e
# tile
if tag == (8, 10):

View File

@ -505,13 +505,13 @@ def _getmp(self):
file_contents.seek(info.next)
info.load(file_contents)
mp = dict(info)
except Exception:
raise SyntaxError("malformed MP Index (unreadable directory)")
except Exception as e:
raise SyntaxError("malformed MP Index (unreadable directory)") from e
# 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)")
except KeyError as e:
raise SyntaxError("malformed MP Index (no number of images)") from e
# get MP entries
mpentries = []
try:
@ -547,8 +547,8 @@ def _getmp(self):
mpentry["Attribute"] = mpentryattr
mpentries.append(mpentry)
mp[0xB002] = mpentries
except KeyError:
raise SyntaxError("malformed MP Index (bad MP Entry)")
except KeyError as e:
raise SyntaxError("malformed MP Index (bad MP Entry)") from e
# 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.
@ -612,8 +612,8 @@ def _save(im, fp, filename):
try:
rawmode = RAWMODE[im.mode]
except KeyError:
raise OSError("cannot write mode %s as JPEG" % im.mode)
except KeyError as e:
raise OSError("cannot write mode %s as JPEG" % im.mode) from e
info = im.encoderinfo
@ -665,8 +665,8 @@ def _save(im, fp, filename):
for line in qtables.splitlines()
for num in line.split("#", 1)[0].split()
]
except ValueError:
raise ValueError("Invalid quantization table")
except ValueError as e:
raise ValueError("Invalid quantization table") from e
else:
qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)]
if isinstance(qtables, (tuple, list, dict)):
@ -681,8 +681,8 @@ def _save(im, fp, filename):
if len(table) != 64:
raise TypeError
table = array.array("B", table)
except TypeError:
raise ValueError("Invalid quantization table")
except TypeError as e:
raise ValueError("Invalid quantization table") from e
else:
qtables[idx] = list(table)
return qtables

View File

@ -46,8 +46,8 @@ class MicImageFile(TiffImagePlugin.TiffImageFile):
try:
self.ole = olefile.OleFileIO(self.fp)
except OSError:
raise SyntaxError("not an MIC file; invalid OLE file")
except OSError as e:
raise SyntaxError("not an MIC file; invalid OLE file") from e
# find ACI subfiles with Image members (maybe not the
# best way to identify MIC files, but what the... ;-)
@ -77,8 +77,8 @@ class MicImageFile(TiffImagePlugin.TiffImageFile):
return
try:
filename = self.images[frame]
except IndexError:
raise EOFError("no such frame")
except IndexError as e:
raise EOFError("no such frame") from e
self.fp = self.ole.openstream(filename)

View File

@ -116,8 +116,8 @@ class MspDecoder(ImageFile.PyDecoder):
rowmap = struct.unpack_from(
"<%dH" % (self.state.ysize), self.fd.read(self.state.ysize * 2)
)
except struct.error:
raise OSError("Truncated MSP file in row map")
except struct.error as e:
raise OSError("Truncated MSP file in row map") from e
for x, rowlen in enumerate(rowmap):
try:
@ -142,8 +142,8 @@ class MspDecoder(ImageFile.PyDecoder):
img.write(row[idx : idx + runcount])
idx += runcount
except struct.error:
raise OSError("Corrupted MSP file in row %d" % x)
except struct.error as e:
raise OSError("Corrupted MSP file in row %d" % x) from e
self.set_as_raw(img.getvalue(), ("1", 0, 1))

View File

@ -131,8 +131,8 @@ def _save(im, fp, filename):
try:
version, bits, planes, rawmode = SAVE[im.mode]
except KeyError:
raise ValueError("Cannot save %s images as PCX" % im.mode)
except KeyError as e:
raise ValueError("Cannot save %s images as PCX" % im.mode) from e
# bytes per plane
stride = (im.size[0] * bits + 7) // 8

View File

@ -168,8 +168,10 @@ class ChunkStream:
crc2 = i32(self.fp.read(4))
if crc1 != crc2:
raise SyntaxError("broken PNG file (bad header checksum in %r)" % cid)
except struct.error:
raise SyntaxError("broken PNG file (incomplete checksum in %r)" % cid)
except struct.error as e:
raise SyntaxError(
"broken PNG file (incomplete checksum in %r)" % cid
) from e
def crc_skip(self, cid, data):
"""Read checksum. Used if the C module is not present"""
@ -186,8 +188,8 @@ class ChunkStream:
while True:
try:
cid, pos, length = self.read()
except struct.error:
raise OSError("truncated PNG file")
except struct.error as e:
raise OSError("truncated PNG file") from e
if cid == endchunk:
break
@ -737,9 +739,9 @@ class PngImageFile(ImageFile.ImageFile):
for f in range(self.__frame + 1, frame + 1):
try:
self._seek(f)
except EOFError:
except EOFError as e:
self.seek(last_frame)
raise EOFError("no more images in APNG file")
raise EOFError("no more images in APNG file") from e
def _seek(self, frame, rewind=False):
if frame == 0:
@ -1168,8 +1170,8 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False):
# get the corresponding PNG mode
try:
rawmode, mode = _OUTMODES[mode]
except KeyError:
raise OSError("cannot write mode %s as PNG" % mode)
except KeyError as e:
raise OSError("cannot write mode %s as PNG" % mode) from e
#
# write minimal PNG file

View File

@ -144,8 +144,8 @@ class PsdImageFile(ImageFile.ImageFile):
self.frame = layer
self.fp = self.__fp
return name, bbox
except IndexError:
raise EOFError("no such layer")
except IndexError as e:
raise EOFError("no such layer") from e
def tell(self):
# return layer number (0=image, 1..max=layers)

View File

@ -111,8 +111,8 @@ class SpiderImageFile(ImageFile.ImageFile):
hdrlen = isSpiderHeader(t)
if hdrlen == 0:
raise SyntaxError("not a valid Spider file")
except struct.error:
raise SyntaxError("not a valid Spider file")
except struct.error as e:
raise SyntaxError("not a valid Spider file") from e
h = (99,) + t # add 1 value : spider header index starts at 1
iform = int(h[5])

View File

@ -167,8 +167,8 @@ def _save(im, fp, filename):
try:
rawmode, bits, colormaptype, imagetype = SAVE[im.mode]
except KeyError:
raise OSError("cannot write mode %s as TGA" % im.mode)
except KeyError as e:
raise OSError("cannot write mode %s as TGA" % im.mode) from e
if "rle" in im.encoderinfo:
rle = im.encoderinfo["rle"]

View File

@ -1117,8 +1117,8 @@ class TiffImageFile(ImageFile.ImageFile):
)
try:
decoder.setimage(self.im, extents)
except ValueError:
raise OSError("Couldn't set the image")
except ValueError as e:
raise OSError("Couldn't set the image") from e
close_self_fp = self._exclusive_fp and not self.is_animated
if hasattr(self.fp, "getvalue"):
@ -1231,9 +1231,9 @@ class TiffImageFile(ImageFile.ImageFile):
logger.debug("format key: {}".format(key))
try:
self.mode, rawmode = OPEN_INFO[key]
except KeyError:
except KeyError as e:
logger.debug("- unsupported format")
raise SyntaxError("unknown pixel mode")
raise SyntaxError("unknown pixel mode") from e
logger.debug("- raw mode: {}".format(rawmode))
logger.debug("- pil mode: {}".format(self.mode))
@ -1400,8 +1400,8 @@ def _save(im, fp, filename):
try:
rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode]
except KeyError:
raise OSError("cannot write mode %s as TIFF" % im.mode)
except KeyError as e:
raise OSError("cannot write mode %s as TIFF" % im.mode) from e
ifd = ImageFileDirectory_v2(prefix=prefix)