2011-12-16 7 views
3

大きなビットマップを扱うことに関する質問はほとんどありません。この問題についてこれまで説明したトピックでは答えが見つかりませんでした。Androidカメラアプリケーション - 大きなビットマップの処理

私は、私はこのようhardware.Cameraクラスで画像を撮るネクサスSがあります。

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageData, Camera c) { 
     if (imageData != null) { 
      BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options); 
     } 
    } 
}; 

画像は、decodeByteArrayクラッシュの時点でのアプリケーション5MPixelsであることに注意して有します。 だから私は、このクラッシュ場合、どのようにAndroidのカメラアプリで行われると思った。

私は、ソースとそこに私はそこmakeBitmap方法を見つけ、ダウンロード: http://www.java2s.com/Open-Source/Android/android-platform-apps/Gallery/com/android/camera/Util.java.htm

をだから私はmakeBitmapを使用するために私のコールバックを変更:

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageData, Camera c) { 
     if (imageData != null) { 
      Bitmap bitmap = Utils.makeBitmap(imageData, 50 * 1024); 
     } 
    } 
}; 

だから私はその方法を取って、私のアプリで使用します。この方法で作成したイメージは低品質ですが、ピクセル数(50 * 1024)を大きくすると、別のOutOfMemoryの問題が発生します。

大きなビットマップを使用したい場合は大きなサイズで、アルファレイヤのあるPNGを約500x300のサイズで使用したいのですが、どうすればいいですか? Android Cameraアプリでの大きな画像の作成は、実際どのように行われていますか?

ありがとうございます!

+1

クラッシュ原因は何ですか? starttrace/logcatを指定してください。あなたのソースリンクは間違っているようです - その署名を持つmakeBItmap()メソッドはありません –

答えて

0

を復号化した後、残念ながらあなたが行うことができます

一つのことをnullにimageDataに設定されているビットマップのサイズに降りてくるだろうがありますあなたは、その大量のビットマップをメモリに入れて表示することはできません。表示のためのダウンサンプリングバージョンで

byte[] imageData; 
FileOutputStream out = new FileOutputStream(file); 
out.write(imageData, 0, imageData.length); 
out.flush(); 
out.close(); 

以降負荷:

しかし、あなたは、ビットマップを保存することができます。

FileInputStream inputStream = new FileInputStream(file); 
BitmapFactory.decodeStream(inputStream, null, options); 

この方法で元のサイズの画像を維持しながら、オーバーフローなしで画像を表示することができます。

注:オプションを使用して、ダウンサンプリングの量を指定する必要があります。 try {} catch {}ブロックと、必要な量がわからない場合は、ダウンサンプルをインクリメントするループに入れてください。

0

カップルの事は、あなたがメモリを解放しようとすることができますが、それは最終的に