android实时滤镜的效率问题

android的市面上关于照片的产品,多数都不带实时滤镜(实时滤镜是对预览图进行处理)。可能实时滤镜需要用OpenGL ES 2.0进行处理图片,而2.2之前的android没法使用这个功能。

实时滤镜分成几个步骤:

  1. 获取预览图片数据(YUV格式)
  2. 将YUV格式的数据转换成RGB格式(或者将YUV数据简单提取,传入GPU,让GPU做RGB转换)
  3. 对原图的RGB数据进行滤镜算法
这里说的效率问题就是指的yuv数据转换到rgb数据的过程。我的机器one x获取每个预览图(720*720)的时间在70ms左右,如果处理预览数据并传入cpu的时间大于70ms,就是我们的代码有延迟。所以要保证这个时间在70ms之内。
第一种做法:用YuvImage.compressToJpeg()转换
不知道为什么系统没有提供别的方法,这个方法不但将yuv数据转换成了rgp数据,还进行了数据压缩。这样很耗时,虽然调用系统代码,但是这个过程还包括了压缩jpeg和解压jpeg数据。在这里完全没用,白白浪费资源。只是代码非常简单。
第二种做法是写java代码做转换。效率比第一种方法高,代码复杂了一些,因为要写转换代码。
第三种做法是用native代码做转换,转换的效率是用java转换的2倍,这时的时间就控制在了70ms以内。添加c代码会增加代码复杂性,我在这里还遇到了内存泄漏问题。
第四种方法是,将yuv数据中的y分量和uv分量提取出来,做成bitmap数据传入gpu,然后gpu进行运算。由于我要做的东西中包括虚化,所以gpu在虚化的时候要重复算很多数据,这里有可能会让gpu渲染产生延迟,但,实际上gpu的延迟并没有表现出来。而简单的数据分离也只用了50ms左右。速度应该是最快的,但是代码最复杂。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值