一种颜色直接顺序置换的简单算法展示——ABGR to ARGB

    /**将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加速就更更快了,现在只是写一下自己对于像素颜色转换的基本思考。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值