jj2000.j2k.image.output
Class ImgWriterPGX

java.lang.Object
  |
  +--jj2000.j2k.image.output.ImgWriter
        |
        +--jj2000.j2k.image.output.ImgWriterPGX

public class ImgWriterPGX
extends ImgWriter

This class extends the ImgWriter abstract class for writing PGX files. PGX is a custom monochrome file format invented specifically to simplify the use of VM3A with images of different bit-depths in the range 1 to 31 bits per pixel.

The file consists of a one line text header followed by the data.

Header: "PG"+ ws +<endianess>+ ws +[sign]+ws + <bit-depth>+" "+<width>+" "+<height>+'\n'

where:

Data: The image binary values appear one after the other (in raster order) immediately after the last header character ('\n') and are byte-aligned (they are packed into 1,2 or 4 bytes per sample, depending upon the bit-depth value).

If the data is unsigned, level shifting is applied adding 2^(bit depth - 1)

NOTE: This class is not thread safe, for reasons of internal buffering.

See Also:
ImgWriter, BlkImgDataSrc

Field Summary
private  int bitDepth
          The bit-depth of the input file (must be between 1 and 31)
private  byte[] buf
          The line buffer.
private  int c
          The index of the component from where to get the data
private  DataBlkInt db
          A DataBlk, just used to avoid allocating a new one each time it is needed
private  int fb
          The number of fractional bits in the source data
(package private)  boolean isSigned
          Whether the data must be signed when writing or not.
(package private)  int levShift
          Used with level-shiting
(package private)  int maxVal
          Used during saturation (2^bitdepth-1 if unsigned, 2^(bitdepth-1)-1 if signed)
(package private)  int minVal
          Used during saturation (0 if unsigned, -2^(bitdepth-1) if signed)
private  int offset
          The offset of the raw pixel data in the PGX file
private  java.io.RandomAccessFile out
          Where to write the data
private  int packBytes
          The pack length of one sample (in bytes, according to the output bit-depth
 
Fields inherited from class jj2000.j2k.image.output.ImgWriter
DEF_STRIP_HEIGHT, h, src, w
 
Constructor Summary
ImgWriterPGX(java.io.File out, BlkImgDataSrc imgSrc, int c, boolean isSigned)
          Creates a new writer to the specified File object, to write data from the specified component.
ImgWriterPGX(java.lang.String fname, BlkImgDataSrc imgSrc, int c, boolean isSigned)
          Creates a new writer to the specified file, to write data from the specified component.
 
Method Summary
 void close()
          Closes the underlying file or netwrok connection to where the data is written.
 void flush()
          Writes all buffered data to the file or resource.
 java.lang.String toString()
          Returns a string of information about the object, more than 1 line long.
 void write()
          Writes the source's current tile to the output.
 void write(int ulx, int uly, int w, int h)
          Writes the data of the specified area to the file, coordinates are relative to the current tile of the source.
 
Methods inherited from class jj2000.j2k.image.output.ImgWriter
finalize, writeAll
 
Methods inherited from class java.lang.Object
clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

maxVal

int maxVal
Used during saturation (2^bitdepth-1 if unsigned, 2^(bitdepth-1)-1 if signed)


minVal

int minVal
Used during saturation (0 if unsigned, -2^(bitdepth-1) if signed)


levShift

int levShift
Used with level-shiting


isSigned

boolean isSigned
Whether the data must be signed when writing or not. In the latter case inverse level shifting must be applied


bitDepth

private int bitDepth
The bit-depth of the input file (must be between 1 and 31)


out

private java.io.RandomAccessFile out
Where to write the data


offset

private int offset
The offset of the raw pixel data in the PGX file


db

private DataBlkInt db
A DataBlk, just used to avoid allocating a new one each time it is needed


fb

private int fb
The number of fractional bits in the source data


c

private int c
The index of the component from where to get the data


packBytes

private int packBytes
The pack length of one sample (in bytes, according to the output bit-depth


buf

private byte[] buf
The line buffer.

Constructor Detail

ImgWriterPGX

public ImgWriterPGX(java.io.File out,
                    BlkImgDataSrc imgSrc,
                    int c,
                    boolean isSigned)
             throws java.io.IOException
Creates a new writer to the specified File object, to write data from the specified component.

The size of the image that is written to the file is the size of the component from which to get the data, specified by b, not the size of the source image (they differ if there is some sub-sampling).

All the header informations are given by the BlkImgDataSrc source (component width, component height, bit-depth) and sign flag, which are provided to the constructor. The endianness is always big-endian (MSB first).

Parameters:
out - The file where to write the data
imgSrc - The source from where to get the image data to write.
c - The index of the component from where to get the data.
isSigned - Whether the datas are signed or not (needed only when writing header).
See Also:
DataBlk

ImgWriterPGX

public ImgWriterPGX(java.lang.String fname,
                    BlkImgDataSrc imgSrc,
                    int c,
                    boolean isSigned)
             throws java.io.IOException
Creates a new writer to the specified file, to write data from the specified component.

The size of the image that is written to the file is the size of the component from which to get the data, specified by b, not the size of the source image (they differ if there is some sub-sampling).

All header information is given by the BlkImgDataSrc source (component width, component height, bit-depth) and sign flag, which are provided to the constructor. The endianness is always big-endian (MSB first).

Parameters:
fname - The name of the file where to write the data
imgSrc - The source from where to get the image data to write.
c - The index of the component from where to get the data.
isSigned - Whether the datas are signed or not (needed only when writing header).
See Also:
DataBlk
Method Detail

close

public void close()
           throws java.io.IOException
Closes the underlying file or netwrok connection to where the data is written. Any call to other methods of the class become illegal after a call to this one.

Specified by:
close in class ImgWriter
Throws:
java.io.IOException - If an I/O error occurs.

flush

public void flush()
           throws java.io.IOException
Writes all buffered data to the file or resource.

Specified by:
flush in class ImgWriter
Throws:
java.io.IOException - If an I/O error occurs.

write

public void write(int ulx,
                  int uly,
                  int w,
                  int h)
           throws java.io.IOException
Writes the data of the specified area to the file, coordinates are relative to the current tile of the source. Before writing, the coefficients are limited to the nominal range and packed into 1,2 or 4 bytes (according to the bit-depth).

If the data is unisigned, level shifting is applied adding 2^(bit depth - 1)

This method may not be called concurrently from different threads.

If the data returned from the BlkImgDataSrc source is progressive, then it is requested over and over until it is not progressive anymore.

Specified by:
write in class ImgWriter
Parameters:
ulx - The horizontal coordinate of the upper-left corner of the area to write, relative to the current tile.
uly - The vertical coordinate of the upper-left corner of the area to write, relative to the current tile.
Throws:
java.io.IOException - If an I/O error occurs.

write

public void write()
           throws java.io.IOException
Writes the source's current tile to the output. The requests of data issued to the source BlkImgDataSrc object are done by strips, in order to reduce memory usage.

If the data returned from the BlkImgDataSrc source is progressive, then it is requested over and over until it is not progressive anymore.

Specified by:
write in class ImgWriter
Throws:
java.io.IOException - If an I/O error occurs.
See Also:
DataBlk

toString

public java.lang.String toString()
Returns a string of information about the object, more than 1 line long. The information string includes information from the underlying RandomAccessFile (its toString() method is called in turn).

Overrides:
toString in class java.lang.Object
Returns:
A string of information about the object.