Module java.desktop
Package java.awt.image

Class MultiPixelPackedSampleModel

java.lang.Object
java.awt.image.SampleModel
java.awt.image.MultiPixelPackedSampleModel

public class MultiPixelPackedSampleModel extends SampleModel
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);
  
  • Constructor Details

    • MultiPixelPackedSampleModel

      public MultiPixelPackedSampleModel(int dataType, int w, int h, int numberOfBits)
      构造具有指定数据类型、宽度、高度和每像素位数的MultiPixelPackedSampleModel
      参数:
      dataType - 用于存储样本的数据类型
      w - 描述图像数据区域的像素宽度
      h - 描述图像数据区域的像素高度
      numberOfBits - 每像素的位数
      抛出:
      IllegalArgumentException - 如果dataType不是DataBuffer.TYPE_BYTEDataBuffer.TYPE_USHORTDataBuffer.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 - 如果wh不大于0
      IllegalArgumentException - 如果dataType不是DataBuffer.TYPE_BYTEDataBuffer.TYPE_USHORTDataBuffer.TYPE_INT
  • Method Details

    • createCompatibleSampleModel

      public SampleModel createCompatibleSampleModel(int w, int h)
      创建具有指定宽度和高度的新MultiPixelPackedSampleModel。新的MultiPixelPackedSampleModel具有与此MultiPixelPackedSampleModel相同的存储数据类型和每像素位数。
      指定者:
      createCompatibleSampleModel 在类中 SampleModel
      参数:
      w - 指定的宽度
      h - 指定的高度
      返回:
      一个具有指定宽度和高度以及与此MultiPixelPackedSampleModel相同的存储数据类型和每像素位数的SampleModel
      抛出:
      IllegalArgumentException - 如果wh不大于0
    • createDataBuffer

      public DataBuffer createDataBuffer()
      创建与此MultiPixelPackedSampleModel对应的DataBufferDataBuffer对象的数据类型和大小与此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()
      返回像素位跨距(以位为单位)。此值与每像素的位数相同。
      返回:
      MultiPixelPackedSampleModelpixelBitStride
    • getDataBitOffset

      public int getDataBitOffset()
      返回数据位偏移量(以位为单位)。
      返回:
      MultiPixelPackedSampleModeldataBitOffset
    • getTransferType

      public int getTransferType()
      返回用于通过getDataElementssetDataElements方法传输像素的TransferType。TransferType可能与存储的DataType相同,也可能不同。TransferType是DataBuffer.TYPE_BYTE、DataBuffer.TYPE_USHORT或DataBuffer.TYPE_INT中的一个。
      覆盖:
      getTransferType 在类 SampleModel
      返回:
      传输类型。
      另请参阅:
    • createSubsetSampleModel

      public SampleModel createSubsetSampleModel(int[] bands)
      创建一个具有此MultiPixelPackedSampleModel子集的新MultiPixelPackedSampleModel。由于MultiPixelPackedSampleModel只有一个波段,因此波段参数必须具有长度为一且指示第零波段的值。
      指定者:
      createSubsetSampleModel 在类 SampleModel
      参数:
      bands - 指定的波段
      返回:
      具有此MultiPixelPackedSampleModel波段子集的新SampleModel
      抛出:
      IllegalArgumentException - 如果请求的波段数不是一。
      IllegalArgumentException - 如果wh不大于0
    • getSample

      public int getSample(int x, int y, int b, DataBuffer data)
      返回位于(x,y)处像素的指定波段的样本作为int。如果坐标超出范围,则会抛出ArrayIndexOutOfBoundsException
      指定者:
      getSample 在类 SampleModel
      参数:
      x - 指定像素的X坐标
      y - 指定像素的Y坐标
      b - 要返回的波段,假定为0
      data - 包含图像数据的DataBuffer
      返回:
      包含指定像素样本的指定波段。
      抛出:
      ArrayIndexOutOfBoundsException - 如果指定的坐标超出范围。
      另请参阅:
    • setSample

      public void setSample(int x, int y, int b, int s, DataBuffer data)
      DataBuffer中使用int设置位于(x,y)处像素的指定波段的样本。如果坐标超出范围,则会抛出ArrayIndexOutOfBoundsException
      指定者:
      setSample 在类 SampleModel
      参数:
      x - 指定像素的X坐标
      y - 指定像素的Y坐标
      b - 要返回的波段,假定为0
      s - 作为int输入的输入样本
      data - 存储图像数据的DataBuffer
      抛出:
      ArrayIndexOutOfBoundsException - 如果坐标超出范围。
      另请参阅:
    • getDataElements

      public Object getDataElements(int x, int y, Object obj, DataBuffer data)
      返回TransferType类型的单个像素数据,存储在基本数组中。对于MultiPixelPackedSampleModel,数组只有一个元素,类型是DataBuffer.TYPE_BYTE、DataBuffer.TYPE_USHORT或DataBuffer.TYPE_INT中可以容纳单个像素的最小类型。通常,应将obj传递为null,以便自动创建Object并且是正确的基本数据类型。

      以下代码示例说明了从存储布局由MultiPixelPackedSampleModel mppsm1描述的DataBuffer db1中的一个像素传输数据到由MultiPixelPackedSampleModel mppsm2描述的DataBuffer db2中的过程。与使用getPixelsetPixel相比,传输通常更有效。

             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

      public int[] getPixel(int x, int y, int[] iArray, DataBuffer data)
      返回第一个元素中指定单波段像素的int数组。如果坐标超出范围,则会抛出ArrayIndexOutOfBoundsException
      覆盖:
      getPixel 在类 SampleModel
      参数:
      x - 指定像素的X坐标
      y - 指定像素的Y坐标
      iArray - 包含要返回的像素的数组,或null
      data - 存储图像数据的DataBuffer
      返回:
      包含指定像素的数组。
      抛出:
      ArrayIndexOutOfBoundsException - 如果坐标超出范围
      另请参阅:
    • setDataElements

      public void setDataElements(int x, int y, Object obj, DataBuffer data)
      在指定的DataBuffer中,从TransferType类型的原始数组设置单个像素的数据。对于MultiPixelPackedSampleModel,数组的第一个元素包含有效数据,类型必须是可以容纳单个像素的最小的DataBuffer.TYPE_BYTE、DataBuffer.TYPE_USHORT或DataBuffer.TYPE_INT。

      以下代码示例演示了从存储布局由MultiPixelPackedSampleModel mppsm1描述的DataBuffer db1中传输一个像素的数据到由MultiPixelPackedSampleModel mppsm2描述的DataBuffer db2。与使用getPixelsetPixel相比,传输通常更有效率。

             MultiPixelPackedSampleModel mppsm1, mppsm2;
             DataBufferInt db1, db2;
             mppsm2.setDataElements(x, y, mppsm1.getDataElements(x, y, null,
                                    db1), db2);
       
      如果SampleModel对象具有相同数量的波段,相应波段具有相同数量的每个样本的位数,并且TransferTypes相同,则在两个DataBuffer/SampleModel对之间使用getDataElementssetDataElements进行传输是合法的。

      obj必须是TransferType类型的原始数组。否则,将抛出ClassCastException。如果坐标超出范围,或者obj不足以容纳像素数据,则会抛出ArrayIndexOutOfBoundsException

      指定者:
      setDataElements 在类中 SampleModel
      参数:
      x - 像素位置的X坐标
      y - 像素位置的Y坐标
      obj - 包含像素数据的原始数组
      data - 包含图像数据的DataBuffer
      参见:
    • setPixel

      public void setPixel(int x, int y, int[] iArray, DataBuffer data)
      使用int数组设置DataBuffer中的像素。如果坐标超出范围,则会抛出ArrayIndexOutOfBoundsException
      覆盖:
      setPixel 在类中 SampleModel
      参数:
      x - 像素位置的X坐标
      y - 像素位置的Y坐标
      iArray - int数组中的输入像素
      data - 包含图像数据的DataBuffer
      参见: