Skip to content
Back to top

# Source code for PIL.PcdImagePlugin

    #
    # The Python Imaging Library.
    # $Id$
    #
    # PCD file handling
    #
    # History:
    #       96-05-10 fl     Created
    #       96-05-27 fl     Added draft mode (128x192, 256x384)
    #
    # Copyright (c) Secret Labs AB 1997.
    # Copyright (c) Fredrik Lundh 1996.
    #
    # See the README file for information on usage and redistribution.
    #
    from __future__ import annotations

    from . import Image, ImageFile

    ##
    # Image plugin for PhotoCD images.  This plugin only reads the 768x512
    # image from the file; higher resolutions are encoded in a proprietary
    # encoding.

    class PcdImageFile(ImageFile.ImageFile):
        format = "PCD"
        format_description = "Kodak PhotoCD"

        def _open(self) -> None:
            # rough
            assert self.fp is not None

            self.fp.seek(2048)
            s = self.fp.read(1539)

            if not s.startswith(b"PCD_"):
                msg = "not a PCD file"
                raise SyntaxError(msg)

            orientation = s[1538] & 3
            self.tile_post_rotate = None
            if orientation == 1:
                self.tile_post_rotate = 90
            elif orientation == 3:
                self.tile_post_rotate = 270

            self._mode = "RGB"
            self._size = (512, 768) if orientation in (1, 3) else (768, 512)
            self.tile = [ImageFile._Tile("pcd", (0, 0, 768, 512), 96 * 2048)]

        def load_prepare(self) -> None:
            if self._im is None and self.tile_post_rotate:
                self.im = Image.core.new(self.mode, (768, 512))
            ImageFile.ImageFile.load_prepare(self)

        def load_end(self) -> None:
            if self.tile_post_rotate:
                # Handle rotated PCDs
                self.im = self.rotate(self.tile_post_rotate, expand=True).im

    #
    # registry

    Image.register_open(PcdImageFile.format, PcdImageFile)

    Image.register_extension(PcdImageFile.format, ".pcd")