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 Details

    • PCD_RESOLUTION_1

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

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

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

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

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

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

      public static final int PCD_RESOLUTION_DEFAULT
      Index for the default resolution , Base (PCD_RESOLUTION_3).
      See Also:
    • 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
    • NO_ROTATION

      private static final int NO_ROTATION
      See Also:
    • ROTATE_90_LEFT

      private static final int ROTATE_90_LEFT
      See Also:
    • ROTATE_180

      private static final int ROTATE_180
      See Also:
    • ROTATE_90_RIGHT

      private static final int ROTATE_90_RIGHT
      See Also:
    • SECTOR_SIZE

      private static final int SECTOR_SIZE
      See Also:
    • MAGIC

      private static final byte[] MAGIC
    • performColorConversion

      private boolean performColorConversion
    • monochrome

      private boolean monochrome
    • numChannels

      private int numChannels
    • resolutionIndex

      private int resolutionIndex
    • in

      private RandomAccessFile in
    • data

      private byte[][] data
  • Constructor Details

    • 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 Details

    • 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
    • load

      Attempts to load an image. The codec must have been given an input stream, all other parameters (do not convert color to RGB, load monochrome channel only, load other resolution than default) can optionally be chosen by calling the corresponding methods.
      Throws:
      IOException - if there were reading errors
      OutOfMemoryException - if there was not enough free memory available
      InvalidFileStructureException - if the file seems to be a PCD stream but has logical errors in it
      WrongFileFormatException - if this is not a PCD file
      UnsupportedTypeException
    • 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
    • process

      Checks the parameter and loads an image.
      Overrides:
      process in class Operation
      Throws:
      MissingParameterException - if any mandatory parameter was not given to the operation
      WrongParameterException - if at least one of the input parameters was not initialized appropriately (values out of the valid interval, etc.)
      OperationFailedException
      InvalidFileStructureException
      UnsupportedTypeException
      WrongFileFormatException
    • 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)