首页 > 移动平台 > 详细

android 相机预览保存图片

时间:2020-07-07 20:26:09      阅读:96      评论:0      收藏:0      [点我收藏+]

记录之前没太注意的细节问题。

之前相机拍照保存图片都是用的提供onPictureCallback这个回调,很想当然的没考虑过什么格式啊,

这次需要从预览数组中保存图片才意识不只是把byte[]直接写文件保存下来,保存的图片无法查看;

在摄像头预览的时候,我们可以通过实现接口PreviewCallback方法可以得到每帧的视频数据,

但获取的数据不能直接将数据保存为Bitmap,因为该预览帧数据使用android默认的NV21格式,

NV21格式其实是一种YUV格式,需要进行转换为最常见的就是rgb和jpeg类型;

public Bitmap bytes2Bimap(byte[] b) {
    if (b.length != 0) {
        return BitmapFactory.decodeByteArray(b, 0, b.length);
    } else {
        return null;
    }
}

public Bitmap decodeToBitMap(byte[] data, Camera camera) {
    try {
        //格式成YUV格式
        YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, camera.getParameters().getPreviewSize().width,
                camera.getParameters().getPreviewSize().height, null);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        yuvimage.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width,
                camera.getParameters().getPreviewSize().height), 100, baos);
        Bitmap bitmap = bytes2Bimap(baos.toByteArray());
        saveImage(bitmap);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}


public void saveImage(Bitmap bmp) {
    File appDir = new File(Environment.getExternalStorageDirectory(), "HDPicture");
    if (!appDir.exists()) {
        appDir.mkdir();
    }
    String fileName = System.currentTimeMillis() + ".jpg";
    File file = new File(appDir, fileName);
    try {
        FileOutputStream fos = new FileOutputStream(file);
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

android 相机预览保存图片

原文:https://www.cnblogs.com/skyeblogs/p/13262216.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!