public class MultiPixelPackedSampleModel extends SampleModel
MultiPixelPackedSampleModel class represents one-banded images and can pack multiple one-sample pixels into one data element. Pixels are not allowed to span data elements. The data type can be DataBuffer.TYPE_BYTE, DataBuffer.TYPE_USHORT, or DataBuffer.TYPE_INT. Each pixel must be a power of 2 number of bits and a power of 2 number of pixels must fit exactly in one data element. Pixel bit stride is equal to the number of bits per pixel. Scanline stride is in data elements and the last several data elements might be padded with unused pixels. Data bit offset is the offset in bits from the beginning of the
DataBuffer to the first pixel and must be a multiple of pixel bit stride.
The following code illustrates extracting the bits for pixel x, y from DataBuffer data and storing the pixel data in data elements of type dataType:
int dataElementSize = DataBuffer.getDataTypeSize(dataType); int bitnum = dataBitOffset + x*pixelBitStride; int element = data.getElem(y*scanlineStride + bitnum/dataElementSize); int shift = dataElementSize - (bitnum & (dataElementSize-1)) - pixelBitStride; int pixel = (element >> shift) & ((1 << pixelBitStride) - 1);
dataType, height, numBands, width| Constructor and Description |
|---|
MultiPixelPackedSampleModel(int dataType, int w, int h, int numberOfBits)
Constructs a
MultiPixelPackedSampleModel with the specified data type, width, height and number of bits per pixel.
|
MultiPixelPackedSampleModel(int dataType, int w, int h, int numberOfBits, int scanlineStride, int dataBitOffset)
Constructs a
MultiPixelPackedSampleModel with specified data type, width, height, number of bits per pixel, scanline stride and data bit offset.
|
| Modifier and Type | Method and Description |
|---|---|
SampleModel |
createCompatibleSampleModel(int w, int h)
Creates a new
MultiPixelPackedSampleModel with the specified width and height.
|
DataBuffer |
createDataBuffer()
Creates a
DataBuffer that corresponds to this
MultiPixelPackedSampleModel.
|
SampleModel |
createSubsetSampleModel(int[] bands)
Creates a new
MultiPixelPackedSampleModel with a subset of the bands of this
MultiPixelPackedSampleModel.
|
boolean |
equals(Object
Indicates whether some other object is "equal to" this one.
|
int |
getBitOffset(int x)
Returns the offset, in bits, into the data element in which it is stored for the
xth pixel of a scanline.
|
int |
getDataBitOffset()
Returns the data bit offset in bits.
|
Object |
getDataElements(int x, int y, Object
Returns data for a single pixel in a primitive array of type TransferType.
|
int |
getNumDataElements()
Returns the number of data elements needed to transfer one pixel via the
getDataElements(int, int, java.lang.Object, java.awt.image.DataBuffer) and
setDataElements(int, int, java.lang.Object, java.awt.image.DataBuffer) methods.
|
int |
getOffset(int x, int y)
Returns the offset of pixel (x, y) in data array elements.
|
int[] |
getPixel(int x, int y, int[] iArray, DataBuffer
Returns the specified single band pixel in the first element of an
int array.
|
int |
getPixelBitStride()
Returns the pixel bit stride in bits.
|
int |
getSample(int x, int y, int b, DataBuffer
Returns as
int the sample in a specified band for the pixel located at (x, y).
|
int[] |
getSampleSize()
Returns the number of bits per sample for all bands.
|
int |
getSampleSize(int band)
Returns the number of bits per sample for the specified band.
|
int |
getScanlineStride()
Returns the scanline stride.
|
int |
getTransferType()
Returns the TransferType used to transfer pixels by way of the
getDataElements and
setDataElements methods.
|
int |
hashCode()
Returns a hash code value for the object.
|
void |
setDataElements(int x, int y, Object
Sets the data for a single pixel in the specified
DataBuffer from a primitive array of type TransferType.
|
void |
setPixel(int x, int y, int[] iArray, DataBuffer
Sets a pixel in the
DataBuffer using an
int array for input.
|
void |
setSample(int x, int y, int b, int s, DataBuffer
Sets a sample in the specified band for the pixel located at (x, y) in the
DataBuffer using an
int for input.
|
getDataElements, getDataType, getHeight, getNumBands, getPixel, getPixel, getPixels, getPixels, getPixels, getSampleDouble, getSampleFloat, getSamples, getSamples, getSamples, getWidth, setDataElements, setPixel, setPixel, setPixels, setPixels, setPixels, setSample, setSample, setSamples, setSamples, setSamplespublic MultiPixelPackedSampleModel(int dataType,
int w,
int h,
int numberOfBits)
MultiPixelPackedSampleModel with the specified data type, width, height and number of bits per pixel.
dataType - the data type for storing samples
w - the width, in pixels, of the region of image data described
h - the height, in pixels, of the region of image data described
numberOfBits - the number of bits per pixel
IllegalArgumentException - if
dataType is not either
DataBuffer.TYPE_BYTE,
DataBuffer.TYPE_USHORT, or
DataBuffer.TYPE_INT
public MultiPixelPackedSampleModel(int dataType,
int w,
int h,
int numberOfBits,
int scanlineStride,
int dataBitOffset)
MultiPixelPackedSampleModel with specified data type, width, height, number of bits per pixel, scanline stride and data bit offset.
dataType - the data type for storing samples
w - the width, in pixels, of the region of image data described
h - the height, in pixels, of the region of image data described
numberOfBits - the number of bits per pixel
scanlineStride - the line stride of the image data
dataBitOffset - the data bit offset for the region of image data described
RasterFormatException - if the number of bits per pixel is not a power of 2 or if a power of 2 number of pixels do not fit in one data element.
IllegalArgumentException - if
w or
h is not greater than 0
IllegalArgumentException - if
dataType is not either
DataBuffer.TYPE_BYTE,
DataBuffer.TYPE_USHORT, or
DataBuffer.TYPE_INT
public SampleModelcreateCompatibleSampleModel(int w, int h)
MultiPixelPackedSampleModel with the specified width and height. The new
MultiPixelPackedSampleModel has the same storage data type and number of bits per pixel as this
MultiPixelPackedSampleModel.
createCompatibleSampleModel in class
SampleModel
w - the specified width
h - the specified height
SampleModel with the specified width and height and with the same storage data type and number of bits per pixel as this
MultiPixelPackedSampleModel.
IllegalArgumentException - if
w or
h is not greater than 0
public DataBuffercreateDataBuffer()
DataBuffer that corresponds to this
MultiPixelPackedSampleModel. The
DataBuffer object's data type and size is consistent with this
MultiPixelPackedSampleModel. The
DataBuffer has a single bank.
createDataBuffer in class
SampleModel
DataBuffer with the same data type and size as this
MultiPixelPackedSampleModel.
public int getNumDataElements()
getDataElements(int, int, java.lang.Object, java.awt.image.DataBuffer) and
setDataElements(int, int, java.lang.Object, java.awt.image.DataBuffer) methods. For a
MultiPixelPackedSampleModel, this is one.
getNumDataElements in class
SampleModel
SampleModel.getDataElements(int, int, Object, DataBuffer) ,
SampleModel.getDataElements(int, int, int, int, Object, DataBuffer) ,
SampleModel.setDataElements(int, int, Object, DataBuffer) ,
SampleModel.setDataElements(int, int, int, int, Object, DataBuffer) ,
SampleModel.getTransferType()
public int[] getSampleSize()
getSampleSize in class
SampleModel
public int getSampleSize(int band)
getSampleSize in class
SampleModel
band - the specified band
public int getOffset(int x,
int y)
x - the X coordinate of the specified pixel
y - the Y coordinate of the specified pixel
public int getBitOffset(int x)
xth pixel of a scanline. This offset is the same for all scanlines.
x - the specified pixel
public int getScanlineStride()
MultiPixelPackedSampleModel.
public int getPixelBitStride()
pixelBitStride of this
MultiPixelPackedSampleModel.
public int getDataBitOffset()
dataBitOffset of this
MultiPixelPackedSampleModel.
public int getTransferType()
getDataElements and
setDataElements methods. The TransferType might or might not be the same as the storage DataType. The TransferType is one of DataBuffer.TYPE_BYTE, DataBuffer.TYPE_USHORT, or DataBuffer.TYPE_INT.
getTransferType in class
SampleModel
SampleModel.getDataElements(int, int, Object, DataBuffer) ,
SampleModel.getDataElements(int, int, int, int, Object, DataBuffer) ,
SampleModel.setDataElements(int, int, Object, DataBuffer) ,
SampleModel.setDataElements(int, int, int, int, Object, DataBuffer) ,
SampleModel.getNumDataElements() ,
DataBuffer
public SampleModelcreateSubsetSampleModel(int[] bands)
MultiPixelPackedSampleModel with a subset of the bands of this
MultiPixelPackedSampleModel. Since a
MultiPixelPackedSampleModel only has one band, the bands argument must have a length of one and indicate the zeroth band.
createSubsetSampleModel in class
SampleModel
bands - the specified bands
SampleModel with a subset of bands of this
MultiPixelPackedSampleModel.
RasterFormatException - if the number of bands requested is not one.
IllegalArgumentException - if
w or
h is not greater than 0
public int getSample(int x,
int y,
int b,
DataBuffer data)
int the sample in a specified band for the pixel located at (x, y). An
ArrayIndexOutOfBoundsException is thrown if the coordinates are not in bounds.
getSample in class
SampleModel
x - the X coordinate of the specified pixel
y - the Y coordinate of the specified pixel
b - the band to return, which is assumed to be 0
data - the
DataBuffer containing the image data
ArrayIndexOutOfBoundsException - if the specified coordinates are not in bounds.
setSample(int, int, int, int, DataBuffer)
public void setSample(int x,
int y,
int b,
int s,
DataBuffer data)
DataBuffer using an
int for input. An
ArrayIndexOutOfBoundsException is thrown if the coordinates are not in bounds.
setSample in class
SampleModel
x - the X coordinate of the specified pixel
y - the Y coordinate of the specified pixel
b - the band to return, which is assumed to be 0
s - the input sample as an
int
data - the
DataBuffer where image data is stored
ArrayIndexOutOfBoundsException - if the coordinates are not in bounds.
getSample(int, int, int, DataBuffer)
public ObjectgetDataElements(int x, int y, Object obj, DataBuffer data)
MultiPixelPackedSampleModel, the array has one element, and the type is the smallest of DataBuffer.TYPE_BYTE, DataBuffer.TYPE_USHORT, or DataBuffer.TYPE_INT that can hold a single pixel. Generally,
obj should be passed in as
null, so that the
Object is created automatically and is the correct primitive data type.
The following code illustrates transferring data for one pixel from DataBuffer db1, whose storage layout is described by MultiPixelPackedSampleModel mppsm1, to DataBuffer db2, whose storage layout is described by MultiPixelPackedSampleModel mppsm2. The transfer is generally more efficient than using getPixel or setPixel.
MultiPixelPackedSampleModel mppsm1, mppsm2;
DataBufferInt db1, db2;
mppsm2.setDataElements(x, y, mppsm1.getDataElements(x, y, null,
db1), db2);
Using
getDataElements or
setDataElements to transfer between two
DataBuffer/SampleModel pairs is legitimate if the
SampleModels have the same number of bands, corresponding bands have the same number of bits per sample, and the TransferTypes are the same.
If obj is not null, it should be a primitive array of type TransferType. Otherwise, a ClassCastException is thrown. An ArrayIndexOutOfBoundsException is thrown if the coordinates are not in bounds, or if obj is not null and is not large enough to hold the pixel data.
getDataElements in class
SampleModel
x - the X coordinate of the specified pixel
y - the Y coordinate of the specified pixel
obj - a primitive array in which to return the pixel data or
null.
data - the
DataBuffer containing the image data.
Object containing data for the specified pixel.
ClassCastException - if
obj is not a primitive array of type TransferType or is not
null
ArrayIndexOutOfBoundsException - if the coordinates are not in bounds, or if
obj is not
null or not large enough to hold the pixel data
setDataElements(int, int, Object, DataBuffer)
public int[] getPixel(int x,
int y,
int[] iArray,
DataBuffer data)
int array.
ArrayIndexOutOfBoundsException is thrown if the coordinates are not in bounds.
getPixel in class
SampleModel
x - the X coordinate of the specified pixel
y - the Y coordinate of the specified pixel
iArray - the array containing the pixel to be returned or
null
data - the
DataBuffer where image data is stored
ArrayIndexOutOfBoundsException - if the coordinates are not in bounds
setPixel(int, int, int[], DataBuffer)
public void setDataElements(int x,
int y,
Object obj,
DataBuffer data)
DataBuffer from a primitive array of type TransferType. For a
MultiPixelPackedSampleModel, only the first element of the array holds valid data, and the type must be the smallest of DataBuffer.TYPE_BYTE, DataBuffer.TYPE_USHORT, or DataBuffer.TYPE_INT that can hold a single pixel.
The following code illustrates transferring data for one pixel from DataBuffer db1, whose storage layout is described by MultiPixelPackedSampleModel mppsm1, to DataBuffer db2, whose storage layout is described by MultiPixelPackedSampleModel mppsm2. The transfer is generally more efficient than using getPixel or setPixel.
MultiPixelPackedSampleModel mppsm1, mppsm2;
DataBufferInt db1, db2;
mppsm2.setDataElements(x, y, mppsm1.getDataElements(x, y, null,
db1), db2);
Using
getDataElements or
setDataElements to transfer between two
DataBuffer/SampleModel pairs is legitimate if the
SampleModel objects have the same number of bands, corresponding bands have the same number of bits per sample, and the TransferTypes are the same.
obj must be a primitive array of type TransferType. Otherwise, a ClassCastException is thrown. An ArrayIndexOutOfBoundsException is thrown if the coordinates are not in bounds, or if obj is not large enough to hold the pixel data.
setDataElements in class
SampleModel
x - the X coordinate of the pixel location
y - the Y coordinate of the pixel location
obj - a primitive array containing pixel data
data - the
DataBuffer containing the image data
getDataElements(int, int, Object, DataBuffer)
public void setPixel(int x,
int y,
int[] iArray,
DataBuffer data)
DataBuffer using an
int array for input.
ArrayIndexOutOfBoundsException is thrown if the coordinates are not in bounds.
setPixel in class
SampleModel
x - the X coordinate of the pixel location
y - the Y coordinate of the pixel location
iArray - the input pixel in an
int array
data - the
DataBuffer containing the image data
getPixel(int, int, int[], DataBuffer)
public boolean equals(Objecto)
Object
The equals method implements an equivalence relation on non-null object references:
x, x.equals(x) should return true. x and y, x.equals(y) should return true if and only if y.equals(x) returns true. x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true. x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified. x, x.equals(null) should return false. The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
equals in class
Object
o - the reference object with which to compare.
true if this object is the same as the obj argument;
false otherwise.
Object.hashCode() ,
HashMap
public int hashCode()
Object
HashMap.
The general contract of hashCode is:
hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application. equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result. Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables. As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java™ programming language.)
hashCode in class
Object
Object.equals(java.lang.Object) ,
System.identityHashCode(java.lang.Object)