⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bandedsamplemodel.java

📁 JAVA基本类源代码,大家可以学习学习!
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * @(#)BandedSampleModel.java	1.33 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. *//* **************************************************************** ****************************************************************** ****************************************************************** *** COPYRIGHT (c) Eastman Kodak Company, 1997 *** As  an unpublished  work pursuant to Title 17 of the United *** States Code.  All rights reserved. ****************************************************************** ****************************************************************** ******************************************************************/package java.awt.image;/**  *  This class represents image data which is stored in a band interleaved *  fashion and for *  which each sample of a pixel occupies one data element of the DataBuffer. *  It subclasses ComponentSampleModel but provides a more efficent *  implementation for accessing band interleaved image data than is provided *  by ComponentSampleModel.  This class should typically be used when working *  with images which store sample data for each band in a different bank of the *  DataBuffer. Accessor methods are provided so that image data can be *  manipulated directly. Pixel stride is the number of *  data array elements between two samples for the same band on the same *  scanline. The pixel stride for a BandedSampleModel is one. *  Scanline stride is the number of data array elements between *  a given sample and the corresponding sample in the same column of the next *  scanline.  Band offsets denote the number *  of data array elements from the first data array element of the bank *  of the DataBuffer holding each band to the first sample of the band. *  The bands are numbered from 0 to N-1. *  Bank indices denote the correspondence between a bank of the data buffer *  and a band of image data.  This class supports  *  {@link DataBuffer#TYPE_BYTE TYPE_BYTE}, *  {@link DataBuffer#TYPE_USHORT TYPE_USHORT}, *  {@link DataBuffer#TYPE_SHORT TYPE_SHORT}, *  {@link DataBuffer#TYPE_INT TYPE_INT}, *  {@link DataBuffer#TYPE_FLOAT TYPE_FLOAT}, and *  {@link DataBuffer#TYPE_DOUBLE TYPE_DOUBLE} datatypes */public final class BandedSampleModel extends ComponentSampleModel{    /**     * Constructs a BandedSampleModel with the specified parameters.     * The pixel stride will be one data element.  The scanline stride     * will be the same as the width.  Each band will be stored in     * a separate bank and all band offsets will be zero.     * @param dataType  The data type for storing samples.     * @param w 	The width (in pixels) of the region of     *                  image data described.      * @param h 	The height (in pixels) of the region of image     *                  data described.     * @param numBands  The number of bands for the image data.     * @throws IllegalArgumentException if <code>dataType</code> is not     *         one of the supported data types     */    public BandedSampleModel(int dataType, int w, int h, int numBands) {	super(dataType, w, h, 1, w,              BandedSampleModel.createIndicesArray(numBands),              BandedSampleModel.createOffsetArray(numBands));    }    /**     * Constructs a BandedSampleModel with the specified parameters.      * The number of bands will be inferred from the lengths of the     * bandOffsets bankIndices arrays, which must be equal.  The pixel     * stride will be one data element.     * @param dataType  The data type for storing samples.     * @param w 	The width (in pixels) of the region of     *                  image data described.     * @param h 	The height (in pixels) of the region of     *                  image data described.     * @param scanlineStride The line stride of the of the image data.     * @param bankIndices The bank index for each band.     * @param bandOffsets The band offset for each band.     * @throws IllegalArgumentException if <code>dataType</code> is not     *         one of the supported data types     */    public BandedSampleModel(int dataType,			     int w, int h,			     int scanlineStride,			     int bankIndices[],                             int bandOffsets[]) {	super(dataType, w, h, 1,scanlineStride, bankIndices, bandOffsets);    }    /**     * Creates a new BandedSampleModel with the specified     * width and height.  The new BandedSampleModel will have the same     * number of bands, storage data type, and bank indices     * as this BandedSampleModel.  The band offsets will be compressed     * such that the offset between bands will be w*pixelStride and     * the minimum of all of the band offsets is zero.     * @param w the width of the resulting <code>BandedSampleModel</code>     * @param h the height of the resulting <code>BandedSampleModel</code>     * @return a new <code>BandedSampleModel</code> with the specified     *         width and height.     * @throws IllegalArgumentException if <code>w</code> or      *         <code>h</code> equals either     *         <code>Integer.MAX_VALUE</code> or     *         <code>Integer.MIN_VALUE</code>     * @throws IllegalArgumentException if <code>dataType</code> is not     *         one of the supported data types     */    public SampleModel createCompatibleSampleModel(int w, int h) {        int[] bandOffs;        if (numBanks == 1) {            bandOffs = orderBands(bandOffsets, w*h);        }        else {            bandOffs = new int[bandOffsets.length];        }        SampleModel sampleModel =             new BandedSampleModel(dataType, w, h, w, bankIndices, bandOffs);	return sampleModel;    }    /**     * Creates a new BandedSampleModel with a subset of the bands of this     * BandedSampleModel.  The new BandedSampleModel can be     * used with any DataBuffer that the existing BandedSampleModel     * can be used with.  The new BandedSampleModel/DataBuffer     * combination will represent an image with a subset of the bands     * of the original BandedSampleModel/DataBuffer combination.     * @throws RasterFormatException if the number of bands is greater than     *                               the number of banks in this sample model.     * @throws IllegalArgumentException if <code>dataType</code> is not     *         one of the supported data types      */    public SampleModel createSubsetSampleModel(int bands[]) {	if (bands.length > bankIndices.length)	    throw new RasterFormatException("There are only " +					    bankIndices.length +					    " bands");	int newBankIndices[] = new int[bands.length];	int newBandOffsets[] = new int[bands.length];	for (int i=0; i<bands.length; i++) {	    newBankIndices[i] = bankIndices[bands[i]];	    newBandOffsets[i] = bandOffsets[bands[i]];        }        return new BandedSampleModel(this.dataType, width, height,				     this.scanlineStride,				     newBankIndices, newBandOffsets);    }    /**     * Creates a DataBuffer that corresponds to this BandedSampleModel,     * The DataBuffer's data type, number of banks, and size     * will be consistent with this BandedSampleModel.     * @throws IllegalArgumentException if <code>dataType</code> is not     *         one of the supported types.     */    public DataBuffer createDataBuffer() {        DataBuffer dataBuffer = null;	int size = scanlineStride * height;        switch (dataType) {        case DataBuffer.TYPE_BYTE:            dataBuffer = new DataBufferByte(size, numBands);            break;        case DataBuffer.TYPE_USHORT:            dataBuffer = new DataBufferUShort(size, numBands);            break;        case DataBuffer.TYPE_SHORT:            dataBuffer = new DataBufferShort(size, numBands);            break;        case DataBuffer.TYPE_INT:            dataBuffer = new DataBufferInt(size, numBands);            break;        case DataBuffer.TYPE_FLOAT:            dataBuffer = new DataBufferFloat(size, numBands);            break;        case DataBuffer.TYPE_DOUBLE:            dataBuffer = new DataBufferDouble(size, numBands);            break;        default:            throw new IllegalArgumentException("dataType is not one " +                "of the supported types.");        }        return dataBuffer;    }    /**      * Returns data for a single pixel in a primitive array of type     * TransferType.  For a BandedSampleModel, this will be the same     * as the data type, and samples will be returned one per array     * element.  Generally, obj     * should be passed in as null, so that the Object will be created     * automatically and will be of the right primitive data type.     * <p>     * The following code illustrates transferring data for one pixel from     * DataBuffer <code>db1</code>, whose storage layout is described by     * BandedSampleModel <code>bsm1</code>, to DataBuffer <code>db2</code>,     * whose storage layout is described by     * BandedSampleModel <code>bsm2</code>.     * The transfer will generally be more efficient than using     * getPixel/setPixel.     * <pre>     * 	     BandedSampleModel bsm1, bsm2;     *	     DataBufferInt db1, db2;     * 	     bsm2.setDataElements(x, y, bsm1.getDataElements(x, y, null, db1),     *                            db2);     * </pre>     * Using getDataElements/setDataElements to transfer between two     * DataBuffer/SampleModel pairs is legitimate if the SampleModels have     * the same number of bands, corresponding bands have the same number of     * bits per sample, and the TransferTypes are the same.     * <p>     * If obj is non-null, it should be a primitive array of type TransferType.     * Otherwise, a ClassCastException is thrown.  An     * ArrayIndexOutOfBoundsException may be thrown if the coordinates are     * not in bounds, or if obj is non-null and is not large enough to hold     * the pixel data.     * @param x,&nbsp;y The coordinates of the pixel location     * @param obj       If non-null, a primitive array in which to return     *                  the pixel data.     * @param data      The DataBuffer containing the image data.     * @return the data for the specified pixel.     * @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 numDataElems = getNumDataElements();	int pixelOffset = y*scanlineStride + x;	switch(type) {	case DataBuffer.TYPE_BYTE:	    byte[] bdata;	    if (obj == null) {		bdata = new byte[numDataElems];            } else {		bdata = (byte[])obj;            }	    for (int i=0; i<numDataElems; i++) {		bdata[i] = (byte)data.getElem(bankIndices[i],                                              pixelOffset + bandOffsets[i]);	    }	    obj = (Object)bdata;	    break;	case DataBuffer.TYPE_USHORT:        case DataBuffer.TYPE_SHORT:            	    short[] sdata;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -