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)
- Config ARGB_8888:由4个8位组成,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位(4字节)
- Bitmap.Config ARGB_4444:由4个4位组成,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位 (2字节)
- Bitmap.Config RGB_565:没有透明度,R=5,G=6,B=5,,那么一个像素点占5+6+5=16位(2字节)
- 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前后进行对调即可。