如何在位图中转换 NV21 图像格式?

Posted

技术标签:

【中文标题】如何在位图中转换 NV21 图像格式?【英文标题】:How to convert NV21 image format in bitmap? 【发布时间】:2014-10-26 13:40:24 【问题描述】:

我正在从相机获取预览数据。它是 NV21 格式。我想将预览保存到 SD 卡,即位图中。我的代码正在获取图像并保存它,但在图库中它没有被捕获预览。它只是黑色矩形,这是代码。

    public void processImage() 

    Bitmap bitmap = null;

    if (flag == true) 

        flag = false;

        if (mCamera != null) 

            Camera.Parameters parameters = mCamera.getParameters();

            int imageFormat = parameters.getPreviewFormat();

            if (imageFormat == ImageFormat.NV21) 
                Toast.makeText(mContext, "Format: NV21", Toast.LENGTH_SHORT)
                        .show();
                int w = parameters.getPreviewSize().width;
                int h = parameters.getPreviewSize().height;

                YuvImage yuvImage = new YuvImage(mData, imageFormat, w, h,
                        null);

                Rect rect = new Rect(0, 0, w, h);

                ByteArrayOutputStream baos = new ByteArrayOutputStream();

                yuvImage.compressToJpeg(rect, 100, baos);

                byte[] jData = baos.toByteArray();

                bitmap = BitmapFactory.decodeByteArray(jData, 0,
                        jData.length);
            

            else if (imageFormat == ImageFormat.JPEG
                    || imageFormat == ImageFormat.RGB_565) 

                Toast.makeText(mContext, "Format: JPEG||RGB_565",
                        Toast.LENGTH_SHORT).show();
                bitmap = BitmapFactory.decodeByteArray(mData, 0,
                        mData.length);
            
        

        if (bitmap != null) 
            saveImage(bitmap);
            Toast.makeText(mContext, "Image Saved", Toast.LENGTH_SHORT)
                    .show();
         else
            Toast.makeText(mContext, "Bitmap Null", Toast.LENGTH_SHORT)
                    .show();
    

【问题讨论】:

你找到解决方案了吗? 【参考方案1】:

如果您想保存 NV21 预览图像以在图库中查看,最简单的方法是从 NV21 字节数组创建一个 YuvImage,然后在文件输出流中将其压缩为 JPEG,如下面的代码:

FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory() + "/imagename.jpg");
YuvImage yuvImage = new YuvImage(nv21bytearray, ImageFormat.NV21, width, height, null);
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, fos);
fos.close();

请注意,您可能希望更改保存图像的路径。

【讨论】:

以上是关于如何在位图中转换 NV21 图像格式?的主要内容,如果未能解决你的问题,请参考以下文章

从android相机的NV21格式中提取黑白图像

如何在位图 int 数组 (rgb565) 之间转换 UIImage

Android ImageReader 获取 NV21 格式?

C语言实现RGB packet格式转YUV(NV21)格式

如何使用 IPP 将 8 位灰度图像转换为 NV12(有限范围)色彩空间

X264使用流程文述