📄 samplemodel.java
字号:
/* * @(#)SampleModel.java 1.35 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 abstract class defines an interface for extracting samples of pixels * in an image. All image data is expressed as a collection of pixels. * Each pixel consists of a number of samples. A sample is a datum * for one band of an image and a band consists of all samples of a * particular type in an image. For example, a pixel might contain * three samples representing its red, green and blue components. * There are three bands in the image containing this pixel. One band * consists of all the red samples from all pixels in the * image. The second band consists of all the green samples and * the remaining band consists of all of the blue samples. The pixel * can be stored in various formats. For example, all samples from * a particular band can be stored contiguously or all samples from a * single pixel can be stored contiguously. * <p> * Subclasses of SampleModel specify the types of samples they can * represent (e.g. unsigned 8-bit byte, signed 16-bit short, etc.) * and may specify how the samples are organized in memory. * In the Java 2D(tm) API, built-in image processing operators may * not operate on all possible sample types, but generally will work * for unsigned integral samples of 16 bits or less. Some operators * support a wider variety of sample types. * <p> * A collection of pixels is represented as a Raster, which consists of * a DataBuffer and a SampleModel. The SampleModel allows access to * samples in the DataBuffer and may provide low-level information that * a programmer can use to directly manipulate samples and pixels in the * DataBuffer. * <p> * This class is generally a fall back method for dealing with * images. More efficient code will cast the SampleModel to the * appropriate subclass and extract the information needed to directly * manipulate pixels in the DataBuffer. * * @see java.awt.image.DataBuffer * @see java.awt.image.Raster * @see java.awt.image.ComponentSampleModel * @see java.awt.image.PixelInterleavedSampleModel * @see java.awt.image.BandedSampleModel * @see java.awt.image.MultiPixelPackedSampleModel * @see java.awt.image.SinglePixelPackedSampleModel */public abstract class SampleModel{ /** Width in pixels of the region of image data that this SampleModel * describes. */ protected int width; /** Height in pixels of the region of image data that this SampleModel * describes. */ protected int height; /** Number of bands of the image data that this SampleModel describes. */ protected int numBands; /** Data type of the DataBuffer storing the pixel data. * @see java.awt.image.DataBuffer */ protected int dataType; static private native void initIDs(); static { ColorModel.loadLibraries(); initIDs(); } /** * Constructs a SampleModel with the specified parameters. * @param dataType The data type of the DataBuffer storing the pixel data. * @param w The width (in pixels) of the region of image data. * @param h The height (in pixels) of the region of image data. * @param numBands The number of bands of the image data. * @throws IllegalArgumentException if <code>w</code> or <code>h</code> * is not greater than 0 * @throws IllegalArgumentException if the product of <code>w</code> * and <code>h</code> is greater than * <code>Integer.MAX_VALUE</code> * @throws IllegalArgumentException if <code>dataType</code> is not * one of the supported data types */ public SampleModel(int dataType, int w, int h, int numBands) { float size = (float)w*h; if (w <= 0 || h <= 0) { throw new IllegalArgumentException("Width ("+w+") and height ("+ h+") must be > 0"); } if (size >= Integer.MAX_VALUE) { throw new IllegalArgumentException("Dimensions (width="+w+ " height="+h+") are too large"); } if (dataType < DataBuffer.TYPE_BYTE || (dataType > DataBuffer.TYPE_DOUBLE && dataType != DataBuffer.TYPE_UNDEFINED)) { throw new IllegalArgumentException("Unsupported dataType: "+ dataType); } if (numBands <= 0) { throw new IllegalArgumentException("Number of bands must be > 0"); } this.dataType = dataType; this.width = w; this.height = h; this.numBands = numBands; } /** Returns the width in pixels. * @return the width in pixels of the region of image data * that this <code>SampleModel</code> describes. */ final public int getWidth() { return width; } /** Returns the height in pixels. * @return the height in pixels of the region of image data * that this <code>SampleModel</code> describes. */ final public int getHeight() { return height; } /** Returns the total number of bands of image data. * @return the number of bands of image data that this * <code>SampleModel</code> describes. */ final public int getNumBands() { return numBands; } /** Returns the number of data elements needed to transfer a pixel * via the getDataElements and setDataElements methods. When pixels * are transferred via these methods, they may be transferred in a * packed or unpacked format, depending on the implementation of the * SampleModel. Using these methods, pixels are transferred as an * array of getNumDataElements() elements of a primitive type given * by getTransferType(). The TransferType may or may not be the same * as the storage DataType. * @return the number of data elements. * @see #getDataElements(int, int, Object, DataBuffer) * @see #getDataElements(int, int, int, int, Object, DataBuffer) * @see #setDataElements(int, int, Object, DataBuffer) * @see #setDataElements(int, int, int, int, Object, DataBuffer) * @see #getTransferType */ public abstract int getNumDataElements(); /** Returns the data type of the DataBuffer storing the pixel data. * @return the data type. */ final public int getDataType() { return dataType; } /** Returns the TransferType used to transfer pixels via the * getDataElements and setDataElements methods. When pixels * are transferred via these methods, they may be transferred in a * packed or unpacked format, depending on the implementation of the * SampleModel. Using these methods, pixels are transferred as an * array of getNumDataElements() elements of a primitive type given * by getTransferType(). The TransferType may or may not be the same * as the storage DataType. The TransferType will be one of the types * defined in DataBuffer. * @return the transfer type. * @see #getDataElements(int, int, Object, DataBuffer) * @see #getDataElements(int, int, int, int, Object, DataBuffer) * @see #setDataElements(int, int, Object, DataBuffer) * @see #setDataElements(int, int, int, int, Object, DataBuffer) * @see #getNumDataElements * @see java.awt.image.DataBuffer */ public int getTransferType() { return dataType; } /** * Returns the samples for a specified pixel in an int array, * one sample per array element. * ArrayIndexOutOfBoundsException may be thrown if the coordinates are * not in bounds. * @param x, y The coordinates of the pixel location * @param iArray If non-null, returns the samples in this array * @param data The DataBuffer containing the image data * @return the samples for the specified pixel. * @see #setPixel(int, int, int[], DataBuffer) * * @throws NullPointerException if data is null. * @throws ArrayIndexOutOfBoundsException if the coordinates are * not in bounds, or if iArray is too small to hold the output. */ public int[] getPixel(int x, int y, int iArray[], DataBuffer data) { int pixels[]; if (iArray != null) pixels = iArray; else pixels = new int[numBands]; for (int i=0; i<numBands; i++) { pixels[i] = getSample(x, y, i, data); } return pixels; } /** * Returns data for a single pixel in a primitive array of type * TransferType. For image data supported by the Java 2D API, this * will be one of DataBuffer.TYPE_BYTE, DataBuffer.TYPE_USHORT, * DataBuffer.TYPE_INT, DataBuffer.TYPE_SHORT, DataBuffer.TYPE_FLOAT, * or DataBuffer.TYPE_DOUBLE. Data may be returned in a packed format, * thus increasing efficiency for data transfers. 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 * SampleModel <code>sm1</code>, to DataBuffer <code>db2</code>, whose * storage layout is described by SampleModel <code>sm2</code>. * The transfer will generally be more efficient than using * getPixel/setPixel. * <pre> * SampleModel sm1, sm2; * DataBuffer db1, db2; * sm2.setDataElements(x, y, sm1.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 The X coordinate of the pixel location. * @param y The Y coordinate 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 elements for the specified pixel. * @see #getNumDataElements * @see #getTransferType * @see java.awt.image.DataBuffer * @see #setDataElements(int, int, Object, DataBuffer) * * @throws NullPointerException if data is null. * @throws ArrayIndexOutOfBoundsException if the coordinates are * not in bounds, or if obj is too small to hold the output. */ public abstract Object getDataElements(int x, int y, Object obj, DataBuffer data); /** * Returns the pixel data for the specified rectangle of pixels in a * primitive array of type TransferType. * For image data supported by the Java 2D API, this * will be one of DataBuffer.TYPE_BYTE, DataBuffer.TYPE_USHORT, * DataBuffer.TYPE_INT, DataBuffer.TYPE_SHORT, DataBuffer.TYPE_FLOAT, * or DataBuffer.TYPE_DOUBLE. Data may be returned in a packed format, * thus increasing efficiency for data transfers. 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 a rectangular * region of pixels from * DataBuffer <code>db1</code>, whose storage layout is described by * SampleModel <code>sm1</code>, to DataBuffer <code>db2</code>, whose * storage layout is described by SampleModel <code>sm2</code>. * The transfer will generally be more efficient than using * getPixels/setPixels. * <pre> * SampleModel sm1, sm2; * DataBuffer db1, db2; * sm2.setDataElements(x, y, w, h, sm1.getDataElements(x, y, w, * h, 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 The minimum X coordinate of the pixel rectangle. * @param y The minimum Y coordinate of the pixel rectangle. * @param w The width of the pixel rectangle. * @param h The height of the pixel rectangle. * @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 elements for the specified region of pixels. * @see #getNumDataElements * @see #getTransferType * @see #setDataElements(int, int, int, int, Object, DataBuffer) * @see java.awt.image.DataBuffer * * @throws NullPointerException if data is null. * @throws ArrayIndexOutOfBoundsException if the coordinates are * not in bounds, or if obj is too small to hold the output. */ public Object getDataElements(int x, int y, int w, int h, Object obj, DataBuffer data) { int type = getTransferType(); int numDataElems = getNumDataElements(); int cnt = 0; Object o = null; switch(type) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -