java.lang.Object
java.awt.image.SampleModel
java.awt.image.MultiPixelPackedSampleModel
MultiPixelPackedSampleModel
类表示单波段图像,并且可以将多个单样本像素打包到一个数据元素中。像素不允许跨越数据元素。数据类型可以是DataBuffer.TYPE_BYTE、DataBuffer.TYPE_USHORT或DataBuffer.TYPE_INT。每个像素必须是2的幂次方位数的位,并且2的幂次方位数的像素必须恰好适合一个数据元素。像素位跨度等于每像素的位数。扫描线跨度以数据元素为单位,最后几个数据元素可能会用未使用的像素填充。数据位偏移是从DataBuffer
开始到第一个像素的位偏移,并且必须是像素位跨度的倍数。
以下代码说明了从DataBuffer data
中提取像素x, y
的位并将像素数据存储在类型为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);
-
Field Summary
Fields declared in class java.awt.image.SampleModel
dataType, height, numBands, width
-
Constructor Summary
ConstructorDescriptionMultiPixelPackedSampleModel
(int dataType, int w, int h, int numberOfBits) 构造具有指定数据类型、宽度、高度和每像素位数的MultiPixelPackedSampleModel
。MultiPixelPackedSampleModel
(int dataType, int w, int h, int numberOfBits, int scanlineStride, int dataBitOffset) 构造具有指定数据类型、宽度、高度、每像素位数、扫描线跨度和数据位偏移的MultiPixelPackedSampleModel
。 -
Method Summary
Modifier and TypeMethodDescriptioncreateCompatibleSampleModel
(int w, int h) 创建具有指定宽度和高度的新MultiPixelPackedSampleModel
。创建与此MultiPixelPackedSampleModel
对应的DataBuffer
。createSubsetSampleModel
(int[] bands) 创建具有此MultiPixelPackedSampleModel
子波段的新MultiPixelPackedSampleModel
。int
getBitOffset
(int x) 返回存储第x个像素的扫描线中的数据元素中的位偏移量。int
返回数据位偏移量(以位为单位)。getDataElements
(int x, int y, Object obj, DataBuffer data) 返回以TransferType类型的原始数组中的单个像素的数据。int
int
getOffset
(int x, int y) 返回数据数组元素中像素(x, y)的偏移量。int[]
getPixel
(int x, int y, int[] iArray, DataBuffer data) 返回int
数组的第一个元素中指定的单波段像素。int
返回像素位跨度(以位为单位)。int
getSample
(int x, int y, int b, DataBuffer data) 返回位于(x, y)处的指定波段的样本作为int
。int[]
返回所有波段的每个样本的位数。int
getSampleSize
(int band) 返回指定波段的每个样本的位数。int
返回扫描线跨度。int
返回用于通过getDataElements
和setDataElements
方法传输像素的TransferType。void
setDataElements
(int x, int y, Object obj, DataBuffer data) 从TransferType类型的原始数组中设置指定DataBuffer
中的单个像素的数据。void
setPixel
(int x, int y, int[] iArray, DataBuffer data) 使用int
数组为输入在DataBuffer
中设置像素。void
setSample
(int x, int y, int b, int s, DataBuffer data) 使用int
为输入在DataBuffer
中设置位于(x, y)处的指定波段的样本。Methods declared in class java.awt.image.SampleModel
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, setSamples
-
Constructor Details
-
MultiPixelPackedSampleModel
public MultiPixelPackedSampleModel(int dataType, int w, int h, int numberOfBits) 构造具有指定数据类型、宽度、高度和每像素位数的MultiPixelPackedSampleModel
。- 参数:
-
dataType
- 用于存储样本的数据类型 -
w
- 描述图像数据区域的像素宽度 -
h
- 描述图像数据区域的像素高度 -
numberOfBits
- 每像素的位数 - 抛出:
-
IllegalArgumentException
- 如果dataType
不是DataBuffer.TYPE_BYTE
、DataBuffer.TYPE_USHORT
或DataBuffer.TYPE_INT
-
MultiPixelPackedSampleModel
public MultiPixelPackedSampleModel(int dataType, int w, int h, int numberOfBits, int scanlineStride, int dataBitOffset) 构造具有指定数据类型、宽度、高度、每像素位数、扫描线跨度和数据位偏移的MultiPixelPackedSampleModel
。- 参数:
-
dataType
- 用于存储样本的数据类型 -
w
- 描述图像数据区域的像素宽度 -
h
- 描述图像数据区域的像素高度 -
numberOfBits
- 每像素的位数 -
scanlineStride
- 图像数据的行跨度 -
dataBitOffset
- 描述图像数据区域的数据位偏移 - 抛出:
-
RasterFormatException
- 如果每像素的位数不是2的幂次方或2的幂次方的像素数量不适合一个数据元素 -
IllegalArgumentException
- 如果w
或h
不大于0 -
IllegalArgumentException
- 如果dataType
不是DataBuffer.TYPE_BYTE
、DataBuffer.TYPE_USHORT
或DataBuffer.TYPE_INT
-
-
Method Details
-
createCompatibleSampleModel
创建具有指定宽度和高度的新MultiPixelPackedSampleModel
。新的MultiPixelPackedSampleModel
具有与此MultiPixelPackedSampleModel
相同的存储数据类型和每像素位数。- 指定者:
-
createCompatibleSampleModel
在类中SampleModel
- 参数:
-
w
- 指定的宽度 -
h
- 指定的高度 - 返回:
-
一个具有指定宽度和高度以及与此
MultiPixelPackedSampleModel
相同的存储数据类型和每像素位数的SampleModel
。 - 抛出:
-
IllegalArgumentException
- 如果w
或h
不大于0
-
createDataBuffer
创建与此MultiPixelPackedSampleModel
对应的DataBuffer
。DataBuffer
对象的数据类型和大小与此MultiPixelPackedSampleModel
一致。该DataBuffer
具有单个bank。- 指定者:
-
createDataBuffer
在类中SampleModel
- 返回:
-
一个具有与此
MultiPixelPackedSampleModel
相同数据类型和大小的DataBuffer
。
-
getNumDataElements
public int getNumDataElements()返回通过getDataElements(int, int, java.lang.Object, java.awt.image.DataBuffer)
和setDataElements(int, int, java.lang.Object, java.awt.image.DataBuffer)
方法传输一个像素所需的数据元素数量。对于MultiPixelPackedSampleModel
,这是一个。- 指定者:
-
getNumDataElements
在类中SampleModel
- 返回:
- 数据元素的数量。
- 参见:
-
getSampleSize
public int[] getSampleSize()返回所有波段的每个样本的位数。- 指定者:
-
getSampleSize
在类中SampleModel
- 返回:
- 每个样本的位数。
-
getSampleSize
public int getSampleSize(int band) 返回指定波段的每个样本的位数。- 指定者:
-
getSampleSize
在类中SampleModel
- 参数:
-
band
- 指定的波段 - 返回:
- 指定波段的每个样本的位数。
-
getOffset
public int getOffset(int x, int y) 返回数据数组元素中像素(x, y)的偏移量。- 参数:
-
x
- 指定像素的X坐标 -
y
- 指定像素的Y坐标 - 返回:
- 指定像素的偏移量。
-
getBitOffset
public int getBitOffset(int x) 返回存储扫描线中第x个像素的数据元素中的位偏移量。此偏移量对所有扫描线都相同。- 参数:
-
x
- 指定的像素 - 返回:
- 指定像素的位偏移量。
-
getScanlineStride
public int getScanlineStride()返回扫描线跨距。- 返回:
-
此
MultiPixelPackedSampleModel
的扫描线跨距。
-
getPixelBitStride
public int getPixelBitStride()返回像素位跨距(以位为单位)。此值与每像素的位数相同。- 返回:
-
此
MultiPixelPackedSampleModel
的pixelBitStride
。
-
getDataBitOffset
public int getDataBitOffset()返回数据位偏移量(以位为单位)。- 返回:
-
此
MultiPixelPackedSampleModel
的dataBitOffset
。
-
getTransferType
public int getTransferType()返回用于通过getDataElements
和setDataElements
方法传输像素的TransferType。TransferType可能与存储的DataType相同,也可能不同。TransferType是DataBuffer.TYPE_BYTE、DataBuffer.TYPE_USHORT或DataBuffer.TYPE_INT中的一个。- 覆盖:
-
getTransferType
在类SampleModel
- 返回:
- 传输类型。
- 另请参阅:
-
createSubsetSampleModel
创建一个具有此MultiPixelPackedSampleModel
子集的新MultiPixelPackedSampleModel
。由于MultiPixelPackedSampleModel
只有一个波段,因此波段参数必须具有长度为一且指示第零波段的值。- 指定者:
-
createSubsetSampleModel
在类SampleModel
- 参数:
-
bands
- 指定的波段 - 返回:
-
具有此
MultiPixelPackedSampleModel
波段子集的新SampleModel
。 - 抛出:
-
IllegalArgumentException
- 如果请求的波段数不是一。 -
IllegalArgumentException
- 如果w
或h
不大于0
-
getSample
返回位于(x,y)处像素的指定波段的样本作为int
。如果坐标超出范围,则会抛出ArrayIndexOutOfBoundsException
。- 指定者:
-
getSample
在类SampleModel
- 参数:
-
x
- 指定像素的X坐标 -
y
- 指定像素的Y坐标 -
b
- 要返回的波段,假定为0 -
data
- 包含图像数据的DataBuffer
- 返回:
- 包含指定像素样本的指定波段。
- 抛出:
-
ArrayIndexOutOfBoundsException
- 如果指定的坐标超出范围。 - 另请参阅:
-
setSample
在DataBuffer
中使用int
设置位于(x,y)处像素的指定波段的样本。如果坐标超出范围,则会抛出ArrayIndexOutOfBoundsException
。- 指定者:
-
setSample
在类SampleModel
- 参数:
-
x
- 指定像素的X坐标 -
y
- 指定像素的Y坐标 -
b
- 要返回的波段,假定为0 -
s
- 作为int
输入的输入样本 -
data
- 存储图像数据的DataBuffer
- 抛出:
-
ArrayIndexOutOfBoundsException
- 如果坐标超出范围。 - 另请参阅:
-
getDataElements
返回TransferType类型的单个像素数据,存储在基本数组中。对于MultiPixelPackedSampleModel
,数组只有一个元素,类型是DataBuffer.TYPE_BYTE、DataBuffer.TYPE_USHORT或DataBuffer.TYPE_INT中可以容纳单个像素的最小类型。通常,应将obj
传递为null
,以便自动创建Object
并且是正确的基本数据类型。以下代码示例说明了从存储布局由
MultiPixelPackedSampleModel
mppsm1
描述的DataBuffer db1
中的一个像素传输数据到由MultiPixelPackedSampleModel mppsm2
描述的DataBuffer db2
中的过程。与使用getPixel
或setPixel
相比,传输通常更有效。MultiPixelPackedSampleModel mppsm1, mppsm2; DataBufferInt db1, db2; mppsm2.setDataElements(x, y, mppsm1.getDataElements(x, y, null, db1), db2);
如果obj
不是null
,则应该是TransferType类型的基本数组。否则,将抛出ClassCastException
。如果坐标超出范围,或者obj
不是null
且不足以容纳像素数据,则会抛出ArrayIndexOutOfBoundsException
。- 指定者:
-
getDataElements
在类SampleModel
- 参数:
-
x
- 指定像素的X坐标 -
y
- 指定像素的Y坐标 -
obj
- 用于返回像素数据的基本数组,或null
。 -
data
- 包含图像数据的DataBuffer
。 - 返回:
-
包含指定像素数据的
Object
。 - 抛出:
-
ClassCastException
- 如果obj
不是TransferType类型的基本数组或不是null
-
ArrayIndexOutOfBoundsException
- 如果坐标超出范围,或者obj
不是null
或不足以容纳像素数据 - 另请参阅:
-
getPixel
返回第一个元素中指定单波段像素的int
数组。如果坐标超出范围,则会抛出ArrayIndexOutOfBoundsException
。- 覆盖:
-
getPixel
在类SampleModel
- 参数:
-
x
- 指定像素的X坐标 -
y
- 指定像素的Y坐标 -
iArray
- 包含要返回的像素的数组,或null
-
data
- 存储图像数据的DataBuffer
- 返回:
- 包含指定像素的数组。
- 抛出:
-
ArrayIndexOutOfBoundsException
- 如果坐标超出范围 - 另请参阅:
-
setDataElements
在指定的DataBuffer
中,从TransferType类型的原始数组设置单个像素的数据。对于MultiPixelPackedSampleModel
,数组的第一个元素包含有效数据,类型必须是可以容纳单个像素的最小的DataBuffer.TYPE_BYTE、DataBuffer.TYPE_USHORT或DataBuffer.TYPE_INT。以下代码示例演示了从存储布局由
MultiPixelPackedSampleModel
mppsm1
描述的DataBuffer db1
中传输一个像素的数据到由MultiPixelPackedSampleModel mppsm2
描述的DataBuffer db2
。与使用getPixel
或setPixel
相比,传输通常更有效率。MultiPixelPackedSampleModel mppsm1, mppsm2; DataBufferInt db1, db2; mppsm2.setDataElements(x, y, mppsm1.getDataElements(x, y, null, db1), db2);
如果SampleModel
对象具有相同数量的波段,相应波段具有相同数量的每个样本的位数,并且TransferTypes相同,则在两个DataBuffer/SampleModel
对之间使用getDataElements
或setDataElements
进行传输是合法的。obj
必须是TransferType类型的原始数组。否则,将抛出ClassCastException
。如果坐标超出范围,或者obj
不足以容纳像素数据,则会抛出ArrayIndexOutOfBoundsException
。- 指定者:
-
setDataElements
在类中SampleModel
- 参数:
-
x
- 像素位置的X坐标 -
y
- 像素位置的Y坐标 -
obj
- 包含像素数据的原始数组 -
data
- 包含图像数据的DataBuffer
- 参见:
-
setPixel
使用int
数组设置DataBuffer
中的像素。如果坐标超出范围,则会抛出ArrayIndexOutOfBoundsException
。- 覆盖:
-
setPixel
在类中SampleModel
- 参数:
-
x
- 像素位置的X坐标 -
y
- 像素位置的Y坐标 -
iArray
-int
数组中的输入像素 -
data
- 包含图像数据的DataBuffer
- 参见:
-