YUV_420_888是YUV_420的一个大类,android camera2的ImageReader中设置了YUV_420_888后具体返回数据U和V是单独处于不同平面还是相同平面交叉排列要看具体的设备了,一般来说pixelStride=1表示独占一个平面(一般Y平面就只有Y数据),pixelStride=2则表示U和V是交叉排列。

最近工作中发现ImageReader设置了特定尺寸后,实际返回的数据并不是之前设定的尺寸,所得非所设,玩我把。

比如我设置的分辨率是640*480

mImageReader2 = ImageReader.newInstance(640, 480,ImageFormat.YUV_420_888, /*maxImages*/2);
mImageReader2.setOnImageAvailableListener(mOnImageAvailableListener2, mBackgroundHandler);

但是返回的数据尺寸可能是1024*480,此时rowStride=1024,需要对数据进行裁剪才可以显示真实数据

public static byte[] getBytesFromImageAsType(Image image, int type) {try {//获取源数据,如果是YUV格式的数据planes.length = 3//plane[i]里面的实际数据可能存在byte[].length <= capacity (缓冲区总大小)final Image.Plane[] planes = image.getPlanes();LogUtil.d("getBytesFromImageAsType,type="+type+",,top="+image.getCropRect().top+",left="+image.getCropRect().left+",bottom="+image.getCropRect().bottom+",right="+image.getCropRect().right);//数据有效宽度,一般的,图片width <= rowStride,这也是导致byte[].length <= capacity的原因// 所以我们只取width部分int width = image.getWidth();int height = image.getHeight();//此处用来装填最终的YUV数据,需要1.5倍的图片大小,因为Y U V 比例为 4:1:1byte[] yuvBytes = new byte[width * height * ImageFormat.getBitsPerPixel(ImageFormat.YUV_420_888) / 8];//目标数组的装填到的位置int dstIndex = 0;//临时存储uv数据的byte uBytes[] = new byte[width * height / 4];byte vBytes[] = new byte[width * height / 4];int uIndex = 0;int vIndex = 0;int pixelsStride, rowStride;for (int i = 0; i < planes.length; i++) {pixelsStride = planes[i].getPixelStride();rowStride = planes[i].getRowStride();ByteBuffer buffer = planes[i].getBuffer();//如果pixelsStride==2,一般的Y的buffer长度=640*480,UV的长度=640*480/2-1//源数据的索引,y的数据是byte中连续的,u的数据是v向左移以为生成的,两者都是偶数位为有效数据byte[] bytes = new byte[buffer.capacity()];buffer.get(bytes);LogUtil.e("i="+i+",bytes.length="+bytes.length+",rowStride="+rowStride);int srcIndex = 0;if (i == 0) {//直接取出来所有Y的有效区域,也可以存储成一个临时的bytes,到下一步再copyfor (int j = 0; j < height; j++) {System.arraycopy(bytes, srcIndex, yuvBytes, dstIndex, width);srcIndex += rowStride;dstIndex += width;}LogUtil.e("i == 0,srcIndex="+srcIndex+",dstIndex="+dstIndex+",row="+rowStride);//ScreenCaptureUtil.dumpFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),"y.yuv").getAbsolutePath(),bytes);} else if (i == 1) {//根据pixelsStride取相应的数据for (int j = 0; j < height / 2; j++) {for (int k = 0; k < width / 2; k++) {uBytes[uIndex++] = bytes[srcIndex];srcIndex += pixelsStride;}if (pixelsStride == 2) {srcIndex += rowStride - width;} else if (pixelsStride == 1) {srcIndex += rowStride - width / 2;}}LogUtil.d("srcIndex="+srcIndex+",uIndex="+uIndex);} else if (i == 2) {//根据pixelsStride取相应的数据for (int j = 0; j < height / 2; j++) {for (int k = 0; k < width / 2; k++) {vBytes[vIndex++] = bytes[srcIndex];srcIndex += pixelsStride;}if (pixelsStride == 2) {srcIndex += rowStride - width;} else if (pixelsStride == 1) {srcIndex += rowStride - width / 2;}}LogUtil.d("srcIndex="+srcIndex+",bytes.length="+bytes.length+",vIndex="+vIndex);}}image.close();//根据要求的结果类型进行填充switch (type) {case YUV420P://  System.arraycopy(uBytes, 0, yuvBytes, dstIndex, uBytes.length);System.arraycopy(vBytes, 0, yuvBytes, dstIndex , vBytes.length);break;case YUV420SP:for (int i = 0; i < vBytes.length; i++) {yuvBytes[dstIndex++] = uBytes[i];yuvBytes[dstIndex++] = vBytes[i];}break;case NV21:for (int i = 0; i < vBytes.length; i++) {yuvBytes[dstIndex++] = vBytes[i];yuvBytes[dstIndex++] = uBytes[i];}break;}return yuvBytes;} catch (final Exception e) {if (image != null) {image.close();}LogUtil.d( e.toString());}return null;
}

demo

YUV_420_888数据裁剪相关推荐

  1. 遥感影像去背景 之 数据裁剪

    遥感影像去背景 之 数据裁剪 之前,在 ENVI 软件中做了处理以后,会出现背景颜色,影响了后续制图. 于是尝试了在 Arcgis 软件中把背景改为No date形式 但是感觉存在误差,需要的图像与背 ...

  2. 借助ENVI软件,使用shp数据裁剪不规则影像问题

    借助ENVI软件,使用shp数据裁剪不规则影像问题 1.首先得到shp数据,可以在envi中勾画或者从其他平台获取. 2.在toolbox上搜索subset,选择subset data via ROI ...

  3. InSAR之数据裁剪和DEM拼接

    哨兵数据裁剪,SAR坐标系下的裁剪 只是记录了自己的处理过程 参考了ENVI技术殿堂的博客 http://blog.sina.com.cn/s/blog_764b1e9d0102xbw8.html 先 ...

  4. cdo (Climate Data Operators ) 常用命令介绍:(查看文件信息、多文件合并、数据裁剪、数据插值、数据计算。。)

    cdo介绍 : 一款极其强大方便的通过命令行进行气象数据处理与分析的软件,全称为:Climate Data Operators (CDO) CDO is a command line suite fo ...

  5. 关于SBAS-InSAR中数据裁剪的问题

    在沉降检测中,往往会对区域的时序SAR数据进行测算,目前研究中多使用哨兵数据,但是哨兵数据是条带数据,下载下来的区域会很大,所以需要裁剪.裁剪是SBAS-InSAR中的不说核心环节吧,也是非常非常重要 ...

  6. 使用SHP数据批量裁剪TIF图像并转为JPG格式

    问题描述 已有数据:1张大范围的遥感影像和1张裁剪为同一大小的shp数据 使用工具:ArcPy 实现目标: 1.shp数据按照属性分块输出 2.使用shp数据批量裁剪遥感影像,将影像裁剪为小块的tif ...

  7. ArcGIS中矢量裁剪栅格影像及影像合并【附练习数据下载】

    关于栅格影像数据的裁剪跟合并我们之前发过很多相关教程,工作中小助手经常用的软件是ArcGIS和Global Mapper 关于Global Mapper相关裁切技巧大家可以看之前发过的一篇→Globa ...

  8. gis 数据框裁剪_ArcGIS中裁剪工具的使用

    应约讲下裁剪.数据裁剪是经常使用的一个工具,工具说明也直接明了,隐藏功能他是不是说的,今天具体讲讲怎么用. 1.分析工具-提取分析-裁剪,启动裁剪工具. 2.将数据选中后,进行裁剪.输入要素此时不做任 ...

  9. DEM数据全国各省的裁剪与分享(30m、90m、250m、1000m)

    1.简介: 数字高程模型(Digital Elevation Model),简称DEM,是通过有限的地形高程数据实现对地面地形的数字化模拟. 这次分享的数据是全国34个省份的DEM裁剪数据,一共有6期 ...

最新文章

  1. 远程手机测试机房的建立
  2. 如何在window系统VS中设置boost编程环境
  3. Mybatisの常见面试题
  4. 【华为云技术分享】区块链与数据库如何结合?
  5. 势逼 React Native,跨平台开发框架 Flutter 很凶猛 | 码书
  6. 清楚form表单数据的便捷jQuery之法
  7. Oracle 触发器详解
  8. 最新版Eclipse下载及安装(详细)
  9. 黑客攻防技术宝典(六)
  10. iPhone--卡贴是什么
  11. 苹果Mac怎样清除dns缓存?
  12. java 订单号生成器
  13. 压电式雨量传感器数字感知降雨量
  14. 【考研数学高数部分】无穷级数
  15. kali 运行wifite时遇到的问题及解决办法
  16. 【两周快速入门pr】熟稔常用操作,提高剪辑效率
  17. PyQt5:布局,pushbutton按钮,radiobutton按钮,lableImage设置图片的基本使用方法
  18. ”你谁啊?“ ”我CPU啊,你刚才还看我呢。“
  19. 有一种程序员的浪漫叫做,有程序为你宕过机
  20. 十年经验建模师!给你3d建模学习的十条铁律,请收藏

热门文章

  1. OS课程 ucore_lab1实验报告
  2. googletest 学习笔记
  3. 戴尔笔记本电脑XPS15-9560混盘更换成SM961与SATA3固盘的步骤和方法
  4. CV 经典主干网络 (Backbone) 系列: 开篇
  5. 2019秋招|从春招到秋招,Java岗经验总结(收获AT)
  6. 全球与中国椎弓根螺钉固定市场深度研究分析报告
  7. 遥感(4):卫星遥感图像处理
  8. 计算机专业英语容易挂科吗,大学英语专业容易挂科吗
  9. 抖音小视频、千图网图片等多平台的微航去水印微信小程序工具解析
  10. LVGL V8之Event bubbling