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

📄 image.java

📁 用于移动设备上的java虚拟机源代码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * @(#)Image.java	1.52 02/09/06 @(#) * * Copyright (c) 1999-2002 Sun Microsystems, Inc.  All rights reserved. * PROPRIETARY/CONFIDENTIAL * Use is subject to license terms. */package javax.microedition.lcdui;import java.io.InputStream;import java.io.IOException;import javax.microedition.lcdui.game.Sprite;/** * The <code>Image</code> class is used to hold graphical image * data. <code>Image</code> * objects exist independently of the display device. They exist only in * off-screen memory and will not be painted on the display unless an explicit * command is issued by the application (such as within the * <code>paint()</code> method of * a <code>Canvas</code>) or when an <code>Image</code> object is * placed within a <code>Form</code> screen or an * <code>Alert</code> screen and that screen is made current. * * <p>Images are either <em>mutable</em> or <em>immutable</em> depending upon * how they are created. Immutable images are generally created by loading * image data from resource bundles, from files, or from the network. They may * not be modified once created. Mutable images are created as blank images * containing only white pixels. The application may render on a mutable image * by calling {@link #getGraphics} on the <code>Image</code> to obtain * a <code>Graphics</code> object * expressly for this purpose.</p> * * <p><code>Images</code> may be placed within <code>Alert</code>, * <code>Choice</code>, <code>Form</code>, or <code>ImageItem</code> * objects. * The high-level user interface implementation may need to update the display * at any time, without notifying the application.  In order to provide * predictable behavior, the high-level user interface * objects provide snapshot semantics for the image.  That is, when a mutable * image is placed within an <code>Alert</code>, <code>Choice</code>, * <code>Form</code>, or <code>ImageItem</code> object, * the effect is as if a snapshot is taken of its current contents.  This * snapshot is then used for all subsequent painting of the high-level user * interface component.  If the application modifies the contents of the * image, the application must update the component containing the image (for * example, by calling <code>ImageItem.setImage</code>) in order to * make the modified * contents visible.</p> * * <p>An immutable image may be created from a mutable image through the * use of the {@link #createImage(Image) createImage} method. It is possible * to create a mutable copy of an immutable image using a technique similar * to the following: </p> * * <TABLE BORDER="2"> * <TR> * <TD ROWSPAN="1" COLSPAN="1"> *    <pre><code> *    Image source; // the image to be copied     *    source = Image.createImage(...);     *    Image copy = Image *        .createImage(source.getWidth(), source.getHeight());         *    Graphics g = copy.getGraphics();     *    g.drawImage(source, 0, 0, TOP|LEFT);       </code></pre> * </TD> * </TR> * </TABLE> * <a name="alpha"></a> * <h3>Alpha Processing</h3> * * <p>Every pixel within a mutable image is always fully opaque.  Immutable * images may contain a combination of fully opaque pixels  * <code>(alpha = 2<sup><em>bitdepth</em></sup>&nbsp;-&nbsp;1)</code>, fully * transparent pixels (<code>alpha&nbsp;=&nbsp;0</code>), and * semitransparent pixels * (<code>0&nbsp;&lt;&nbsp;alpha&nbsp;&lt;&nbsp; * 2<sup><em>bitdepth</em></sup>&nbsp;-&nbsp;1</code>), * where <em>bitdepth</em> is the number of bits per sample in the source data. * * <p>Implementations must support storage, processing, and rendering of fully * opaque pixels and fully transparent pixels in immutable images.  When * creating an image from source data (whether from a PNG file or from an * array of ARGB data), a fully opaque pixel in the source data must always * result in a fully opaque pixel in the new image, and a fully transparent * pixel in the source data must always result in a fully transparent pixel in * the new image. * * <p>The required treatment of semitransparent pixel data depends upon * whether the implementation supports alpha blending at rendering time.  If * the implementation supports alpha blending, a semitransparent pixel in the * source data must result in a semitransparent pixel in the new image.  The * resulting alpha value may be modified to accommodate the number of levels * of semitransparency supported by the platform.  (See the {@link * Display#numAlphaLevels() Display.numAlphaLevels()} method.)  If an * implementation does not support alpha blending, any semitransparent pixels * in the source data must be replaced with fully transparent pixels in the * new image. * * <a name="PNG"></a> * <h3>PNG Image Format</h3> * * <p>Implementations are required to support images stored in the PNG format, * as specified by the <em>PNG (Portable Network Graphics) Specification, * Version 1.0.</em> All conforming MIDP implementations are also conformant * to the minimum set of requirements given by the <em>PNG Specification</em>. * MIDP implementations also must conform to additional requirements given * here with respect to handling of PNG images.  Note that the requirements * listed here take precedence over any conflicting recommendations given in * the <em>PNG Specification</em>.</p> * * <h4>Critical Chunks</h4> * * <p>All of the 'critical' chunks specified by PNG must be supported. The * paragraphs below describe these critical chunks.</p> * * <p>The IHDR chunk.  MIDP devices must handle the following values in * the IHDR chunk:</p> * * <ul> * <li>All positive values of width and height are supported; however, a * very large image may not be readable because of memory constraints. The * dimensions of the resulting <code>Image</code> object must match  * the dimensions of the PNG image.  That is, the values returned by * {@link #getWidth() getWidth()} and {@link #getHeight() getHeight()} * and the rendered width and height must * equal the width and height specified in the IHDR chunk.</li> * * <li>All color types are supported, although the appearance of the image will * be dependent on the capabilities of the device's screen.  Color types that * include alpha channel data are supported.</li> * * <li> For color types <code>4</code> &amp; <code>6</code> (grayscale * with alpha and RGB with alpha, * respectively) the alpha channel must be decoded. Any pixels with an alpha * value of zero must be treated as transparent.  Any pixels with an alpha * value of <code>255</code> (for images with <code>8</code> bits per * sample) or <code>65535</code> (for images with * <code>16</code> bits per sample) must be treated as opaque.  If * rendering with alpha * blending is supported, any pixels with intermediate alpha values must be * carried through to the resulting image.  If alpha blending is not * supported, any pixels with intermediate alpha values must be replaced with * fully transparent pixels.</li> * * <li>All bit depth values for the given color type are supported.</li> * * <li>Compression method <code>0</code> (deflate) is the only * supported compression method. * This method utilizes the &quot;zlib&quot; compression scheme, which * is also used for * jar files; thus, the decompression (inflate) code may be shared between the * jar decoding and PNG decoding implementations.  As noted in the PNG * specification, the compressed data stream may comprised internally of both * compressed and uncompressed (raw) data. * </li> * * <li>The filter method represents a series of encoding schemes that may be * used to optimize compression.  The PNG spec currently defines a single * filter method (method <code>0</code>) that is an adaptive filtering * scheme with five * basic filter types.  Filtering is essential for optimal compression since it * allows the deflate algorithm to exploit spatial similarities within the * image.  Therefore, MIDP devices must support all five filter types defined * by filter method <code>0</code>.</li> * * <li> MIDP devices are required to read PNG images that are encoded with * either interlace method <code>0</code> (None) or interlace method * <code>1</code> (Adam7).  Image * loading in MIDP is synchronous and cannot be overlapped with image * rendering, and so there is no advantage for an application to use interlace * method <code>1</code>.  Support for decoding interlaced images is * required for * compatibility with PNG and for the convenience of developers who may already * have interlaced images available.</li> * * </ul> * * <p>The PLTE chunk. Palette-based images must be supported.</p> * * <p>The IDAT chunk.  Image data may be encoded using any of the * <code>5</code> filter * types defined by filter method <code>0</code> (None, Sub, Up, * Average, Paeth).</p> * * <p>The IEND chunk.  This chunk must be found in order for the image to be * considered valid.</p> * * <h4>Ancillary Chunks</h4> * * <p>PNG defines several 'ancillary' chunks that may be present in a * PNG image but are not critical for image decoding.</p> * * <p>The tRNS chunk.  All implementations must support the tRNS chunk. * This chunk is used to implement transparency without providing alpha * channel data for each pixel. For color types <code>0</code> and * <code>2</code>, a particular * gray or RGB value is defined to be a transparent pixel.  In this case, the * implementation must treat pixels with this value as fully transparent. * Pixel value comparison must be based on the actual pixel values using the * original sample depth; that is, this comparison must be performed before * the pixel values are resampled to reflect the display capabilities * of the device. For color type <code>3</code> (indexed color), * <code>8</code>-bit alpha values are * potentially provided for each entry in the color palette.  In this case, * the implementation must treat pixels with an alpha value of * <code>0</code> as fully * transparent, and it must treat pixels with an alpha value of * <code>255</code> as fully * opaque.  If rendering with alpha blending is supported, any pixels with * intermediate alpha values must be carried through to the resulting image. * If alpha blending is not supported, any pixels with intermediate alpha * values must be replaced with fully transparent pixels.</p> * * <p>The implementation <em>may</em> (but is not required to) support * any of the other ancillary chunks. The implementation <em>must</em> * silently ignore any unsupported ancillary chunks that it encounters. * The currently defined optional ancillary chunks are:</p> * * <PRE> *    cHRM gAMA hIST iCCP iTXt pHYs *    sBIT sPLT sRGB tEXt tIME zTXt </PRE> * * <h3>Reference</h3> * * <p><em>PNG (Portable Network Graphics) Specification, Version 1.0.</em> * W3C Recommendation, October 1, 1996. http://www.w3.org/TR/REC-png.html. * Also available as RFC 2083, http://www.ietf.org/rfc/rfc2083.txt.</p> * @since MIDP 1.0 */public class Image {    /**     * Construct a new, empty Image     */    Image() {}    /**     * Creates a new, mutable image for off-screen drawing. Every pixel     * within the newly created image is white.  The width and height of the     * image must both be greater than zero.     *     * @param width the width of the new image, in pixels     * @param height the height of the new image, in pixels     * @return the created image     *     * @throws IllegalArgumentException if either <code>width</code> or     * <code>height</code> is zero or less     */    public static Image createImage(int width, int height) {        if (width <= 0 || height <= 0) {            throw new IllegalArgumentException();        }        // SYNC NOTE: Not accessing any shared data, no locking necessary        return new MutableImage(width, height);    }    /**     * Creates an immutable image from a source image.     * If the source image is mutable, an immutable copy is created and     * returned.  If the source image is immutable, the implementation may     * simply return it without creating a new image.  If an immutable source     * image contains transparency information, this information is copied to     * the new image unchanged.     *     * <p> This method is useful for placing the contents of mutable images     * into <code>Choice</code> objects.  The application can create     * an off-screen image     * using the     * {@link #createImage(int, int) createImage(w, h)}     * method, draw into it using a <code>Graphics</code> object     * obtained with the     * {@link #getGraphics() getGraphics()}     * method, and then create an immutable copy of it with this method.     * The immutable copy may then be placed into <code>Choice</code>     * objects. </p>     *     * @param source the source image to be copied     * @return the new, immutable image     *     * @throws NullPointerException if <code>source</code> is <code>null</code>     */    public static Image createImage(Image source) {        // SYNC NOTE: Not accessing any shared data, no locking necessary        return new ImmutableImage(source);    }    /**     * Creates an immutable image from decoded image data obtained from the     * named resource.  The name parameter is a resource name as defined by     * {@link Class#getResourceAsStream(String)     * Class.getResourceAsStream(name)}.  The rules for resolving resource      * names are defined in the     * <a href="../../../java/lang/package-summary.html">     * Application Resource Files</a> section of the     * <code>java.lang</code> package documentation.     *     * @param name the name of the resource containing the image data in one of     * the supported image formats     * @return the created image     * @throws NullPointerException if <code>name</code> is <code>null</code>     * @throws java.io.IOException if the resource does not exist,     * the data cannot     * be loaded, or the image data cannot be decoded     */    public static Image createImage(java.lang.String name)	throws java.io.IOException {        try {            // SYNC NOTE: Not accessing any shared data, no locking necessary            return new ImmutableImage(name);        } catch (IllegalArgumentException e) {            throw new java.io.IOException();        }    }    /**     * Creates an immutable image which is decoded from the data stored in     * the specified byte array at the specified offset and length. The data     * must be in a self-identifying image file format supported by the     * implementation, such as <a href="#PNG">PNG</A>.     *     * <p>The <code>imageoffset</code> and <code>imagelength</code>     * parameters specify a range of     * data within the <code>imageData</code> byte array. The     * <code>imageOffset</code> parameter     * specifies the     * offset into the array of the first data byte to be used. It must     * therefore lie within the range     * <code>[0..(imageData.length-1)]</code>. The     * <code>imageLength</code>     * parameter specifies the number of data bytes to be used. It must be a     * positive integer and it must not cause the range to extend beyond     * the end     * of the array. That is, it must be true that     * <code>imageOffset + imageLength &lt; imageData.length</code>. </p>     *     * <p> This method is intended for use when loading an     * image from a variety of sources, such as from     * persistent storage or from the network.</p>     *     * @param imageData the array of image data in a supported image format     * @param imageOffset the offset of the start of the data in the array     * @param imageLength the length of the data in the array     *     * @return the created image     * @throws ArrayIndexOutOfBoundsException if <code>imageOffset</code>     * and <code>imageLength</code>     * specify an invalid range     * @throws NullPointerException if <code>imageData</code> is     * <code>null</code>     * @throws IllegalArgumentException if <code>imageData</code> is incorrectly     * formatted or otherwise cannot be decoded     */    public static Image createImage(byte[] imageData, int imageOffset,                                    int imageLength) {        if (imageOffset < 0 || imageOffset >= imageData.length ||	    imageLength < 0 ||	    imageOffset + imageLength > imageData.length) {            throw new ArrayIndexOutOfBoundsException();

⌨️ 快捷键说明

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