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

📄 imageutil.java

📁 JAVA 所有包
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
/* * @(#)ImageUtil.java	1.3 05/11/17 14:14:58 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.imageio.plugins.common;import java.awt.Point;import java.awt.Rectangle;import java.awt.Transparency;import java.awt.color.ColorSpace;import java.awt.image.BufferedImage;import java.awt.image.ColorModel;import java.awt.image.ComponentColorModel;import java.awt.image.ComponentSampleModel;import java.awt.image.DataBuffer;import java.awt.image.DataBufferByte;import java.awt.image.DataBufferInt;import java.awt.image.DataBufferShort;import java.awt.image.DataBufferUShort;import java.awt.image.DirectColorModel;import java.awt.image.IndexColorModel;import java.awt.image.MultiPixelPackedSampleModel;import java.awt.image.Raster;import java.awt.image.RenderedImage;import java.awt.image.SampleModel;import java.awt.image.SinglePixelPackedSampleModel;import java.awt.image.WritableRaster;import java.util.Arrays;//import javax.imageio.ImageTypeSpecifier;import javax.imageio.IIOException;import javax.imageio.IIOImage;import javax.imageio.ImageTypeSpecifier;import javax.imageio.ImageWriter;import javax.imageio.spi.ImageWriterSpi;public class ImageUtil {    /* XXX testing only    public static void main(String[] args) {        ImageTypeSpecifier bilevel =            ImageTypeSpecifier.createIndexed(new byte[] {(byte)0, (byte)255},                                             new byte[] {(byte)0, (byte)255},                                             new byte[] {(byte)0, (byte)255},                                             null, 1,                                             DataBuffer.TYPE_BYTE);        ImageTypeSpecifier gray =            ImageTypeSpecifier.createGrayscale(8, DataBuffer.TYPE_BYTE, false);        ImageTypeSpecifier grayAlpha =            ImageTypeSpecifier.createGrayscale(8, DataBuffer.TYPE_BYTE, false,                                               false);        ImageTypeSpecifier rgb =            ImageTypeSpecifier.createInterleaved(ColorSpace.getInstance(ColorSpace.CS_sRGB),                                                 new int[] {0, 1, 2},                                                 DataBuffer.TYPE_BYTE,                                                 false,                                                 false);        ImageTypeSpecifier rgba =            ImageTypeSpecifier.createInterleaved(ColorSpace.getInstance(ColorSpace.CS_sRGB),                                                 new int[] {0, 1, 2, 3},                                                 DataBuffer.TYPE_BYTE,                                                 true,                                                 false);        ImageTypeSpecifier packed =            ImageTypeSpecifier.createPacked(ColorSpace.getInstance(ColorSpace.CS_sRGB),                                            0xff000000,                                            0x00ff0000,                                            0x0000ff00,                                            0x000000ff,                                            DataBuffer.TYPE_BYTE,                                            false);        SampleModel bandedSM =            new java.awt.image.BandedSampleModel(DataBuffer.TYPE_BYTE,                                                 1, 1, 15);        System.out.println(createColorModel(bilevel.getSampleModel()));        System.out.println(createColorModel(gray.getSampleModel()));        System.out.println(createColorModel(grayAlpha.getSampleModel()));        System.out.println(createColorModel(rgb.getSampleModel()));        System.out.println(createColorModel(rgba.getSampleModel()));        System.out.println(createColorModel(packed.getSampleModel()));        System.out.println(createColorModel(bandedSM));    }    */    /**     * Creates a <code>ColorModel</code> that may be used with the     * specified <code>SampleModel</code>.  If a suitable     * <code>ColorModel</code> cannot be found, this method returns     * <code>null</code>.     *     * <p> Suitable <code>ColorModel</code>s are guaranteed to exist     * for all instances of <code>ComponentSampleModel</code>.     * For 1- and 3- banded <code>SampleModel</code>s, the returned     * <code>ColorModel</code> will be opaque.  For 2- and 4-banded     * <code>SampleModel</code>s, the output will use alpha transparency     * which is not premultiplied.  1- and 2-banded data will use a     * grayscale <code>ColorSpace</code>, and 3- and 4-banded data a sRGB     * <code>ColorSpace</code>. Data with 5 or more bands will have a     * <code>BogusColorSpace</code>.</p>     *     * <p>An instance of <code>DirectColorModel</code> will be created for     * instances of <code>SinglePixelPackedSampleModel</code> with no more     * than 4 bands.</p>     *     * <p>An instance of <code>IndexColorModel</code> will be created for     * instances of <code>MultiPixelPackedSampleModel</code>. The colormap     * will be a grayscale ramp with <code>1&nbsp;<<&nbsp;numberOfBits</code>     * entries ranging from zero to at most 255.</p>     *     * @return An instance of <code>ColorModel</code> that is suitable for     *         the supplied <code>SampleModel</code>, or <code>null</code>.     *     * @throws IllegalArgumentException  If <code>sampleModel</code> is     *         <code>null</code>.     */    public static final ColorModel createColorModel(SampleModel sampleModel) {        // Check the parameter.        if(sampleModel == null) {            throw new IllegalArgumentException("sampleModel == null!");        }        // Get the data type.        int dataType = sampleModel.getDataType();        // Check the data type        switch(dataType) {        case DataBuffer.TYPE_BYTE:        case DataBuffer.TYPE_USHORT:        case DataBuffer.TYPE_SHORT:        case DataBuffer.TYPE_INT:        case DataBuffer.TYPE_FLOAT:        case DataBuffer.TYPE_DOUBLE:            break;        default:            // Return null for other types.            return null;        }        // The return variable.        ColorModel colorModel = null;        // Get the sample size.        int[] sampleSize = sampleModel.getSampleSize();        // Create a Component ColorModel.        if(sampleModel instanceof ComponentSampleModel) {            // Get the number of bands.            int numBands = sampleModel.getNumBands();            // Determine the color space.            ColorSpace colorSpace = null;            if(numBands <= 2) {                colorSpace = ColorSpace.getInstance(ColorSpace.CS_GRAY);            } else if(numBands <= 4) {                colorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);            } else {                colorSpace = new BogusColorSpace(numBands);            }            boolean hasAlpha = (numBands == 2) || (numBands == 4);            boolean isAlphaPremultiplied = false;            int transparency = hasAlpha ?                Transparency.TRANSLUCENT : Transparency.OPAQUE;            colorModel = new ComponentColorModel(colorSpace,                                                 sampleSize,                                                 hasAlpha,                                                 isAlphaPremultiplied,                                                 transparency,                                                 dataType);        } else if (sampleModel.getNumBands() <= 4 &&                   sampleModel instanceof SinglePixelPackedSampleModel) {            SinglePixelPackedSampleModel sppsm =                (SinglePixelPackedSampleModel)sampleModel;            int[] bitMasks = sppsm.getBitMasks();            int rmask = 0;            int gmask = 0;            int bmask = 0;            int amask = 0;            int numBands = bitMasks.length;            if (numBands <= 2) {                rmask = gmask = bmask = bitMasks[0];                if (numBands == 2) {                    amask = bitMasks[1];                }            } else {                rmask = bitMasks[0];                gmask = bitMasks[1];                bmask = bitMasks[2];                if (numBands == 4) {                    amask = bitMasks[3];                }            }            int bits = 0;            for (int i = 0; i < sampleSize.length; i++) {                bits += sampleSize[i];            }            return new DirectColorModel(bits, rmask, gmask, bmask, amask);        } else if(sampleModel instanceof MultiPixelPackedSampleModel) {            // Load the colormap with a ramp.            int bitsPerSample = sampleSize[0];            int numEntries = 1 << bitsPerSample;            byte[] map = new byte[numEntries];            for (int i = 0; i < numEntries; i++) {                map[i] = (byte)(i*255/(numEntries - 1));            }            colorModel = new IndexColorModel(bitsPerSample, numEntries,                                             map, map, map);        }        return colorModel;    }    /**     * For the case of binary data (<code>isBinary()</code> returns     * <code>true</code>), return the binary data as a packed byte array.     * The data will be packed as eight bits per byte with no bit offset,     * i.e., the first bit in each image line will be the left-most of the     * first byte of the line.  The line stride in bytes will be     * <code>(int)((getWidth()+7)/8)</code>.  The length of the returned     * array will be the line stride multiplied by <code>getHeight()</code>     *     * @return the binary data as a packed array of bytes with zero offset     * of <code>null</code> if the data are not binary.     * @throws IllegalArgumentException if <code>isBinary()</code> returns     * <code>false</code> with the <code>SampleModel</code> of the     * supplied <code>Raster</code> as argument.     */    public static byte[] getPackedBinaryData(Raster raster,                                             Rectangle rect) {        SampleModel sm = raster.getSampleModel();        if(!isBinary(sm)) {            throw new IllegalArgumentException(I18N.getString("ImageUtil0"));        }        int rectX = rect.x;        int rectY = rect.y;        int rectWidth = rect.width;        int rectHeight = rect.height;        DataBuffer dataBuffer = raster.getDataBuffer();        int dx = rectX - raster.getSampleModelTranslateX();        int dy = rectY - raster.getSampleModelTranslateY();        MultiPixelPackedSampleModel mpp = (MultiPixelPackedSampleModel)sm;        int lineStride = mpp.getScanlineStride();        int eltOffset = dataBuffer.getOffset() + mpp.getOffset(dx, dy);        int bitOffset = mpp.getBitOffset(dx);        int numBytesPerRow = (rectWidth + 7)/8;        if(dataBuffer instanceof DataBufferByte &&           eltOffset == 0 && bitOffset == 0 &&           numBytesPerRow == lineStride &&           ((DataBufferByte)dataBuffer).getData().length ==           numBytesPerRow*rectHeight) {            return ((DataBufferByte)dataBuffer).getData();        }        byte[] binaryDataArray = new byte[numBytesPerRow*rectHeight];        int b = 0;        if(bitOffset == 0) {            if(dataBuffer instanceof DataBufferByte) {                byte[] data = ((DataBufferByte)dataBuffer).getData();                int stride = numBytesPerRow;                int offset = 0;                for(int y = 0; y < rectHeight; y++) {                    System.arraycopy(data, eltOffset,                                     binaryDataArray, offset,                                     stride);                    offset += stride;                    eltOffset += lineStride;                }            } else if(dataBuffer instanceof DataBufferShort ||                      dataBuffer instanceof DataBufferUShort) {

⌨️ 快捷键说明

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