`
yixiandave
  • 浏览: 140312 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Android Yuv图像转jpg方法

阅读更多
这个日志拖了很久了,是我的毕业设计中碰到的一个需求。

首先视频硬编码MediaRecorder类并不适合做实时发送(不知道为什么博主的机器测试出来的mdat后面紧接着并不是网上所说的一个Int表示的场长度,而是连续8个3F预留字节位,努力很久后彻底放弃了MediaRecorder,改为实现Camera的onPreviewFrame方法)

Camera的onPreviewFrame会在每一帧取回一个字节数组,格式为YUV422(ImageFormat.NV21)
这种无压缩的图片格式是相当占用空间的(480x320分辨率可以达到200KB每张图的体积,10FPS的话就有2MB每秒的传输速率,如果要网络发送的话压力是非常大的),因此需要压缩。

在网上找到的方法基本是Yuv到RGB的方式,把Yuv的数据通过数学运算得到每个像素点的RGB编码,存入Bitmap对象,再调用Bitmap对象自带的压缩方法压为jpg图片。这种方法效率极低,一张480x320分辨率的图片有20万个字节,因此运算需要经过20万次循环,在博主的小米1上测试的结果是一张图需要400毫秒的处理时间,帧速被强行降低到了2.5FPS(onPreviewFrame在执行完成之前得到的数据会自动丢弃),单张图片还好说,如果是连续图片构成的视频流是不可能完成这种需求的。

在我一筹莫展之际发现了android.graphics包下面已经存在一个YuvImage类,可以将数据直接导入:
YuvImage image = new YuvImage(data,ImageFormat.NV21,IMG_WIDTH,IMG_HEIGHT,null);

这个构造方法有5个参数,第一个就是字节数组,第二个是格式信息,和相机配置的时候设置的previewFormat一致即可。第三、第四个不需要解释,就是图片的长宽信息(YUV格式没有储存图片的尺寸信息,最后一个博主也不知道是什么,总之给个null就可以了)。
然后很碰巧的是YuvImage有一个compressToJPEG()方法。
需要传入的参数有3个:一个Rect对象,包含图片的显示范围,一般是(0,0)到(width,height),也可以利用这个参数对图片进行切割;
第二个是质量因数,1-100内的整数;
第三个是一个OutputStream对象,会把结果输出到这个Stream。

实际测试80质量的480x320尺寸图片压缩只用了50ms,效率大大提高。

不过这种jpg图片似乎和传统jpg编码格式有差异,打开是可以正常打开的,而用FFMpeg压缩的时候显示是jpg-yuv的格式,也就是说直接将yuv以jpg格式压缩的。如果需要进一步转换可能依然需要转为RGB格式。
0
1
分享到:
评论
2 楼 asialee 2013-05-20  
楼主写的很好
1 楼 埃韦顿 2013-05-20  
                   

相关推荐

    苹果图像文件转jpg heic2jpg heic转jpg 源代码

    - **JPEG编码**:将解码后的图像数据重新编码为JPEG格式,这通常涉及色彩空间转换(如从YUV到RGB)、量化和熵编码。 - **保存JPEG文件**:最后,将编码后的JPEG数据写入新的文件,通常以.jpg或.jpeg为扩展名。 4....

    NV21、NV12、JPG互相转换python脚本

    NV21和NV12是YUV颜色空间的变种,广泛应用于视频编码和图像处理,而JPG则是最常见的有损压缩图像格式。 YUV色彩空间是一种为电视和数字视频设计的颜色模型,它将颜色分为亮度(Y)和两个色差分量(U和V)。NV21和NV...

    ffmpeg视频解码成YUV,JPG

    ffmpeg -f rawvideo -s WxH -pix_fmt yuv420p -i input.yuv output.jpg ``` 其中,`-s WxH`表示设置图像的宽度(W)和高度(H),确保与原始视频帧大小一致。 3. **对JPEG文件的处理** 解码得到的JPEG文件可以...

    YUV转为jpg图像的实现

    如果文件打开成功,则分配内存以存储YUV图像的Y分量和UV分量数据,并将UV分量初始化为中值(通常是128,因为U和V分量的中值对应的色彩为灰色)。 使用循环结构连续读取YUV文件的每一帧,将Y分量和UV分量的数据复制...

    android下v4l2拍摄jpg格式图片

    综上所述,"android下v4l2拍摄jpg格式图片"涉及到的技术环节包括V4L2接口操作,YUV数据处理,libjpeg库的移植与使用,JPEG编码流程,以及Android文件系统操作。每个环节都有其特定的技术挑战和优化策略,需要深入...

    Android形图像编程.docx

    ### Android基础图形图像编程知识点详解 #### 一、颜色表示法 在计算机图形学中,颜色表示法至关重要,尤其对于Android系统来说更是如此。本文档将详细介绍几种常用的颜色表示法及其在Android中的应用。 ##### ...

    Android人脸识别Demo竖屏YUV方向调整和图片保存(分享)

    通过这些方法,开发者可以在Android的人脸识别Demo中处理竖屏模式下的YUV图像,确保图像方向正确,并且可以保存图片进行后续的检查和调试。这些技术对于优化人脸识别的用户体验和提高识别准确性至关重要。

    Android camera2预览和取数据

    1. 使用`ImageReader`:创建一个`ImageReader`实例,设置需要的图像格式(如JPEG或YUV)、最大缓存帧数等。 2. 设置回调:通过`ImageReader.setOnImageAvailableListener()`注册监听器,当有新帧可用时,该监听器会...

    android ndk使用libjpeg

    综上所述,"android ndk使用libjpeg"涉及到Android NDK开发、原生库集成、JPEG图像处理、视频帧转静态图片等多个技术点。通过高效地使用libjpeg库,可以实现在移动设备上快速生成JPEG图片,满足实时性要求较高的应用...

    图片格式 NV21 转 RGB24 和 BMP图片源码(C语言)。

    NV21是Android系统中广泛使用的YUV420sp半压缩格式,而RGB24和BMP则是常见的位图格式。以下是关于这些知识点的详细解释: 1. **NV21格式**:NV21是一种YUV色彩空间的变种,属于YUV420sp类型。在这个格式中,每个...

    安卓Android源码——二维码识别源码.zip

    - **图像处理**:接收到的每一帧图像需要转换成适合处理的格式,如YUV或RGB。 - **检测二维码**:使用Zxing提供的BitmapSource对处理后的图像进行扫描,寻找可能存在的二维码。 - **解码**:找到二维码后,使用...

    ffmpeg-4.3.2-bin.rar

    描述中提到的“实现jpg生成nv12 nv21”,是指使用FFmpeg将JPEG图片格式转换为NV12和NV21这两种YUV格式的视频帧数据。 NV12和NV21是两种常见的YUV颜色空间的存储格式,它们被广泛用于视频编码和图像处理中,尤其是在...

    图片转换为视频

    在Android平台上将JPG图片转换成MP4格式的视频是一个常见的需求,这通常涉及到多媒体处理和编码技术。FFmpeg是一个强大的跨平台的命令行工具,它支持多种图像和音频格式的转换,包括将静态图片序列合并成视频。在这...

    基于Android和ZigBee的蔬菜大棚环境因子采集系统设计.pdf

    (2)嵌入式网关可接入CAM500A摄像头模块,将采集的YUV格式图像数据转为JPG格式,利用线程技术通过Socket通信将数据不断传输到Android手机端,实现实时监控;(3)能够实时监测蔬菜大棚环境情况,如大棚火灾、温度...

    Camera照相拍照实现

    在Android开发中,相机(Camera)是不可或缺的一部分,它允许用户捕获图像并进行各种操作。本教程将详细讲解如何实现在应用中实现照相拍照功能,包括照片的显示、保存本地、获取本地照片以及在Fragment中点击放大...

    模拟相机拍照的图片特效特效代码

    1. 图像捕获:使用设备的摄像头API(如iOS的AVFoundation或Android的Camera API)捕获原始图像数据。这一步是所有后续处理的基础。 2. 实时预览:通过设置摄像头预览层,用户可以在屏幕上看到实时的取景画面。这...

    Blast Extreme Protocol协议深度解析.pdf

    8. **高精色彩显示**:Blast Extreme HEVC支持YUV 4:4:4色彩格式,提供了高锐度色彩图片的支持,且HEVC相比H.264能更有效地利用带宽,进一步提升用户体验。 综上所述,Blast Extreme Protocol通过其先进的编码技术...

Global site tag (gtag.js) - Google Analytics