/**将abgr转换为argb**/
public static int[] getFrameARGB() {
int data[] = getFrame();
byte transBlue;
long disTime = System.currentTimeMillis();
for(int i = 0; i < data.length; i++) {
//abgr --> argb
transBlue = (byte) (data[i] >> 16); //保存蓝色
data[i] &= 0xFF00FFFF; //清除蓝色
data[i] |= (data[i] << 16 & 0x00FF0000); //红色位移到蓝色处
data[i] &= 0xFFFFFF00; //清理原本的红色
data[i] |= (transBlue & 0x000000FF); //放入之前存的蓝色
}
disTime = System.currentTimeMillis() - disTime;
Log.i("getFrameARGB", disTime + " ms");
return data;
}
没有额外数组,只靠一个中间变量实现颜色数组(int数组)原地置换
截取1920*1080个像素的同时进行颜色转换:
/**将abgr 1080p帧转换为argb**/
public static int[] get1080FrameARGB() {
int data[] = getFrame();
int result[] = new int[1920 * 1080];
long disTime = System.currentTimeMillis();
for(int i = 0; i < result.length; i++) {
//abgr --> argb
result[i] = (data[i] & 0xFF00FF00 //alpha和green排列一致直接或运算取值
| data[i] >> 16 & 0x000000FF //blue位移16bit到最后一字节,或运算保存到最后一字节
| data[i] << 16 & 0x00FF0000); //red位移16bit到第二个字节,或运算保存到第二个字节
}
disTime = System.currentTimeMillis() - disTime;
Log.i("get1080FrameARGB", disTime + " ms");
return result;
}
现在只是单线程下进行,在1080p画面上只需要50毫秒左右就可以完全整个画面的转换,如果用并行可以更快,或者能利用GPU加速就更更快了,现在只是写一下自己对于像素颜色转换的基本思考。