web-dev-qa-db-ja.com

Android / Java:バイト配列をファイル(.jpeg)に保存する

Android用のアプリケーションを開発していますが、アプリケーションの一部で写真を撮ってSDカードに保存する必要があります。 onPictureTakenメソッドは、キャプチャされた画像のデータを含むバイト配列を返しました。

必要なことは、バイト配列を.jpegイメージファイルに保存することだけです。私はBitmapFactory.decodeByteArray(ビットマップを取得する)を使用してこれを実行しようとし、次にbImage.compress(OutputStreamを使用)、プレーンなOutputStream、およびBufferedOutputStreamを使用しました。これら3つの方法はすべて、私に同じ奇妙なバグを与えているようです。私のAndroid電話(8MPカメラとまともなプロセッサ)、写真を保存するようです(サイズは正しいように見えます)が、破損した方法(画像がスライスされ、各スライスがシフトされます;またはさまざまな色のほぼ水平線を取得します);そして奇妙なことは、Android 5MPカメラと高速プロセッサを搭載したタブレットは、画像を正しく保存しているようです。

約3枚の写真(圧縮品質40であっても)の後にOutOfMemory例外が発生したため、プロセッサが大きな画像の保存に対応できない可能性があります。しかし、組み込みのカメラアプリはどのようにそれを行いますか? OutputStreamがすべてのデータ(バイト)を書き込むことは(デバッグから)かなり確信していますが、問題ないはずですが、まだ破損しています。

***要するに、バイト配列をjpegファイルに保存するための最良/最速の方法(動作する)は何ですか?

事前に感謝、マーク

私が試したコード(および他のいくつかのわずかなバリエーション):

    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();
    }
27
Mark

必要なことは、バイト配列を.jpegイメージファイルに保存することだけです。

ファイルに書き出すだけです。すでにJPEG形式です。 これを示すサンプルアプリケーションです 。重要なコードは次のとおりです。

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);
    }
}
54
CommonsWare

このコードは、byte [] ...から画像をストレージに保存するのに最適です。ここでの「image」は、byte [] ....関数のパラメーターとして「byte [] image」として取得されることに注意してください。

    File photo=new File(Environment.getExternalStorageDirectory(), "photo.jpg");

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

    try {
        FileOutputStream fos=new FileOutputStream(photo.getPath());
        Toast.makeText(this, photo.getPath(), Toast.LENGTH_SHORT).show();
        fos.write(image);
        fos.close();
    }
    catch (Java.io.IOException e) {
        Log.e("PictureDemo", "Exception in photoCallback", e);
    }
}
0
Ali Raza