Android 颜色编码跟字节的关系(rgb,rgba,yuv,yuvr)

本文探讨了Android中常见的RGB、RGBA、YUV、YUVR四种颜色编码方式,尤其是在照片和视频处理中的应用,特别是与JNI代码的配合。以RGB24为例,解释了每个像素占用字节数及其影响到的图像数据存储空间计算,如宽度乘以高度乘以每个像素的字节数。同时提到了Android摄像头预览数据通常采用的NV21格式,在进行格式转换时如何计算所需存储空间。

      上述4种是常见的几种颜色编码方法,常使用在照片或者视频处理代码中,多配合jni 代码使用。如果碰到诸如下面列举的这种代码:

//声明部分
 private byte[] yuv = null;
 private byte[] yuvr = null;
 private byte[] rgb = null;
 private byte[] rgba = null;



 yuv = new byte[frame.size.width * frame.size.height * 3 / 2];
 yuvr = new byte[frame.size.width * frame.size.height * 3 / 2];
 rgb = new byte[frame.size.width * frame.size.height * 3];
 rgba = new byte[frame.size.width * frame.size.height * 4];

        这个代码的意思其实是:定义视频的一帧或者是图片(frame)所有像素所占存储空间(Byte数组)的大小。

       上面代码的rgb指的是标准rgb24,对于rgb24,每个像素为3个字节,所以整个帧图所占的byte数组的总大小是宽 X 高 X 3。如果用的是32的rgb,那么每个像素就变成了4个字节,上面的代码就不是乘3,而是乘4了,其他的都同理理解。

        android手机摄像头采集的预览数据,一般都是yuv格式下的nv21格式,所以每当涉及格式转换的情况,上面贴的代码都是转换前必不可少的,比如项目中添加so库,调用jni方法将nv21的格式转换成1420格式

if(rgb == null)
        {
            yuv = new byte[frame.size.width * frame.size.height * 3 / 2];
            yuvr = new byte[frame.size.width * frame.size.height * 3 / 2];
            rgb = new byte[frame.size.width * frame.size.height * 3];
            rgba = new byte[frame.size.width * frame.size.height * 4];
        }
        MainActivity.vpxCoder.NV21ToI420(frame.image, yuv, frame.size.width, frame.size.height);

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值