Android/Java:将字节数组保存到文件 (.jpeg) [英] Android/Java: Saving a byte array to a file (.jpeg)

查看:69
本文介绍了Android/Java:将字节数组保存到文件 (.jpeg)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为Android开发一个应用程序,应用程序的一部分必须拍照并保存到SD卡.onPictureTaken 方法返回一个包含捕获图像数据的字节数组.

I am developing an application for Android, and part of the application has to takes pictures and save them to the SDcard. The onPictureTaken method returned a byte array with the data of the captured image.

我需要做的就是将字节数组保存到 .jpeg 图像文件中.我试图在 BitmapFactory.decodeByteArray(获取位图)的帮助下完成此操作,然后是 bImage.compress(到 OutputStream)、一个普通的 OutputStream 和一个 BufferedOutputStream.所有这三种方法似乎都给我带来了同样奇怪的错误.我的 Android 手机(8MP 摄像头和不错的处理器)似乎保存了照片(尺寸看起来正确),但方式已损坏(图像被切片并且每个切片都被移动;或者我只是得到了几乎水平的各种颜色的线条);奇怪的是,带有 5MP 摄像头和快速处理器的 Android 平板电脑似乎可以正确保存图像.

All I need to do is save the byte array into a .jpeg image file. I have attempted to do this with the help of BitmapFactory.decodeByteArray (to get a Bitmap) and then bImage.compress (to an OutputStream), a plain OutputStream, and a BufferedOutputStream. All three of these methods seem to give me the same weird bug. My Android phone (8MP camera and a decent processor), seems to save the photo (size looks correct), but in a corrupted way (the image is sliced and each slice is shifted; or I just get almost horizontal lines of various colors); and The weird thing is, that an Android tablet with a 5MP camera and a fast processor, seems to save the image correctly.

所以我想也许处理器跟不上保存大图像的速度,因为我在大约 3 张图片后得到了 OutOfMemory Exceptions(即使压缩质量为 40).但是内置的相机应用程序是如何做到这一点的,而且速度要快得多?我很确定(从调试中)OutputStream 写入所有数据(字节),它应该没问题,但它仍然损坏.

So I thought maybe the processor can't keep up with saving large images, because I got OutOfMemory Exceptions after about 3 pictures (even at compression quality of 40). But then how does the built in Camera app do it, and much faster too? I'm pretty sure (from debug) that the OutputStream writes all the data (bytes) and it should be fine, but it's still corrupted.

***简而言之,将字节数组保存到 jpeg 文件的最佳/最快方法(有效)是什么?

***In short, what is the best/fastest way (that works) to save a byte array to a jpeg file?

提前致谢,标记

我尝试过的代码(以及其他一些细微的变化):

code I've tried (and some other slight variations):

    try {
        Bitmap image = BitmapFactory.decodeByteArray(args, 0, args.length);
        OutputStream fOut = new FileOutputStream(externalStorageFile);
        long time = System.currentTimeMillis();
        image.compress(Bitmap.CompressFormat.JPEG,
                jpegQuality, fOut);
        System.out.println(System.currentTimeMillis() - time);
        fOut.flush();
        fOut.close();
    } catch (Exception e) {
    }

    try {
        externalStorageFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(externalStorageFile);
        fos.write(args);
        fos.flush();
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

推荐答案

我需要做的就是将字节数组保存到 .jpeg 图像文件中.

All I need to do is save the byte array into a .jpeg image file.

只需将其写入文件即可.它已经是JPEG格式了.这是一个演示此内容的示例应用程序.这是关键的代码段:

Just write it out to a file. It already is in JPEG format. Here is a sample application demonstrating this. Here is the key piece of code:

class SavePhotoTask extends AsyncTask<byte[], String, String> {
    @Override
    protected String doInBackground(byte[]... jpeg) {
      File photo=new File(Environment.getExternalStorageDirectory(), "photo.jpg");

      if (photo.exists()) {
            photo.delete();
      }

      try {
        FileOutputStream fos=new FileOutputStream(photo.getPath());

        fos.write(jpeg[0]);
        fos.close();
      }
      catch (java.io.IOException e) {
        Log.e("PictureDemo", "Exception in photoCallback", e);
      }

      return(null);
    }
}

这篇关于Android/Java:将字节数组保存到文件 (.jpeg)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