com.drew.imaging.jpeg
Class JpegSegmentReader

java.lang.Object
  extended by com.drew.imaging.jpeg.JpegSegmentReader

public class JpegSegmentReader
extends Object

Performs read functions of Jpeg files, returning specific file segments. TODO add a findAvailableSegments() method TODO add more segment identifiers TODO add a getSegmentDescription() method, returning for example 'App1 application data segment, commonly containing Exif data'

Author:
Drew Noakes http://drewnoakes.com

Field Summary
private  byte[] _data
          Jpeg data as byte array
private  File _file
          Jpeg file
private  JpegSegmentData _segmentData
           
private  InputStream _stream
          Jpeg data as an InputStream
private static byte MARKER_EOI
          Private, because one wouldn't search for it.
static byte SEGMENT_APP0
          APP0 Jpeg segment identifier -- Jfif data.
static byte SEGMENT_APP1
          APP1 Jpeg segment identifier -- where Exif data is kept.
static byte SEGMENT_APP2
          APP2 Jpeg segment identifier.
static byte SEGMENT_APP3
          APP3 Jpeg segment identifier.
static byte SEGMENT_APP4
          APP4 Jpeg segment identifier.
static byte SEGMENT_APP5
          APP5 Jpeg segment identifier.
static byte SEGMENT_APP6
          APP6 Jpeg segment identifier.
static byte SEGMENT_APP7
          APP7 Jpeg segment identifier.
static byte SEGMENT_APP8
          APP8 Jpeg segment identifier.
static byte SEGMENT_APP9
          APP9 Jpeg segment identifier.
static byte SEGMENT_APPA
          APPA Jpeg segment identifier -- can hold Unicode comments.
static byte SEGMENT_APPB
          APPB Jpeg segment identifier.
static byte SEGMENT_APPC
          APPC Jpeg segment identifier.
static byte SEGMENT_APPD
          APPD Jpeg segment identifier -- IPTC data in here.
static byte SEGMENT_APPE
          APPE Jpeg segment identifier.
static byte SEGMENT_APPF
          APPF Jpeg segment identifier.
static byte SEGMENT_COM
          Jpeg comment segment identifier.
static byte SEGMENT_DHT
          Define Huffman Table segment identifier.
static byte SEGMENT_DQT
          Define Quantization Table segment identifier.
static byte SEGMENT_SOF0
          Start-of-Frame Zero segment identifier.
static byte SEGMENT_SOI
          Start Of Image segment identifier.
private static byte SEGMENT_SOS
          Private, because this segment crashes my algorithm, and searching for it doesn't work (yet).
 
Constructor Summary
JpegSegmentReader(byte[] fileContents)
          Creates a JpegSegmentReader for a byte array.
JpegSegmentReader(File file)
          Creates a JpegSegmentReader for a specific file.
JpegSegmentReader(InputStream in)
          Creates a JpegSegmentReader for an InputStream.
JpegSegmentReader(JpegSegmentData segmentData)
          Creates a JpegSegmentReader for a JpegSegmentData.
 
Method Summary
private  BufferedInputStream getJpegInputStream()
          Private helper method to create a BufferedInputStream of Jpeg data from whichever data source was specified upon construction of this instance.
 int getSegmentCount(byte segmentMarker)
          Returns the number of segments having the specified JPEG segment marker.
 JpegSegmentData getSegmentData()
          Returns the JpegSegmentData object used by this reader.
private  boolean isValidJpegHeaderBytes(InputStream fileStream)
          Helper method that validates the Jpeg file's magic number.
 byte[] readSegment(byte segmentMarker)
          Reads the first instance of a given Jpeg segment, returning the contents as a byte array.
 byte[] readSegment(byte segmentMarker, int occurrence)
          Reads the first instance of a given Jpeg segment, returning the contents as a byte array.
private  void readSegments()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_file

private final File _file
Jpeg file


_data

private final byte[] _data
Jpeg data as byte array


_stream

private final InputStream _stream
Jpeg data as an InputStream


_segmentData

private JpegSegmentData _segmentData

SEGMENT_SOS

private static final byte SEGMENT_SOS
Private, because this segment crashes my algorithm, and searching for it doesn't work (yet).

See Also:
Constant Field Values

MARKER_EOI

private static final byte MARKER_EOI
Private, because one wouldn't search for it.

See Also:
Constant Field Values

SEGMENT_APP0

public static final byte SEGMENT_APP0
APP0 Jpeg segment identifier -- Jfif data.

See Also:
Constant Field Values

SEGMENT_APP1

public static final byte SEGMENT_APP1
APP1 Jpeg segment identifier -- where Exif data is kept.

See Also:
Constant Field Values

SEGMENT_APP2

