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

📄 textureloader.java

📁 JAVA3D矩陈的相关类
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
     /**     * Choose the correct ImageComponent and Texture format for the given     * image     */    private void chooseFormat(BufferedImage image) {        switch (image.getType()) {            case BufferedImage.TYPE_4BYTE_ABGR :              case BufferedImage.TYPE_INT_ARGB :                imageComponentFormat = ImageComponent.FORMAT_RGBA;                textureFormat = Texture.RGBA;                break;            case BufferedImage.TYPE_3BYTE_BGR :            case BufferedImage.TYPE_INT_BGR:            case BufferedImage.TYPE_INT_RGB:                                imageComponentFormat = ImageComponent.FORMAT_RGB;                textureFormat = Texture.RGB;                break;            case BufferedImage.TYPE_CUSTOM:                if (is4ByteRGBAOr3ByteRGB(image)) {                    SampleModel sm = image.getSampleModel();                    if (sm.getNumBands() == 3) {                        //System.out.println("ChooseFormat Custom:TYPE_4BYTE_ABGR");                        imageComponentFormat = ImageComponent.FORMAT_RGB;                        textureFormat = Texture.RGB;                    }                    else {                        imageComponentFormat = ImageComponent.FORMAT_RGBA;                        //System.out.println("ChooseFormat Custom:TYPE_3BYTE_BGR");                        textureFormat = Texture.RGBA;                    }                }                break;            default :                // System.err.println("Unoptimized Image Type "+image.getType());                imageComponentFormat = ImageComponent.FORMAT_RGBA;                textureFormat = Texture.RGBA;                break;        }    }       private boolean is4ByteRGBAOr3ByteRGB(RenderedImage ri) {        boolean value = false;        int i;        int biType = getImageType(ri);        if (biType != BufferedImage.TYPE_CUSTOM)            return false;        ColorModel cm = ri.getColorModel();        ColorSpace cs = cm.getColorSpace();        SampleModel sm = ri.getSampleModel();        boolean isAlphaPre = cm.isAlphaPremultiplied();        int csType = cs.getType();        if ( csType == ColorSpace.TYPE_RGB) {            int numBands = sm.getNumBands();            if (sm.getDataType() == DataBuffer.TYPE_BYTE) {                if (cm instanceof ComponentColorModel &&                    sm instanceof PixelInterleavedSampleModel) {                    PixelInterleavedSampleModel csm = 				(PixelInterleavedSampleModel) sm;                    int[] offs = csm.getBandOffsets();                    ComponentColorModel ccm = (ComponentColorModel)cm;                    int[] nBits = ccm.getComponentSize();                    boolean is8Bit = true;                    for (i=0; i < numBands; i++) {                        if (nBits[i] != 8) {                            is8Bit = false;                            break;                        }                    }                    if (is8Bit &&                        offs[0] == 0 &&                        offs[1] == 1 &&                        offs[2] == 2) {                        if (numBands == 3) {                            value = true;                        }                        else if (offs[3] == 3 && !isAlphaPre) {                            value = true;                        }                    }                }            }        }        return value;    }         private int getImageType(RenderedImage ri) {        int imageType = BufferedImage.TYPE_CUSTOM;        int i;        if (ri instanceof BufferedImage) {            return ((BufferedImage)ri).getType();        }        ColorModel cm = ri.getColorModel();        ColorSpace cs = cm.getColorSpace();        SampleModel sm = ri.getSampleModel();        int csType = cs.getType();        boolean isAlphaPre = cm.isAlphaPremultiplied();        if ( csType != ColorSpace.TYPE_RGB) {            if (csType == ColorSpace.TYPE_GRAY &&                cm instanceof ComponentColorModel) {                if (sm.getDataType() == DataBuffer.TYPE_BYTE) {                    imageType = BufferedImage.TYPE_BYTE_GRAY;                } else if (sm.getDataType() == DataBuffer.TYPE_USHORT) {                    imageType = BufferedImage.TYPE_USHORT_GRAY;                }            }        }        // RGB , only interested in BYTE ABGR and BGR for now        // all others will be copied to a buffered image        else {            int numBands = sm.getNumBands();            if (sm.getDataType() == DataBuffer.TYPE_BYTE) {                if (cm instanceof ComponentColorModel &&                    sm instanceof PixelInterleavedSampleModel) {                    PixelInterleavedSampleModel csm = 				(PixelInterleavedSampleModel) sm;                    int[] offs = csm.getBandOffsets();                    ComponentColorModel ccm = (ComponentColorModel)cm;                    int[] nBits = ccm.getComponentSize();                    boolean is8Bit = true;                    for (i=0; i < numBands; i++) {                        if (nBits[i] != 8) {                            is8Bit = false;                            break;                        }                    }                    if (is8Bit &&                        offs[0] == numBands-1 &&                        offs[1] == numBands-2 &&                        offs[2] == numBands-3) {                        if (numBands == 3) {                            imageType = BufferedImage.TYPE_3BYTE_BGR;                        }                        else if (offs[3] == 0) {                            imageType = (isAlphaPre                                         ? BufferedImage.TYPE_4BYTE_ABGR_PRE                                         : BufferedImage.TYPE_4BYTE_ABGR);                        }                    }                }            }        }        return imageType;    }             // initialize appropriate format for ImageComponent and Texture    private void parseFormat(String format) {         if (format==null)            return;                 if (format.equals("RGBA")) {            imageComponentFormat = ImageComponent.FORMAT_RGBA;            textureFormat = Texture.RGBA;        } else if (format.equals("RGBA4")) {                                              imageComponentFormat = ImageComponent.FORMAT_RGBA4;            textureFormat = Texture.RGBA;        } else if (format.equals("RGB5_A1")) {                                             imageComponentFormat = ImageComponent.FORMAT_RGB5_A1;            textureFormat = Texture.RGBA;        } else if (format.equals("RGB")) {             imageComponentFormat = ImageComponent.FORMAT_RGB;            textureFormat = Texture.RGB;        } else if (format.equals("RGB4")) {            imageComponentFormat = ImageComponent.FORMAT_RGB4;            textureFormat = Texture.RGB;        } else if (format.equals("RGB5")) {                                              imageComponentFormat = ImageComponent.FORMAT_RGB5;            textureFormat = Texture.RGB;        } else if (format.equals("R3_G3_B2")) {                                          imageComponentFormat = ImageComponent.FORMAT_R3_G3_B2;            textureFormat = Texture.RGB;         } else if (format.equals("LUM8_ALPHA8")) {            imageComponentFormat = ImageComponent.FORMAT_LUM8_ALPHA8;            textureFormat = Texture.LUMINANCE_ALPHA;        } else if (format.equals("LUM4_ALPHA4")) {            imageComponentFormat = ImageComponent.FORMAT_LUM4_ALPHA4;            textureFormat = Texture.LUMINANCE_ALPHA;               } else if (format.equals("LUMINANCE")) {            imageComponentFormat = ImageComponent.FORMAT_CHANNEL8;            textureFormat = Texture.LUMINANCE;         } else if (format.equals("ALPHA")) {            imageComponentFormat = ImageComponent.FORMAT_CHANNEL8;            textureFormat = Texture.ALPHA;        }    }    // return a scaled image of given width and height    private BufferedImage getScaledImage(BufferedImage origImage,                                         int width, int height) {        int origW = origImage.getWidth();        int origH = origImage.getHeight();        float xScale = (float)width/(float)origW;        float yScale = (float)height/(float)origH;	return (getScaledImage(origImage, xScale, yScale));    }    // return a scaled image of given x and y scale    private BufferedImage getScaledImage(BufferedImage origImage,                                         float xScale, float yScale) {        // System.err.println("(1) origImage " + origImage);        // If the image is already the requested size, no need to scale        if (xScale == 1.0f && yScale == 1.0f)            return origImage;        else {            int scaleW = (int)(origImage.getWidth() * xScale + 0.5);            int scaleH = (int)(origImage.getHeight() * yScale + 0.5);            int origImageType = origImage.getType();            BufferedImage scaledImage;            WritableRaster wr;            if (origImageType != BufferedImage.TYPE_CUSTOM) {                WritableRaster origWr = origImage.getRaster();                wr = origWr.createCompatibleWritableRaster(0, 0, scaleW, scaleH);                scaledImage = new BufferedImage(scaleW, scaleH, origImageType);            } else {                int numComponents = origImage.getSampleModel().getNumBands();                int[] bandOffset = new int[numComponents];                int[] nBits = new int[numComponents];                for (int ii=0; ii < numComponents; ii++) {                    bandOffset[ii] = ii;                    nBits[ii] = 8;                }                                wr = java.awt.image.Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,                        scaleW, scaleH,                        scaleW * numComponents, numComponents,                        bandOffset, null);                int imageType;                                switch (numComponents) {                    case 1:                        imageType = BufferedImage.TYPE_BYTE_GRAY;                        break;                    case 3:                        imageType = BufferedImage.TYPE_3BYTE_BGR;                        break;                    case 4:                        imageType = BufferedImage.TYPE_4BYTE_ABGR;                        break;                    default:                        throw new ImageException("Illegal number of bands : " + numComponents);                                        }                                scaledImage = new BufferedImage(scaleW, scaleH, imageType);            }                        scaledImage.setData(wr);            java.awt.Graphics2D g2 = scaledImage.createGraphics();            AffineTransform at = AffineTransform.getScaleInstance(xScale,                    yScale);            g2.transform(at);            g2.drawImage(origImage, 0, 0, null);            return scaledImage;        }    }    private int computeLog(int value) {        int i = 0;        if (value == 0) return -1;        for (;;) {            if (value == 1)                 return i;            value >>= 1;	    i++;        }    }    private int getClosestPowerOf2(int value) {	if (value < 1)	    return value;		int powerValue = 1;	for (;;) {	    powerValue *= 2;	    if (value < powerValue) {		// Found max bound of power, determine which is closest		int minBound = powerValue/2;		if ((powerValue - value) >		    (value - minBound))		    return minBound;		else		    return powerValue;	    }	}    }}

⌨️ 快捷键说明

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