Java image conversion to RGB565

Posted by Vladimir on Stack Overflow See other posts from Stack Overflow or by Vladimir
Published on 2011-11-30T00:45:37Z Indexed on 2011/11/30 1:50 UTC
Read the original article Hit count: 450

Filed under:
|
|

I try to convert image to RGB565 format. I read this image:

        BufferedImage bufImg = ImageIO.read(imagePathFile);
        sendImg  = new BufferedImage(CONTROLLER_LCD_WIDTH/*320*/, CONTROLLER_LCD_HEIGHT/*240*/, BufferedImage.TYPE_USHORT_565_RGB);
        sendImg .getGraphics().drawImage(bufImg, 0, 0, CONTROLLER_LCD_WIDTH/*320*/, CONTROLLER_LCD_HEIGHT/*240*/, null);

Here is it:

picture before convertation

Then I convert it to RGB565:

        int numByte=0;
                byte[] OutputImageArray = new byte[CONTROLLER_LCD_WIDTH*CONTROLLER_LCD_HEIGHT*2];

                int i=0;
                int j=0;
                int len = OutputImageArray.length;

                for (i=0;i<CONTROLLER_LCD_WIDTH;i++) {
                    for (j=0;j<CONTROLLER_LCD_HEIGHT;j++) {

                        Color c = new Color(sendImg.getRGB(i, j));
                        int aRGBpix = sendImg.getRGB(i, j);
                        int alpha;
                        int red = c.getRed();
                        int green = c.getGreen();
                        int blue = c.getBlue();

                        //RGB888
                        red = (aRGBpix >> 16) & 0x0FF;
                        green = (aRGBpix >> 8) & 0x0FF;
                        blue = (aRGBpix >> 0) & 0x0FF; 
                        alpha = (aRGBpix >> 24) & 0x0FF;

                        //RGB565
                        red = red >> 3;
                        green = green >> 2;
                        blue = blue >> 3;                                


                        //A pixel is represented by a 4-byte (32 bit) integer, like so:
                        //00000000 00000000 00000000 11111111
                        //^ Alpha  ^Red     ^Green   ^Blue
                        //Converting to RGB565

                        short pixel_to_send = 0;
                        int pixel_to_send_int = 0;
                        pixel_to_send_int = (red << 11) | (green << 5) | (blue);
                        pixel_to_send = (short) pixel_to_send_int;


                        //dividing into bytes
                        byte byteH=(byte)((pixel_to_send >> 8) & 0x0FF);
                        byte byteL=(byte)(pixel_to_send & 0x0FF);

                        //Writing it to array - High-byte is second
                        OutputImageArray[numByte]=byteH;
                        OutputImageArray[numByte+1]=byteL;

                        numByte+=2;
                    }
                }

Then I try to restore this from resulting array OutputImageArray:

                i=0;
                j=0;                        
                numByte=0;
                BufferedImage NewImg = new BufferedImage(CONTROLLER_LCD_WIDTH, CONTROLLER_LCD_HEIGHT, BufferedImage.TYPE_USHORT_565_RGB);
                for (i=0;i<CONTROLLER_LCD_WIDTH;i++) {
                    for (j=0;j<CONTROLLER_LCD_HEIGHT;j++) {

                        int curPixel=0;
                        int alpha=0x0FF;
                        int red;
                        int green;
                        int blue; 

                        byte byteL=0;
                        byte byteH=0;

                        byteH = OutputImageArray[numByte];
                        byteL = OutputImageArray[numByte+1];

                        curPixel= (byteH << 8) | (byteL);

                        //RGB565
                        red = (curPixel >> (6+5)) & 0x01F;
                        green = (curPixel >> 5) & 0x03F;
                        blue = (curPixel) & 0x01F;

                        //RGB888
                        red = red << 3;
                        green = green << 2;
                        blue = blue << 3;                                

                        //aRGB
                        curPixel = 0;
                        curPixel = (alpha << 24) | (red << 16) | (green << 8) | (blue);

                        NewImg.setRGB(i, j, curPixel);
                        numByte+=2;

                    }
                } 

I output this restored image. But I see that it looks very poor.

enter image description here

I expected the lost of pictures quality. But as I thought, this picture has to have almost the same quality as the previous picture. - Is it right? Is my code right?

© Stack Overflow or respective owner

Related posts about java

Related posts about image