public static final byte SEGMENT_APP2
APP2 Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APP3

public static final byte SEGMENT_APP3
APP3 Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APP4

public static final byte SEGMENT_APP4
APP4 Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APP5

public static final byte SEGMENT_APP5
APP5 Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APP6

public static final byte SEGMENT_APP6
APP6 Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APP7

public static final byte SEGMENT_APP7
APP7 Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APP8

public static final byte SEGMENT_APP8
APP8 Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APP9

public static final byte SEGMENT_APP9
APP9 Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APPA

public static final byte SEGMENT_APPA
APPA Jpeg segment identifier -- can hold Unicode comments.

See Also:
Constant Field Values

SEGMENT_APPB

public static final byte SEGMENT_APPB
APPB Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APPC

public static final byte SEGMENT_APPC
APPC Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APPD

public static final byte SEGMENT_APPD
APPD Jpeg segment identifier -- IPTC data in here.

See Also:
Constant Field Values

SEGMENT_APPE

public static final byte SEGMENT_APPE
APPE Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_APPF

public static final byte SEGMENT_APPF
APPF Jpeg segment identifier.

See Also:
Constant Field Values

SEGMENT_SOI

public static final byte SEGMENT_SOI
Start Of Image segment identifier.

See Also:
Constant Field Values

SEGMENT_DQT

public static final byte SEGMENT_DQT
Define Quantization Table segment identifier.

See Also:
Constant Field Values

SEGMENT_DHT

public static final byte SEGMENT_DHT
Define Huffman Table segment identifier.

See Also:
Constant Field Values

SEGMENT_SOF0

public static final byte SEGMENT_SOF0
Start-of-Frame Zero segment identifier.

See Also:
Constant Field Values

SEGMENT_COM

public static final byte SEGMENT_COM
Jpeg comment segment identifier.

See Also:
Constant Field Values
Constructor Detail

JpegSegmentReader

public JpegSegmentReader(File file)
                  throws JpegProcessingException
Creates a JpegSegmentReader for a specific file.

Parameters:
file - the Jpeg file to read segments from
Throws:
JpegProcessingException

JpegSegmentReader

public JpegSegmentReader(byte[] fileContents)
                  throws JpegProcessingException
Creates a JpegSegmentReader for a byte array.

Parameters:
fileContents - the byte array containing Jpeg data
Throws:
JpegProcessingException

JpegSegmentReader

public JpegSegmentReader(InputStream in)
                  throws JpegProcessingException
Creates a JpegSegmentReader for an InputStream.

Parameters:
in - the InputStream containing Jpeg data
Throws:
JpegProcessingException

JpegSegmentReader

public JpegSegmentReader(JpegSegmentData segmentData)
Creates a JpegSegmentReader for a JpegSegmentData.

Parameters:
segmentData - an object containing prepared JPEG segment data.
Method Detail

readSegment

public byte[] readSegment(byte segmentMarker)
                   throws JpegProcessingException
Reads the first instance of a given Jpeg segment, returning the contents as a byte array.

Parameters:
segmentMarker - the byte identifier for the desired segment
Returns:
the byte array if found, else null
Throws:
JpegProcessingException - for any problems processing the Jpeg data, including inner IOExceptions

readSegment

public byte[] readSegment(byte segmentMarker,
                          int occurrence)
Reads the first instance of a given Jpeg segment, returning the contents as a byte array.

Parameters:
segmentMarker - the byte identifier for the desired segment
occurrence - the occurrence of the specified segment within the jpeg file
Returns:
the byte array if found, else null

getSegmentCount

public final int getSegmentCount(byte segmentMarker)
Returns the number of segments having the specified JPEG segment marker.

Parameters:
segmentMarker - the JPEG segment identifying marker.
Returns:
the count of matching segments.

getSegmentData

public final JpegSegmentData getSegmentData()
Returns the JpegSegmentData object used by this reader.

Returns:
the JpegSegmentData object.

readSegments

private void readSegments()
                   throws JpegProcessingException
Throws:
JpegProcessingException

getJpegInputStream

private BufferedInputStream getJpegInputStream()
                                        throws JpegProcessingException
Private helper method to create a BufferedInputStream of Jpeg data from whichever data source was specified upon construction of this instance.

Returns:
a a BufferedInputStream of Jpeg data
Throws:
JpegProcessingException - for any problems obtaining the stream

isValidJpegHeaderBytes

private boolean isValidJpegHeaderBytes(InputStream fileStream)
                                throws IOException
Helper method that validates the Jpeg file's magic number.

Parameters:
fileStream - the InputStream to read bytes from, which must be positioned at its start (i.e. no bytes read yet)
Returns:
true if the magic number is Jpeg (0xFFD8)
Throws:
IOException - for any problem in reading the file