📄 multipixelpackedsamplemodel.java
字号:
throw new ArrayIndexOutOfBoundsException ("Coordinate out of bounds!"); } int bitnum = dataBitOffset + x*pixelBitStride; int element = data.getElem(y*scanlineStride + bitnum/dataElementSize); int shift = dataElementSize - (bitnum & (dataElementSize-1)) - pixelBitStride; return (element >> shift) & bitMask; } /** * Sets a sample in the specified band for the pixel located at * (x, y) in the <code>DataBuffer</code> using an * <code>int</code> for input. * An <code>ArrayIndexOutOfBoundsException</code> is thrown if the * coordinates are not in bounds. * @param x, y the coordinates of the specified pixel * @param b the band to return, which is assumed to be 0 * @param s the input sample as an <code>int</code> * @param data the <code>DataBuffer</code> where image data is stored * @exception ArrayIndexOutOfBoundsException if the coordinates are * not in bounds. * @see #getSample(int, int, int, DataBuffer) */ public void setSample(int x, int y, int b, int s, DataBuffer data) { // 'b' must be 0 if ((x < 0) || (y < 0) || (x >= width) || (y >= height) || (b != 0)) { throw new ArrayIndexOutOfBoundsException ("Coordinate out of bounds!"); } int bitnum = dataBitOffset + x * pixelBitStride; int index = y * scanlineStride + (bitnum / dataElementSize); int shift = dataElementSize - (bitnum & (dataElementSize-1)) - pixelBitStride; int element = data.getElem(index); element &= ~(bitMask << shift); element |= (s & bitMask) << shift; data.setElem(index,element); } /** * Returns data for a single pixel in a primitive array of type * TransferType. For a <code>MultiPixelPackedSampleModel</code>, * 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, <code>obj</code> * should be passed in as <code>null</code>, so that the * <code>Object</code> is created automatically and is the * correct primitive data type. * <p> * The following code illustrates transferring data for one pixel from * <code>DataBuffer</code> <code>db1</code>, whose storage layout is * described by <code>MultiPixelPackedSampleModel</code> * <code>mppsm1</code>, to <code>DataBuffer</code> <code>db2</code>, * whose storage layout is described by * <code>MultiPixelPackedSampleModel</code> <code>mppsm2</code>. * The transfer is generally more efficient than using * <code>getPixel</code> or <code>setPixel</code>. * <pre> * MultiPixelPackedSampleModel mppsm1, mppsm2; * DataBufferInt db1, db2; * mppsm2.setDataElements(x, y, mppsm1.getDataElements(x, y, null, * db1), db2); * </pre> * Using <code>getDataElements</code> or <code>setDataElements</code> * to transfer between two <code>DataBuffer/SampleModel</code> pairs * is legitimate if the <code>SampleModels</code> have the same number * of bands, corresponding bands have the same number of * bits per sample, and the TransferTypes are the same. * <p> * If <code>obj</code> is not <code>null</code>, it should be a * primitive array of type TransferType. Otherwise, a * <code>ClassCastException</code> is thrown. An * <code>ArrayIndexOutOfBoundsException</code> is thrown if the * coordinates are not in bounds, or if <code>obj</code> is not * <code>null</code> and is not large enough to hold the pixel data. * @param x, y coordinates of the pixel location. * @param obj a primitive array in which to return the pixel data or * <code>null</code>. * @param data the <code>DataBuffer</code> containing the image data. * @return an <code>Object</code> containing data for the specified * pixel. * @exception ClassCastException if <code>obj</code> is not a * primitive array of type TransferType or is not <code>null</code> * @exception ArrayIndexOutOfBoundsException if the coordinates are * not in bounds, or if <code>obj</code> is not <code>null</code> or * not large enough to hold the pixel data * @see #setDataElements(int, int, Object, DataBuffer) */ public Object getDataElements(int x, int y, Object obj, DataBuffer data) { if ((x < 0) || (y < 0) || (x >= width) || (y >= height)) { throw new ArrayIndexOutOfBoundsException ("Coordinate out of bounds!"); } int type = getTransferType(); int bitnum = dataBitOffset + x*pixelBitStride; int shift = dataElementSize - (bitnum & (dataElementSize-1)) - pixelBitStride; int element = 0; switch(type) { case DataBuffer.TYPE_BYTE: byte[] bdata; if (obj == null) bdata = new byte[1]; else bdata = (byte[])obj; element = data.getElem(y*scanlineStride + bitnum/dataElementSize); bdata[0] = (byte)((element >> shift) & bitMask); obj = (Object)bdata; break; case DataBuffer.TYPE_USHORT: short[] sdata; if (obj == null) sdata = new short[1]; else sdata = (short[])obj; element = data.getElem(y*scanlineStride + bitnum/dataElementSize); sdata[0] = (short)((element >> shift) & bitMask); obj = (Object)sdata; break; case DataBuffer.TYPE_INT: int[] idata; if (obj == null) idata = new int[1]; else idata = (int[])obj; element = data.getElem(y*scanlineStride + bitnum/dataElementSize); idata[0] = (element >> shift) & bitMask; obj = (Object)idata; break; } return obj; } /** * Returns the specified single band pixel in the first element * of an <code>int</code> array. * <code>ArrayIndexOutOfBoundsException</code> is thrown if the * coordinates are not in bounds. * @param x, y the coordinates of the pixel location * @param iArray the array containing the pixel to be returned or * <code>null</code> * @param data the <code>DataBuffer</code> where image data is stored * @return an array containing the specified pixel. * @exception ArrayIndexOutOfBoundsException if the coordinates * are not in bounds * @see #setPixel(int, int, int[], DataBuffer) */ public int[] getPixel(int x, int y, int iArray[], DataBuffer data) { if ((x < 0) || (y < 0) || (x >= width) || (y >= height)) { throw new ArrayIndexOutOfBoundsException ("Coordinate out of bounds!"); } int pixels[]; if (iArray != null) { pixels = iArray; } else { pixels = new int [numBands]; } int bitnum = dataBitOffset + x*pixelBitStride; int element = data.getElem(y*scanlineStride + bitnum/dataElementSize); int shift = dataElementSize - (bitnum & (dataElementSize-1)) - pixelBitStride; pixels[0] = (element >> shift) & bitMask; return pixels; } /** * Sets the data for a single pixel in the specified * <code>DataBuffer</code> from a primitive array of type * TransferType. For a <code>MultiPixelPackedSampleModel</code>, * 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. * <p> * The following code illustrates transferring data for one pixel from * <code>DataBuffer</code> <code>db1</code>, whose storage layout is * described by <code>MultiPixelPackedSampleModel</code> * <code>mppsm1</code>, to <code>DataBuffer</code> <code>db2</code>, * whose storage layout is described by * <code>MultiPixelPackedSampleModel</code> <code>mppsm2</code>. * The transfer is generally more efficient than using * <code>getPixel</code> or <code>setPixel</code>. * <pre> * MultiPixelPackedSampleModel mppsm1, mppsm2; * DataBufferInt db1, db2; * mppsm2.setDataElements(x, y, mppsm1.getDataElements(x, y, null, * db1), db2); * </pre> * Using <code>getDataElements</code> or <code>setDataElements</code> to * transfer between two <code>DataBuffer/SampleModel</code> pairs is * legitimate if the <code>SampleModel</code> objects have * the same number of bands, corresponding bands have the same number of * bits per sample, and the TransferTypes are the same. * <p> * <code>obj</code> must be a primitive array of type TransferType. * Otherwise, a <code>ClassCastException</code> is thrown. An * <code>ArrayIndexOutOfBoundsException</code> is thrown if the * coordinates are not in bounds, or if <code>obj</code> is not large * enough to hold the pixel data. * @param x, y the coordinates of the pixel location * @param obj a primitive array containing pixel data * @param data the <code>DataBuffer</code> containing the image data * @see #getDataElements(int, int, Object, DataBuffer) */ public void setDataElements(int x, int y, Object obj, DataBuffer data) { if ((x < 0) || (y < 0) || (x >= width) || (y >= height)) { throw new ArrayIndexOutOfBoundsException ("Coordinate out of bounds!"); } int type = getTransferType(); int bitnum = dataBitOffset + x * pixelBitStride; int index = y * scanlineStride + (bitnum / dataElementSize); int shift = dataElementSize - (bitnum & (dataElementSize-1)) - pixelBitStride; int element = data.getElem(index); element &= ~(bitMask << shift); switch(type) { case DataBuffer.TYPE_BYTE: byte[] barray = (byte[])obj; element |= ( ((int)(barray[0])&0xff) & bitMask) << shift; data.setElem(index, element); break; case DataBuffer.TYPE_USHORT: short[] sarray = (short[])obj; element |= ( ((int)(sarray[0])&0xffff) & bitMask) << shift; data.setElem(index, element); break; case DataBuffer.TYPE_INT: int[] iarray = (int[])obj; element |= (iarray[0] & bitMask) << shift; data.setElem(index, element); break; } } /** * Sets a pixel in the <code>DataBuffer</code> using an * <code>int</code> array for input. * <code>ArrayIndexOutOfBoundsException</code> is thrown if * the coordinates are not in bounds. * @param x, y the coordinates of the pixel location * @param iArray the input pixel in an <code>int</code> array * @param data the <code>DataBuffer</code> containing the image data * @see #getPixel(int, int, int[], DataBuffer) */ public void setPixel(int x, int y, int[] iArray, DataBuffer data) { if ((x < 0) || (y < 0) || (x >= width) || (y >= height)) { throw new ArrayIndexOutOfBoundsException ("Coordinate out of bounds!"); } int bitnum = dataBitOffset + x * pixelBitStride; int index = y * scanlineStride + (bitnum / dataElementSize); int shift = dataElementSize - (bitnum & (dataElementSize-1)) - pixelBitStride; int element = data.getElem(index); element &= ~(bitMask << shift); element |= (iArray[0] & bitMask) << shift; data.setElem(index,element); } public boolean equals(Object o) { if ((o == null) || !(o instanceof MultiPixelPackedSampleModel)) { return false; } MultiPixelPackedSampleModel that = (MultiPixelPackedSampleModel)o; return this.width == that.width && this.height == that.height && this.numBands == that.numBands && this.dataType == that.dataType && this.pixelBitStride == that.pixelBitStride && this.bitMask == that.bitMask && this.pixelsPerDataElement == that.pixelsPerDataElement && this.dataElementSize == that.dataElementSize && this.dataBitOffset == that.dataBitOffset && this.scanlineStride == that.scanlineStride; } // If we implement equals() we must also implement hashCode public int hashCode() { int hash = 0; hash = width; hash <<= 8; hash ^= height; hash <<= 8; hash ^= numBands; hash <<= 8; hash ^= dataType; hash <<= 8; hash ^= pixelBitStride; hash <<= 8; hash ^= bitMask; hash <<= 8; hash ^= pixelsPerDataElement; hash <<= 8; hash ^= dataElementSize; hash <<= 8; hash ^= dataBitOffset; hash <<= 8; hash ^= scanlineStride; return hash; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -