Module java.desktop
Package java.awt.image

Class SinglePixelPackedSampleModel

java.lang.Object
java.awt.image.SampleModel
java.awt.image.SinglePixelPackedSampleModel

public class SinglePixelPackedSampleModel extends SampleModel
该类表示像素数据打包,使得构成单个像素的N个样本存储在单个数据数组元素中,每个数据数组元素仅保存一个像素的样本。该类支持TYPE_BYTETYPE_USHORTTYPE_INT数据类型。所有数据数组元素都驻留在DataBuffer的第一个bank中。提供了访问器方法,以便可以直接操作图像数据。扫描线跨距是给定样本和下一个扫描线中相同列的相应样本之间的数据数组元素数量。位掩码是提取表示像素波段的样本所需的掩码。位偏移是样本表示像素波段的位在数据数组元素中的偏移位。

以下代码说明了从DataBuffer data中提取像素x,y的波段b的位:


      int sample = data.getElem(y * scanlineStride + x);
      sample = (sample & bitMasks[b]) >>> bitOffsets[b];
  
  • Constructor Details

    • SinglePixelPackedSampleModel

      public SinglePixelPackedSampleModel(int dataType, int w, int h, int[] bitMasks)
      构造具有bitMasks.length波段的SinglePixelPackedSampleModel。每个样本存储在其对应位掩码的数据数组元素中的位置。每个位掩码必须是连续的,且掩码不能重叠。超出数据类型容量的位掩码将被截断。
      参数:
      dataType - 存储样本的数据类型。
      w - 描述图像数据区域的宽度(以像素为单位)。
      h - 描述图像数据区域的高度(以像素为单位)。
      bitMasks - 所有波段的位掩码。
      抛出:
      IllegalArgumentException - 如果dataType不是DataBuffer.TYPE_BYTEDataBuffer.TYPE_USHORTDataBuffer.TYPE_INT
    • SinglePixelPackedSampleModel

      public SinglePixelPackedSampleModel(int dataType, int w, int h, int scanlineStride, int[] bitMasks)
      构造具有bitMasks.length波段和扫描线跨距等于scanlineStride数据数组元素的SinglePixelPackedSampleModel。每个样本存储在其对应位掩码的数据数组元素中的位置。每个位掩码必须是连续的,且掩码不能重叠。超出数据类型容量的位掩码将被截断。
      参数:
      dataType - 存储样本的数据类型。
      w - 描述图像数据区域的宽度(以像素为单位)。
      h - 描述图像数据区域的高度(以像素为单位)。
      scanlineStride - 图像数据的行跨度。
      bitMasks - 所有波段的位掩码。
      抛出:
      IllegalArgumentException - 如果wh不大于0
      IllegalArgumentException - 如果bitMask中的任何掩码不是连续的
      IllegalArgumentException - 如果dataType不是DataBuffer.TYPE_BYTEDataBuffer.TYPE_USHORTDataBuffer.TYPE_INT
  • Method Details

    • getNumDataElements

      public int getNumDataElements()
      返回通过getDataElements和setDataElements方法传输一个像素所需的数据元素数量。对于SinglePixelPackedSampleModel,这是一个。
      指定者:
      getNumDataElements 在类 SampleModel
      返回:
      数据元素的数量。
      参见:
    • createCompatibleSampleModel

      public SampleModel createCompatibleSampleModel(int w, int h)
      创建具有指定宽度和高度的新SinglePixelPackedSampleModel。新的SinglePixelPackedSampleModel将具有与此SinglePixelPackedSampleModel相同的存储数据类型和位掩码。
      指定者:
      createCompatibleSampleModel 在类 SampleModel
      参数:
      w - 结果SampleModel的宽度
      h - 结果SampleModel的高度
      返回:
      具有指定宽度和高度的SinglePixelPackedSampleModel
      抛出:
      IllegalArgumentException - 如果wh不大于0
    • createDataBuffer

      public DataBuffer createDataBuffer()
      创建与此SinglePixelPackedSampleModel对应的DataBuffer。DataBuffer的数据类型和大小将与此SinglePixelPackedSampleModel一致。DataBuffer将具有单个bank。
      指定者:
      createDataBuffer 在类 SampleModel
      返回:
      与此SampleModel对应的DataBuffer
    • 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)的偏移量(以数据数组元素为单位)。包含像素 的数据元素可以从具有SinglePixelPackedSampleModel sppsm的DataBuffer data中检索:
              data.getElem(sppsm.getOffset(x, y));
       
      参数:
      x - 指定像素的X坐标
      y - 指定像素的Y坐标
      返回:
      指定像素的偏移量。
    • getBitOffsets

      public int[] getBitOffsets()
      返回表示所有波段的数据数组元素中像素的位偏移。
      返回:
      表示所有波段的像素的位偏移。
    • getBitMasks

      public int[] getBitMasks()
      返回所有波段的位掩码。
      返回:
      所有波段的位掩码。
    • getScanlineStride

      public int getScanlineStride()
      返回此SinglePixelPackedSampleModel的扫描线跨距。
      返回:
      SinglePixelPackedSampleModel的扫描线跨距。
    • createSubsetSampleModel

      public SampleModel createSubsetSampleModel(int[] bands)
      创建一个新的SinglePixelPackedSampleModel,其中包含此SinglePixelPackedSampleModel的一部分波段。新的SinglePixelPackedSampleModel可以与现有的SinglePixelPackedSampleModel可以使用的任何DataBuffer一起使用。新的SinglePixelPackedSampleModel/DataBuffer组合将表示具有原始SinglePixelPackedSampleModel/DataBuffer组合的波段子集的图像。
      指定者:
      createSubsetSampleModel 在类 SampleModel
      参数:
      bands - 此SampleModel的波段子集
      返回:
      一个具有此SampleModel波段子集的SampleModel
      抛出:
      RasterFormatException - 如果bands参数的长度大于样本模型中的波段数。
    • getDataElements

      public Object getDataElements(int x, int y, Object obj, DataBuffer data)
      返回以TransferType类型的原始数组中的单个像素的数据。对于SinglePixelPackedSampleModel,数组将只有一个元素,并且类型将与存储数据类型相同。通常,应将obj传递为null,以便自动创建对象,并且将是正确的原始数据类型。

      以下代码说明了从由SinglePixelPackedSampleModel sppsm1描述的DataBuffer db1中的一个像素传输数据到由SinglePixelPackedSampleModel sppsm2描述的DataBuffer db2的过程。传输通常比使用getPixel/setPixel更有效。

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

      如果obj非null,则它应该是TransferType类型的原始数组。否则,将抛出ClassCastException。如果坐标不在范围内,或者obj不足以容纳像素数据,则可能会抛出ArrayIndexOutOfBoundsException。

      指定者:
      getDataElements 在类 SampleModel
      参数:
      x - 像素位置的X坐标。
      y - 像素位置的Y坐标。
      obj - 如果非null,则返回像素数据的原始数组。
      data - 包含图像数据的DataBuffer。
      返回:
      指定像素的数据。
      参见:
    • getPixel

      public int[] getPixel(int x, int y, int[] iArray, DataBuffer data)
      返回指定像素的所有样本的int数组。如果坐标不在范围内,则可能会抛出ArrayIndexOutOfBoundsException。
      覆盖:
      getPixel 在类 SampleModel
      参数:
      x - 像素位置的X坐标。
      y - 像素位置的Y坐标。
      iArray - 如果非null,则将样本返回到此数组中
      data - 包含图像数据的DataBuffer。
      返回:
      指定像素的所有样本。
      参见:
    • getPixels

      public int[] getPixels(int x, int y, int w, int h, int[] iArray, DataBuffer data)
      返回指定像素矩形中所有样本的int数组,每个数组元素一个样本。如果坐标不在范围内,则可能会抛出ArrayIndexOutOfBoundsException。
      覆盖:
      getPixels 在类 SampleModel
      参数:
      x - 左上角像素位置的X坐标。
      y - 左上角像素位置的Y坐标。
      w - 像素矩形的宽度。
      h - 像素矩形的高度。
      iArray - 如果非null,则将样本返回到此数组中。
      data - 包含图像数据的DataBuffer。
      返回:
      指定像素区域的所有样本。
      参见:
    • getSample

      public int getSample(int x, int y, int b, DataBuffer data)
      返回位于(x,y)处的像素的指定波段的样本作为int。如果坐标不在范围内,则可能会抛出ArrayIndexOutOfBoundsException。
      指定者:
      getSample 在类 SampleModel
      参数:
      x - 像素位置的X坐标。
      y - 像素位置的Y坐标。
      b - 要返回的波段。
      data - 包含图像数据的DataBuffer。
      返回:
      指定像素的指定波段的样本。
      参见:
    • getSamples

      public int[] getSamples(int x, int y, int w, int h, int b, int[] iArray, DataBuffer data)
      返回指定像素矩形中指定波段的所有样本的int数组,每个数组元素一个样本。如果坐标不在范围内,则可能会抛出ArrayIndexOutOfBoundsException。
      覆盖:
      getSamples 在类 SampleModel
      参数:
      x - 左上角像素位置的X坐标。
      y - 左上角像素位置的Y坐标。
      w - 像素矩形的宽度。
      h - 像素矩形的高度。
      b - 要返回的波段。
      iArray - 如果非null,则将样本返回到此数组中。
      data - 包含图像数据的DataBuffer。
      返回:
      指定像素区域的指定波段的所有样本。
      参见:
    • setDataElements

      public void setDataElements(int x, int y, Object obj, DataBuffer data)
      从TransferType类型的原始数组中设置指定DataBuffer中的单个像素的数据。对于SinglePixelPackedSampleModel,数组的第一个元素将包含有效数据,并且数组的类型必须与SinglePixelPackedSampleModel的存储数据类型相同。

      以下代码说明了从由SinglePixelPackedSampleModel sppsm1描述的DataBuffer db1中的一个像素传输数据到由SinglePixelPackedSampleModel sppsm2描述的DataBuffer db2的过程。传输通常比使用getPixel/setPixel更有效。

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

      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。
      参见:
    • setPixels

      public void setPixels(int x, int y, int w, int h, int[] iArray, DataBuffer data)
      将包含每个数组元素一个样本的int数组中的像素矩形的所有样本设置为指定值。如果坐标超出范围,可能会抛出ArrayIndexOutOfBoundsException异常。
      覆盖:
      setPixels 在类 SampleModel
      参数:
      x - 左上角像素位置的X坐标。
      y - 左上角像素位置的Y坐标。
      w - 像素矩形的宽度。
      h - 像素矩形的高度。
      iArray - int数组中的输入样本。
      data - 包含图像数据的DataBuffer。
      参见:
    • setSample

      public void setSample(int x, int y, int b, int s, DataBuffer data)
      使用int类型的输入,在DataBuffer中为位于(x,y)处的像素的指定波段设置样本。如果坐标超出范围,可能会抛出ArrayIndexOutOfBoundsException异常。
      指定者:
      setSample 在类 SampleModel
      参数:
      x - 像素位置的X坐标。
      y - 像素位置的Y坐标。
      b - 要设置的波段。
      s - 作为int的输入样本。
      data - 包含图像数据的DataBuffer。
      参见:
    • setSamples

      public void setSamples(int x, int y, int w, int h, int b, int[] iArray, DataBuffer data)
      将包含每个数组元素一个样本的int数组中的指定矩形像素的指定波段的所有样本设置为指定值。如果坐标超出范围,可能会抛出ArrayIndexOutOfBoundsException异常。
      覆盖:
      setSamples 在类 SampleModel
      参数:
      x - 左上角像素位置的X坐标。
      y - 左上角像素位置的Y坐标。
      w - 像素矩形的宽度。
      h - 像素矩形的高度。
      b - 要设置的波段。
      iArray - int数组中的输入样本。
      data - 包含图像数据的DataBuffer。
      参见: