Module  java.desktop
软件包  java.awt.image

Class 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);  
    • 构造方法详细信息

      • MultiPixelPackedSampleModel

        public MultiPixelPackedSampleModel​(int dataType,
                                           int w,
                                           int h,
                                           int numberOfBits)
        构造具有指定数据类型,宽度,高度和每像素位数的 MultiPixelPackedSampleModel
        参数
        dataType - 存储样本的数据类型
        w - 描述的图像数据区域的宽度(以像素为单位)
        h - 描述的图像数据区域的高度(以像素为单位)
        numberOfBits - 每像素的位数
        异常
        IllegalArgumentException -如果 dataType不是非此即彼 DataBuffer.TYPE_BYTEDataBuffer.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 - 如果 wh不大于0
        IllegalArgumentException -如果 dataType不是非此即彼 DataBuffer.TYPE_BYTEDataBuffer.TYPE_USHORT ,或 DataBuffer.TYPE_INT
    • 方法详细信息

      • createCompatibleSampleModel

        public SampleModel createCompatibleSampleModel​(int w,
                                                       int h)
        创建一个新的MultiPixelPackedSampleModel具有指定的宽度和高度。 新的MultiPixelPackedSampleModel具有与MultiPixelPackedSampleModel相同的存储数据类型和每像素的MultiPixelPackedSampleModel
        Specified by:
        createCompatibleSampleModelSampleModel
        参数
        w - 指定的宽度
        h - 指定的高度
        结果
        一个SampleModel具有指定的宽度和高度,并具有与MultiPixelPackedSampleModel相同的存储数据类型和每像素的MultiPixelPackedSampleModel
        异常
        IllegalArgumentException - 如果 wh不大于0
      • createDataBuffer

        public DataBuffer createDataBuffer​()
        创建一个DataBuffer对应于这个MultiPixelPackedSampleModel DataBuffer对象的数据类型和大小与此MultiPixelPackedSampleModel一致。 DataBuffer有一个银行。
        Specified by:
        createDataBufferSampleModel
        结果
        一个 DataBuffer具有相同的数据类型和大小,这个 MultiPixelPackedSampleModel
      • getSampleSize

        public int[] getSampleSize​()
        返回所有频带的每个样本的位数。
        Specified by:
        getSampleSizeSampleModel
        结果
        每个样本的位数。
      • getSampleSize

        public int getSampleSize​(int band)
        返回指定频带的每个样本的位数。
        Specified by:
        getSampleSizeSampleModel
        参数
        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​()
        返回像素位以位为单位。 该值与每像素的位数相同。
        结果
        pixelBitStrideMultiPixelPackedSampleModel
      • getDataBitOffset

        public int getDataBitOffset​()
        以位为单位返回数据位偏移量。
        结果
        dataBitOffset的这个 MultiPixelPackedSampleModel
      • createSubsetSampleModel

        public SampleModel createSubsetSampleModel​(int[] bands)
        创建一个新的MultiPixelPackedSampleModel与这个MultiPixelPackedSampleModel的频带的子集。 由于MultiPixelPackedSampleModel只有一个频段,所以频段参数的长度必须为1,表示第0个频段。
        Specified by:
        createSubsetSampleModelSampleModel
        参数
        bands - 指定的乐队
        结果
        一个新的 SampleModel与这个 MultiPixelPackedSampleModel的频带的子集。
        异常
        RasterFormatException - 如果请求的频带数不是一个。
        IllegalArgumentException - 如果 wh不大于0
      • getSample

        public int getSample​(int x,
                             int y,
                             int b,
                             DataBuffer data)
        返回为int位于(x,y)处的像素的指定带中的样本。 如果坐标不在边界内,则抛出ArrayIndexOutOfBoundsException
        Specified by:
        getSampleSampleModel
        参数
        x - 指定像素的X坐标
        y - 指定像素的Y坐标
        b - 要返回的频带,假定为0
        data - 包含图像数据的 DataBuffer
        结果
        指定的带包含指定像素的样本。
        异常
        ArrayIndexOutOfBoundsException - 如果指定的坐标不在边界内。
        另请参见:
        setSample(int, int, int, int, DataBuffer)
      • setSample

        public void setSample​(int x,
                              int y,
                              int b,
                              int s,
                              DataBuffer data)
        DataBuffer使用int设置位于(x,y)处的像素的指定频带中的样本。 如果坐标不在边界内,则抛出ArrayIndexOutOfBoundsException
        Specified by:
        setSample在类 SampleModel
        参数
        x - 指定像素的X坐标
        y - 指定像素的Y坐标
        b - 要返回的频带,假定为0
        s - 输入样本为 int
        data - 存储图像数据的 DataBuffer
        异常
        ArrayIndexOutOfBoundsException - 如果坐标不在边界内。
        另请参见:
        getSample(int, int, int, DataBuffer)
      • 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 ,是正确的原始数据类型。

        以下代码说明将DataBuffer db1 (其存储布局由MultiPixelPackedSampleModel描述为MultiPixelPackedSampleModel mppsm1DataBuffer db2 ,其存储布局由MultiPixelPackedSampleModel mppsm2描述。 转移通常比使用getPixelsetPixel更有效。

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

        如果obj不是null ,它应该是TransferType类型的原始数组。 否则,抛出一个ClassCastException 一个ArrayIndexOutOfBoundsException如果坐标不在边界被抛出,或者如果objnull并没有大到足以容纳像素数据。

        Specified by:
        getDataElementsSampleModel
        参数
        x - 指定像素的X坐标
        y - 指定像素的Y坐标
        obj - 要返回像素数据的原始数组,或 null
        data - 包含图像数据的 DataBuffer
        结果
        一个 Object包含指定像素的数据。
        异常
        ClassCastException - 如果 obj不是TransferType类型的原始数组,或不是 null
        ArrayIndexOutOfBoundsException - 如果坐标不在边界,或者如果 obj不是 null或者不够大,不能保持像素数据
        另请参见:
        setDataElements(int, int, Object, DataBuffer)
      • getPixel

        public int[] getPixel​(int x,
                              int y,
                              int[] iArray,
                              DataBuffer data)
        返回int数组的第一个元素中指定的单频带像素。 如果坐标不在边界内,则抛出ArrayIndexOutOfBoundsException
        重写:
        getPixelSampleModel
        参数
        x - 指定像素的X坐标
        y - 指定像素的Y坐标
        iArray - 包含要返回的像素的数组或 null
        data - 存储图像数据的 DataBuffer
        结果
        一个包含指定像素的数组。
        异常
        ArrayIndexOutOfBoundsException - 如果坐标不在边界内
        另请参见:
        setPixel(int, int, int[], DataBuffer)
      • setDataElements

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

        以下代码说明将DataBuffer db1的存储布局由MultiPixelPackedSampleModel mppsm1描述的MultiPixelPackedSampleModel一个像素的数据传输到DataBuffer db2 ,其存储布局由MultiPixelPackedSampleModel mppsm2描述。 转移通常比使用getPixelsetPixel更有效。

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

        obj必须是TransferType类型的原始数组。 否则,将抛出一个ClassCastException 一个ArrayIndexOutOfBoundsException如果坐标不在边界被抛出,或者如果obj不够大,无法容纳像素数据。

        Specified by:
        setDataElementsSampleModel
        参数
        x - 像素位置的X坐标
        y - 像素位置的Y坐标
        obj - 包含像素数据的原始数组
        data - 包含图像数据的 DataBuffer
        另请参见:
        getDataElements(int, int, Object, DataBuffer)
      • setPixel

        public void setPixel​(int x,
                             int y,
                             int[] iArray,
                             DataBuffer data)
        使用int数组设置DataBuffer的像素进行输入。 如果坐标不在边界内,则抛出ArrayIndexOutOfBoundsException
        重写:
        setPixelSampleModel
        参数
        x - 像素位置的X坐标
        y - 像素位置的Y坐标
        iArray - int数组中的输入像素
        data - 包含图像数据的 DataBuffer
        另请参见:
        getPixel(int, int, int[], DataBuffer)
      • equals

        public boolean equals​(Object o)
        描述从类别复制: Object
        指示一些其他对象是否等于此。

        equals方法在非空对象引用上实现等价关系:

        • 自反性 :对于任何非空的参考值xx.equals(x)应该返回true
        • 它是对称的 :对于任何非空引用值xyx.equals(y)应该返回true当且仅当y.equals(x)回报true
        • 传递性 :对于任何非空引用值xy ,并z ,如果x.equals(y)回报truey.equals(z)回报true ,然后x.equals(z)应该返回true
        • 它是一致的 :对于任何非空引用值xy ,多重调用x.equals(y)始终返回true或一致返回false ,只要在equals对对象的比较使用的信息进行修改。
        • 对于任何非空的参考值xx.equals(null)应该返回false

        equals类方法Object实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空参考值xy ,当且仅当xy引用相同对象( x == y具有值true )时,该方法返回true

        请注意,无论何时覆盖此方法,通常需要覆盖hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。

        重写:
        equalsObject
        参数
        o - 用于比较的参考对象。
        结果
        true如果该对象与obj参数相同; 否则为false
        另请参见:
        Object.hashCode()HashMap
      • hashCode

        public int hashCode​()
        描述从类别复制: Object
        返回对象的哈希码值。 支持这种方法有利于哈希表,如HashMap提供的那些

        hashCode的总合同是:

        • 无论何时在执行Java应用程序时多次在同一对象上调用该对象, hashCode方法必须始终返回相同的整数,前提是修改了对象中equals对比中的信息。 该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。
        • 如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
        • 要求如果两个对象根据Object.equals(java.lang.Object)方法不相等,那么在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。 但是,程序员应该意识到,为不等对象生成不同的整数结果可能会提高哈希表的性能。

        尽可能合理实用,由类Object定义的hashCode方法为不同对象返回不同的整数。 (在某个时间点,hashCode可能或可能不被实现为对象的存储器地址的某些功能。)

        重写:
        hashCodeObject
        结果
        该对象的哈希码值。
        另请参见:
        Object.equals(java.lang.Object)System.identityHashCode(java.lang.Object)