将具有8BitARGB颜色空间的字节数组转换为BufferedImage.TYPE_4BYTE_ABGR时,哪个字节(Alpha,Red,Green,Blue)出错

时间:2015-12-16 06:33:35

标签: java image bufferedimage

我在8BitARGB的颜色空间中有图像字节数组,需要将此字节数组转换为 java.awt.BufferedImage 。 代码如下:

public void getImage(byte byteArray[]){
        int height = 1920;
        int width = 1080;
        ARGB_to_ABGR(byteArray);
        BufferedImage image1 = new BufferedImage(height, width, 
                BufferedImage.TYPE_4BYTE_ABGR);
        image1.getWritableTile(0, 0).setDataElements(0, 0, height, width, byteArray);
        java.io.File file = new java.io.File("amazing.png");
        try {
            ImageIO.write(image1, "jpg", file);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }

    /*
     * Swap the Red byte and Blue byte
     */
    public void ARGB_to_ABGR(byte byteArray[]){
        int length = byteArray.length;
        byte r = 0;
        byte b = 0;
        for(int i = 0; i < byteArray.length; i++){
            if(length % 4 == 0){
                //do nothing
            }else if(length % 4 == 1){
                r = byteArray[i];
            }else if(length % 4 == 2){
                //do nothing
            }else if(length % 4 == 3){
                b = byteArray[i];
                byteArray[i] = r;
                byteArray[i - 2] = b;
            }
        }
    }

原始图片如下: enter image description here

the amazing.png看起来像: enter image description here

我不认为原始字节数组有任何问题。为了快速调试,只是基于图像效果,任何人都可以告诉哪个字节(Alpha,红色,绿色,蓝色)是错误的?感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

ARGB_to_ABGR的代码中,您可能希望在i % 4处写length % 4。就像目前一样,我猜它根本就什么都不做。

答案 1 :(得分:1)

我认为@Henry是正确的,因为代码中只是一个简单的拼写错误。但是,我想提供一种替代的写作方式,这对我来说更容易阅读/理解,因此更容易出错。

我相信它也更快,因为它没有对索引进行测试。

此版本一次迭代输入字节数组一个像素(4个字节):

public void ARGB_to_ABGR(byte[] byteArray) {
    byte tempR = 0;
    for (int i = 0; i < byteArray.length; i += 4) {
        // For each iteration, simply swap R and B
        tempR = byteArray[i + 1];
        byteArray[i + 1] = byteArray[i + 3];
        byteArray[i + 3] = tempR;
    }
}