Class PCDCodec

  • All Implemented Interfaces:
    YCbCrIndex

    public class PCDCodec
    extends ImageCodec
    implements YCbCrIndex
    A codec to read Kodak Photo-CD (image pac) image files. Typical file extension is .pcd. PCD is designed to store the same image in several resolutions. Not all resolutions are always present in a file. Typically, the first five resolutions are available and the file size is between four and six megabytes. Lossless compression (Huffman encoding) is used to store the higher resolution images. All images are in 24 bit YCbCr colorspace, with a component subsampling of 4:1:1 (Y:Cb:Cr) in both horizontal and vertical direction.

    Limitations

    Only the lowest three resolutions are supported by this codec.

    Sample PCD files

    You can download sample PCD image files from Kodak's website.
    Author:
    Marco Schmidt
    • Field Detail

      • PCD_RESOLUTION_1

        public static final int PCD_RESOLUTION_1
        Base/16, the minimum pixel resolution, 192 x 128 pixels.
        See Also:
        Constant Field Values
      • PCD_RESOLUTION_2

        public static final int PCD_RESOLUTION_2
        Base/4, the second pixel resolution, 384 x 256 pixels.
        See Also:
        Constant Field Values
      • PCD_RESOLUTION_3

        public static final int PCD_RESOLUTION_3
        Base, the third pixel resolution, 768 x 512 pixels.
        See Also:
        Constant Field Values
      • PCD_RESOLUTION_4

        public static final int PCD_RESOLUTION_4
        Base*4, the fourth pixel resolution, 1536 x 1024 pixels. Unsupported
        See Also:
        Constant Field Values
      • PCD_RESOLUTION_5

        public static final int PCD_RESOLUTION_5
        Base*16, the fifth pixel resolution, 3072 x 2048 pixels. Unsupported
        See Also:
        Constant Field Values
      • PCD_RESOLUTION_6

        public static final int PCD_RESOLUTION_6
        Base*64, the sixth pixel resolution, 6144 x 4096 pixels. Unsupported
        See Also:
        Constant Field Values
      • PCD_RESOLUTIONS

        public static final int[][] PCD_RESOLUTIONS
        This two-dimensional int array holds all possible pixel resolutions for a PCD file. Use one of the PCD resolution constants (e.g. PCD_RESOLUTION_3 as first index. The second index must be 0 or 1 and leads to either width or height. Example: PCD_RESOLUTION[PCD_RESOLUTION_3][1] will evalute as 512, which can be width or height, depending on the image being in landscape or portrait mode. You may want to use these resolution values in your program to prompt the user which resolution to load from the file.
      • PCD_FILE_OFFSETS

        private static final long[] PCD_FILE_OFFSETS
      • MAGIC

        private static final byte[] MAGIC
      • performColorConversion

        private boolean performColorConversion
      • monochrome

        private boolean monochrome
      • numChannels

        private int numChannels
      • resolutionIndex

        private int resolutionIndex
      • data

        private byte[][] data
    • Constructor Detail

      • PCDCodec

        public PCDCodec()
        This constructor chooses the default settings for PCD image loading:
        • load color image (all channels, not only luminance)
        • perform color conversion from PCD's native YCbCr color space to RGB
        • load the image in the default resolution PCD_RESOLUTION_DEFAULT, 768 x 512 pixels (or vice versa)
    • Method Detail

      • allocateMemory

        private byte[][] allocateMemory()
      • convertToRgb

        private void convertToRgb​(int width,
                                  int height)
      • createImage

        private IntegerImage createImage​(int width,
                                         int height)
      • getFileExtensions

        public String[] getFileExtensions()
        Description copied from class: ImageCodec
        Returns all file extensions that are typical for this file format. The default implementation in ImageCodec returns null. The file extension strings should include a leading dot and are supposed to be lower case (if that is allowed for the given file format). Example: {".jpg", ".jpeg"} for the JPEG file format.
        Overrides:
        getFileExtensions in class ImageCodec
        Returns:
        String array with typical file extensions
      • getFormatName

        public String getFormatName()
        Description copied from class: ImageCodec
        Returns the name of the file format supported by this codec. All classes extending ImageCodec must override this method. When overriding, leave out any words in a particular language so that this format name can be understood by everyone. Usually it is enough to return the format creator plus a typical abbreviation, e.g. Microsoft BMP or Portable Anymap (PNM).
        Specified by:
        getFormatName in class ImageCodec
        Returns:
        name of the file format supported by this codec
      • getMimeTypes

        public String[] getMimeTypes()
        Description copied from class: ImageCodec
        Return the MIME (Multipurpose Internet Mail Extensions) type strings for this format, or null if none are available.
        Specified by:
        getMimeTypes in class ImageCodec
        Returns:
        MIME type strings or null
      • isLoadingSupported

        public boolean isLoadingSupported()
        Description copied from class: ImageCodec
        Returns if this codec is able to load images in the file format supported by this codec. If true is returned this does not necessarily mean that all files in this format can be read, but at least some.
        Specified by:
        isLoadingSupported in class ImageCodec
        Returns:
        if loading is supported
      • isSavingSupported

        public boolean isSavingSupported()
        Description copied from class: ImageCodec
        Returns if this codec is able to save images in the file format supported by this codec. If true is returned this does not necessarily mean that all types files in this format can be written, but at least some.
        Specified by:
        isSavingSupported in class ImageCodec
        Returns:
        if saving is supported
      • loadUncompressedImage

        private void loadUncompressedImage​(int resolution)
                                    throws IllegalArgumentException,
                                           IOException
        Loads one of the three lowest resolution images from the file. First skips as many bytes as there are between the current stream offset and the offset of the image in the PCD file (first three images are at fixed positions). Then reads the pixels from in to data.

        Note that there are width times height samples for Y, but only one fourth that many samples for each Cb and Cr (because of the 4:1:1 subsampling of the two chroma components).

        Parameters:
        resolution - one of PCD_RESOLUTION_1, PCD_RESOLUTION_2 or PCD_RESOLUTION_3
        Throws:
        an - IOException if there were any reading errors
        IllegalArgumentException
        IOException
      • rotateArrays

        private void rotateArrays​(int rotationAngle,
                                  int width,
                                  int height)
      • setColorConversion

        public void setColorConversion​(boolean performColorConversion)
        Specify whether color is converted from PCD's YCbCr color space to RGB color space. The default is true, and you should only change this if you really know what you are doing. If you simply want the luminance (gray) channel, use setMonochrome(boolean) with true as parameter.
        Parameters:
        performColorConversion - boolean that determines whether color conversion is applied
      • setFile

        public void setFile​(String fileName,
                            CodecMode codecMode)
                     throws IOException,
                            UnsupportedCodecModeException
        Description copied from class: ImageCodec
        Gives a file name and codec mode to the codec which will then try to create the corresponding I/O object. The default implementation in ImageCodec creates a DataInputStream object wrapped around a BufferedInputStream wrapped around a FileInputStream for CodecMode.LOAD. Similar for CodecMode.SAVE: a DataOutputStream around a BufferedOutputStream object around a FileOutputStream object. Codecs that need different I/O objects must override this method (some codecs may need random access and thus require a RandomAccessFile object).
        Overrides:
        setFile in class ImageCodec
        Parameters:
        fileName - name of the file to be used for loading or saving
        codecMode - defines whether file is to be used for loading or saving
        Throws:
        IOException
        UnsupportedCodecModeException
      • setMonochrome

        public void setMonochrome​(boolean monochrome)
        Specifies whether the image is to be loaded as gray or color image. If argument is true, only the gray channel is loaded.
      • setResolutionIndex

        public void setResolutionIndex​(int resolutionIndex)