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

📄 imageutil.java

📁 JAVA 所有包
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
                                  ((binaryDataArray[b++] & 0xFF) << 16) |                                  ((binaryDataArray[b++] & 0xFF) << 8) |                                  (binaryDataArray[b++] & 0xFF));                        xRemaining -= 32;                    }                    int shift = 24;                    while(xRemaining > 0) {                        data[i] |=                            (int)((binaryDataArray[b++] & 0xFF) << shift);                        shift -= 8;                        xRemaining -= 8;                    }                    eltOffset += lineStride;                }            }        } else { // bitOffset != 0            int stride = (rectWidth + 7)/8;            int offset = 0;            if(dataBuffer instanceof DataBufferByte) {                byte[] data = ((DataBufferByte)dataBuffer).getData();                if((bitOffset & 7) == 0) {                    for(int y = 0; y < rectHeight; y++) {                        System.arraycopy(binaryDataArray, offset,                                         data, eltOffset,                                         stride);                        offset += stride;                        eltOffset += lineStride;                    }                } else { // bitOffset % 8 != 0                    int rightShift = bitOffset & 7;                    int leftShift = 8 - rightShift;                    int leftShift8 = 8 + leftShift;		    int mask = (byte)(255<<leftShift);		    int mask1 = (byte)~mask;                    for(int y = 0; y < rectHeight; y++) {                        int i = eltOffset;                        int xRemaining = rectWidth;                        while(xRemaining > 0) {                            byte datum = binaryDataArray[b++];                            if (xRemaining > leftShift8) {				// when all the bits in this BYTE will be set				// into the data buffer.                                data[i] = (byte)((data[i] & mask ) |                                    ((datum&0xFF) >>> rightShift));                                data[++i] = (byte)((datum & 0xFF) << leftShift);                            } else if (xRemaining > leftShift) {				// All the "leftShift" high bits will be set				// into the data buffer.  But not all the				// "rightShift" low bits will be set.				data[i] = (byte)((data[i] & mask ) |				    ((datum&0xFF) >>> rightShift));				i++;				data[i] =				    (byte)((data[i] & mask1) | ((datum & 0xFF) << leftShift));			    }			    else {				// Less than "leftShift" high bits will be set.				int remainMask = (1 << leftShift - xRemaining) - 1;                                data[i] =                                    (byte)((data[i] & (mask | remainMask)) |				    (datum&0xFF) >>> rightShift & ~remainMask);                            }                            xRemaining -= 8;                        }                        eltOffset += lineStride;                    }                }            } else if(dataBuffer instanceof DataBufferShort ||                      dataBuffer instanceof DataBufferUShort) {                short[] data = dataBuffer instanceof DataBufferShort ?                    ((DataBufferShort)dataBuffer).getData() :                    ((DataBufferUShort)dataBuffer).getData();		int rightShift = bitOffset & 7;		int leftShift = 8 - rightShift;                int leftShift16 = 16 + leftShift;		int mask = (short)(~(255 << leftShift));		int mask1 = (short)(65535 << leftShift);		int mask2 = (short)~mask1;                for(int y = 0; y < rectHeight; y++) {                    int bOffset = bitOffset;		    int xRemaining = rectWidth;                    for(int x = 0; x < rectWidth;			x += 8, bOffset += 8, xRemaining -= 8) {                        int i = eltOffset + (bOffset >> 4);                        int mod = bOffset & 15;                        int datum = binaryDataArray[b++] & 0xFF;                        if(mod <= 8) {			    // This BYTE is set into one SHORT			    if (xRemaining < 8) {				// Mask the bits to be set.				datum &= 255 << 8 - xRemaining;			    }                            data[i] = (short)((data[i] & mask) | (datum << leftShift));                        } else if (xRemaining > leftShift16) {			    // This BYTE will be set into two SHORTs                            data[i] = (short)((data[i] & mask1) | ((datum >>> rightShift)&0xFFFF));                            data[++i] =                                (short)((datum << leftShift)&0xFFFF);                        } else if (xRemaining > leftShift) {			    // This BYTE will be set into two SHORTs;			    // But not all the low bits will be set into SHORT			    data[i] = (short)((data[i] & mask1) | ((datum >>> rightShift)&0xFFFF));			    i++;			    data[i] =			        (short)((data[i] & mask2) | ((datum << leftShift)&0xFFFF));			} else {			    // Only some of the high bits will be set into			    // SHORTs			    int remainMask = (1 << leftShift - xRemaining) - 1;			    data[i] = (short)((data[i] & (mask1 | remainMask)) |				      ((datum >>> rightShift)&0xFFFF & ~remainMask));			}                    }                    eltOffset += lineStride;                }            } else if(dataBuffer instanceof DataBufferInt) {                int[] data = ((DataBufferInt)dataBuffer).getData();                int rightShift = bitOffset & 7;		int leftShift = 8 - rightShift;		int leftShift32 = 32 + leftShift;		int mask = 0xFFFFFFFF << leftShift;		int mask1 = ~mask;                for(int y = 0; y < rectHeight; y++) {                    int bOffset = bitOffset;		    int xRemaining = rectWidth;                    for(int x = 0; x < rectWidth;			x += 8, bOffset += 8, xRemaining -= 8) {                        int i = eltOffset + (bOffset >> 5);                        int mod = bOffset & 31;                        int datum = binaryDataArray[b++] & 0xFF;                        if(mod <= 24) {			    // This BYTE is set into one INT			    int shift = 24 - mod;			    if (xRemaining < 8) {				// Mask the bits to be set.				datum &= 255 << 8 - xRemaining;			    }                            data[i] = (data[i] & (~(255 << shift))) | (datum << shift);                        } else if (xRemaining > leftShift32) {			    // All the bits of this BYTE will be set into two INTs                            data[i] = (data[i] & mask) | (datum >>> rightShift);                            data[++i] = datum << leftShift;                        } else if (xRemaining > leftShift) {			    // This BYTE will be set into two INTs;			    // But not all the low bits will be set into INT                            data[i] = (data[i] & mask) | (datum >>> rightShift);			    i++;                            data[i] = (data[i] & mask1) | (datum << leftShift);                        } else {			    // Only some of the high bits will be set into INT			    int remainMask = (1 << leftShift - xRemaining) - 1;			    data[i] = (data[i] & (mask | remainMask)) |				      (datum >>> rightShift & ~remainMask);			}                    }                    eltOffset += lineStride;                }            }        }    }    /**     * Copies data into the packed array of the <code>Raster</code>     * from an array of unpacked data of the form returned by     * <code>getUnpackedBinaryData()</code>.     *     * <p> If the data are binary, then the target bit will be set if     * and only if the corresponding byte is non-zero.     *     * @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 void setUnpackedBinaryData(byte[] bdata,                                             WritableRaster 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 k = 0;        if(dataBuffer instanceof DataBufferByte) {            byte[] data = ((DataBufferByte)dataBuffer).getData();            for(int y = 0; y < rectHeight; y++) {                int bOffset = eltOffset*8 + bitOffset;                for(int x = 0; x < rectWidth; x++) {                    if(bdata[k++] != (byte)0) {                        data[bOffset/8] |=                            (byte)(0x00000001 << (7 - bOffset & 7));                    }                    bOffset++;                }                eltOffset += lineStride;            }        } else if(dataBuffer instanceof DataBufferShort ||                  dataBuffer instanceof DataBufferUShort) {            short[] data = dataBuffer instanceof DataBufferShort ?                ((DataBufferShort)dataBuffer).getData() :                ((DataBufferUShort)dataBuffer).getData();            for(int y = 0; y < rectHeight; y++) {                int bOffset = eltOffset*16 + bitOffset;                for(int x = 0; x < rectWidth; x++) {                    if(bdata[k++] != (byte)0) {                        data[bOffset/16] |=                            (short)(0x00000001 <<                                    (15 - bOffset % 16));                    }                    bOffset++;                }                eltOffset += lineStride;            }        } else if(dataBuffer instanceof DataBufferInt) {            int[] data = ((DataBufferInt)dataBuffer).getData();            for(int y = 0; y < rectHeight; y++) {                int bOffset = eltOffset*32 + bitOffset;                for(int x = 0; x < rectWidth; x++) {                    if(bdata[k++] != (byte)0) {                        data[bOffset/32] |=                            (int)(0x00000001 <<                                  (31 - bOffset % 32));                    }                    bOffset++;                }                eltOffset += lineStride;            }        }    }    public static boolean isBinary(SampleModel sm) {        return sm instanceof MultiPixelPackedSampleModel &&            ((MultiPixelPackedSampleModel)sm).getPixelBitStride() == 1 &&            sm.getNumBands() == 1;    }    public static ColorModel createColorModel(ColorSpace colorSpace,                                              SampleModel sampleModel) {        ColorModel colorModel = null;        if(sampleModel == null) {            throw new IllegalArgumentException(I18N.getString("ImageUtil1"));        }        int numBands = sampleModel.getNumBands();        if (numBands < 1 || numBands > 4) {            return null;        }        int dataType = sampleModel.getDataType();        if (sampleModel instanceof ComponentSampleModel) {            if (dataType < DataBuffer.TYPE_BYTE ||                //dataType == DataBuffer.TYPE_SHORT ||                dataType > DataBuffer.TYPE_DOUBLE) {                return null;            }            if (colorSpace == null)                colorSpace =                    numBands <= 2 ?                    ColorSpace.getInstance(ColorSpace.CS_GRAY) :                    ColorSpace.getInstance(ColorSpace.CS_sRGB);            boolean useAlpha = (numBands == 2) || (numBands == 4);            int transparency = useAlpha ?                               Transparency.TRANSLUCENT : Transparency.OPAQUE;            boolean premultiplied = false;

⌨️ 快捷键说明

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