net.sourceforge.jiu.codecs

Class PCDCodec

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 Summary

private static byte[]
MAGIC
private static int
NO_ROTATION
private static long[]
PCD_FILE_OFFSETS
static int[][]
PCD_RESOLUTIONS
This two-dimensional int array holds all possible pixel resolutions for a PCD file.
static int
PCD_RESOLUTION_1
Base/16, the minimum pixel resolution, 192 x 128 pixels.
static int
PCD_RESOLUTION_2
Base/4, the second pixel resolution, 384 x 256 pixels.
static int
PCD_RESOLUTION_3
Base, the third pixel resolution, 768 x 512 pixels.
static int
PCD_RESOLUTION_4
Base*4, the fourth pixel resolution, 1536 x 1024 pixels.
static int
PCD_RESOLUTION_5
Base*16, the fifth pixel resolution, 3072 x 2048 pixels.
static int
PCD_RESOLUTION_6
Base*64, the sixth pixel resolution, 6144 x 4096 pixels.
static int
PCD_RESOLUTION_DEFAULT
Index for the default resolution , Base (PCD_RESOLUTION_3).
private static int
ROTATE_180
private static int
ROTATE_90_LEFT
private static int
ROTATE_90_RIGHT
private static int
SECTOR_SIZE
private byte[][]
data
private RandomAccessFile
in
private boolean
monochrome
private int
numChannels
private boolean
performColorConversion
private int
resolutionIndex

Fields inherited from class net.sourceforge.jiu.codecs.ImageCodec

boundsAvail, boundsHeight, boundsWidth, boundsX1, boundsX2, boundsY1, boundsY2, comments, din, dout, dpiX, dpiY, image, imageIndex, in, mode, out, raf

Fields inherited from class net.sourceforge.jiu.ops.Operation

abort, progressListeners

Fields inherited from interface net.sourceforge.jiu.color.YCbCrIndex

INDEX_CB, INDEX_CR, INDEX_Y

Constructor Summary

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 Summary

private byte[][]
allocateMemory()
private void
convertToRgb(int width, int height)
private IntegerImage
createImage(int width, int height)
String[]
getFileExtensions()
String
getFormatName()
String[]
getMimeTypes()
boolean
isLoadingSupported()
boolean
isSavingSupported()
private void
load()
Attempts to load an image.
private void
loadUncompressedImage(int resolution)
Loads one of the three lowest resolution images from the file.
void
process()
Checks the parameter and loads an image.
private void
rotateArrays(int rotationAngle, int width, int height)
void
setColorConversion(boolean performColorConversion)
Specify whether color is converted from PCD's YCbCr color space to RGB color space.
void
setFile(String fileName, CodecMode codecMode)
void
setMonochrome(boolean monochrome)
Specifies whether the image is to be loaded as gray or color image.
void
setResolutionIndex(int resolutionIndex)

Methods inherited from class net.sourceforge.jiu.codecs.ImageCodec

appendComment, checkBounds, checkImageResolution, close, getBoundsHeight, getBoundsWidth, getBoundsX1, getBoundsX2, getBoundsY1, getBoundsY2, getComment, getDataInput, getDataOutput, getDpiX, getDpiY, getFileExtensions, getFormatName, getImage, getImageIndex, getInputAsDataInput, getInputStream, getMimeTypes, getMode, getNumComments, getOutputAsDataOutput, getOutputStream, getRandomAccessFile, hasBounds, initModeFromIOObjects, isLoadingSupported, isRowRequired, isSavingSupported, isTileRequired, removeAllComments, removeBounds, setBounds, setBoundsIfNecessary, setDataInput, setDataOutput, setDpi, setFile, setFile, setImage, setImageIndex, setInputStream, setOutputStream, setRandomAccessFile, suggestFileExtension

Methods inherited from class net.sourceforge.jiu.ops.Operation

addProgressListener, addProgressListeners, getAbort, process, removeProgressListener, setAbort, setProgress, setProgress

Field Details

MAGIC

private static final byte[] MAGIC

NO_ROTATION

private static final int NO_ROTATION
Field Value:
0

PCD_FILE_OFFSETS

private static final long[] PCD_FILE_OFFSETS

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_RESOLUTION_1

public static final int PCD_RESOLUTION_1
Base/16, the minimum pixel resolution, 192 x 128 pixels.
Field Value:
0

PCD_RESOLUTION_2

public static final int PCD_RESOLUTION_2
Base/4, the second pixel resolution, 384 x 256 pixels.
Field Value:
1

PCD_RESOLUTION_3

public static final int PCD_RESOLUTION_3
Base, the third pixel resolution, 768 x 512 pixels.
Field Value:
2

PCD_RESOLUTION_4

public static final int PCD_RESOLUTION_4
Base*4, the fourth pixel resolution, 1536 x 1024 pixels. Unsupported
Field Value:
3

PCD_RESOLUTION_5

public static final int PCD_RESOLUTION_5
Base*16, the fifth pixel resolution, 3072 x 2048 pixels. Unsupported
Field Value:
4

PCD_RESOLUTION_6

public static final int PCD_RESOLUTION_6
Base*64, the sixth pixel resolution, 6144 x 4096 pixels. Unsupported
Field Value:
5

PCD_RESOLUTION_DEFAULT

public static final int PCD_RESOLUTION_DEFAULT
Field Value:
2

ROTATE_180

private static final int ROTATE_180
Field Value:
2

ROTATE_90_LEFT

private static final int ROTATE_90_LEFT
Field Value:
1

ROTATE_90_RIGHT

private static final int ROTATE_90_RIGHT
Field Value:
3

SECTOR_SIZE

private static final int SECTOR_SIZE
Field Value:
2048

data

private byte[][] data

in

private RandomAccessFile in

monochrome

private boolean monochrome

numChannels

private int numChannels

performColorConversion

private boolean performColorConversion

resolutionIndex

private int resolutionIndex

Constructor Details

PCDCodec

public PCDCodec()

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()
Overrides:
getFileExtensions in interface ImageCodec

getFormatName

public String getFormatName()
Overrides:
getFormatName in interface ImageCodec

getMimeTypes

public String[] getMimeTypes()
Overrides:
getMimeTypes in interface ImageCodec

isLoadingSupported

public boolean isLoadingSupported()
Overrides:
isLoadingSupported in interface ImageCodec

isSavingSupported

public boolean isSavingSupported()
Overrides:
isSavingSupported in interface ImageCodec

load

private void load()
            throws InvalidFileStructureException,
                   IOException,
                   UnsupportedTypeException,
                   WrongFileFormatException
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:
WrongFileFormatException - if this is not a PCD file

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

process

public void process()
            throws InvalidFileStructureException,
                   MissingParameterException,
                   OperationFailedException,
                   UnsupportedTypeException,
                   WrongFileFormatException
Checks the parameter and loads an image.
Overrides:
process in interface Operation

rotateArrays

private void rotateArrays(int rotationAngle,
                          int width,
                          int height)

setColorConversion

public void setColorConversion(boolean performColorConversion)
Parameters:
performColorConversion - boolean that determines whether color conversion is applied

setFile

public void setFile(String fileName,
                    CodecMode codecMode)
            throws IOException,
                   UnsupportedCodecModeException
Overrides:
setFile in interface ImageCodec

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)