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();
}
必要なことは、バイト配列を.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);
}
}
このコードは、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);
}
}