Android中RGB_565转BGR_565数据格式

RGB_565简介:
RGB_565是色彩压缩的一种方式,其通过不用透明率以及对RGB的相应位数进行省略。一个彩色图像由R G B三个分量组成,一个RGB565的每一个像素点数据为2Byte,即16位,那么从名字上就可看出来这16位中,高5位为R分量,中间6位为G分量,低5位为B分量。

在这里插入图片描述
还有一些相应的其它色彩压缩方式:
ALPHA_8 代表8位Alpha位图 ARGB_4444 代表16位ARGB位图 ARGB_8888 代表32位ARGB位图 RGB_565 代表16位RGB位图

A:透明度(Alpha) R:红色(Red) G:绿(Green) B:蓝(Blue)

  1. Config ARGB_8888:由4个8位组成,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位(4字节)
  2. Bitmap.Config ARGB_4444:由4个4位组成,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位 (2字节)
  3. Bitmap.Config RGB_565:没有透明度,R=5,G=6,B=5,,那么一个像素点占5+6+5=16位(2字节)
  4. Bitmap.Config ALPHA_8:每个像素占8位,只有透明度,没有颜色。

RGB_565转BGR_565数据格式的本质,是将高5位的R分量与低5位的B分量进行互换,话不多说上代码

public byte[] RGB565ToBGR565(Bitmap srcBitmap) {
    
    
        int bytes = srcBitmap.getByteCount();
        ByteBuffer buf = ByteBuffer.allocate(bytes);
        buf.rewind();
        buf.position(0);
        srcBitmap.copyPixelsToBuffer(buf);

        byte[] byteArray = buf.array();
        for (int i = 0; i < byteArray.length; ) {
    
    
            int temp1, temp2;
            //现将两字节数据进行互换
            temp1 = byteArray[i];
            temp2 = byteArray[i + 1];
            byteArray[i] = (byte) temp2;
            byteArray[i + 1] = (byte) temp1;
            //取出前5位
            temp1 = byteArray[i] & 0xF8;
            //取出后5位
            temp2 = byteArray[i + 1] & 0x1F;
            //后5位左移3位拼接后3位
            byteArray[i] = (byte) ((byteArray[i] & 0x07) | (temp2 << 3));
            //前5位右移3位拼接前3位
            byteArray[i + 1] = (byte) ((byteArray[i + 1] & 0xE0) | (temp1 >> 3));
            i += 2;
        }
        return byteArray;
    }

至此转换完成,RGB_888转BGR_888数据格式思路一样,只需要将相邻3个byte前后进行对调即可。

猜你喜欢

转载自blog.csdn.net/a307326984/article/details/131261941
565
今日推荐