1

これは奇妙でばかげた質問のように聞こえるかもしれません。しかし、聞いてください。

Android アプリケーションは、少なくとも T-Mobile G1 では、16 MB のヒープに制限されています

また、画像を (ビットマップ形式で) 保存するには、1 ピクセルあたり 4 バイトかかります。

public void onPictureTaken(byte[] _data, Camera _camera) {
    Bitmap temp = BitmapFactory.decodeByteArray(_data, 0, _data.length);
}           

したがって、1 つの画像は 6 メガピクセルで 24 MB のヒープを占有します。(キューメモリオーバーフロー)。

今では、パラメーターを使用してデコードし、画像のサイズを効果的に縮小できることをよく知っています。希望のサイズに縮小する方法もあります。

しかし、カメラを高品質のカメラとして使用したい場合はどうでしょうか。

この画像をデータベースに入れる方法がわかりません。デコードするとすぐにエラーになります。

注:保存する前に回転できるように、ビットマップに変換する必要があります(?)。

要約すると:

  • 16MB のヒープに制限
  • イメージは 24MB のヒープを占有します
  • 画像を取得して操作するための十分なスペースがありません

これは問題に対処しませんが、ある場所から画像をロードするだけの人には出発点としてお勧めします: Displaying Bitmaps on android

4

2 に答える 2

3

役立つかもしれないことはいくつかしか思い浮かびませんが、どれも最適ではありません

  1. ローテーションをサーバー側で行う

  2. キャプチャからのデータをデコードせずに SDCARD に直接保存し、ファイル システムを使用してチャンクごとにローテーションし、それを DB に送信します。Web 上の多くの例 (角度が単純な場合、90 180 など) ですが、SDCARD に対する IO 操作は正確に高速ではないため、これには時間がかかります。

  3. アルファチャンネルをデコードしてドロップすると、問題が解決しない場合があります。マトリックスを使用して画像を回転させる場合は、とにかくターゲット/ソースが必要になります

    オプション opt = 新しいオプション();

    opt.inPreferredConfig = Bitmap.Config.RGB_565;

    // raw カメラをアルファ チャネルなしのビットマップにデコードします
    bmp = BitmapFactory.decodeByteArray(raw, 0,raw.length, opt);


これを行うためのより良い方法があるかもしれませんが、デバイスのヒープなどが非常に限られているため、考えられません。

オプションのファイル ベースのマトリックス メソッド (一般に、オプション 2 として提案している方法) または Android 用の何らかの「ページング」システムがあればいいのですが、それが私が思いつく最善の方法です。

于 2012-05-22T16:51:53.873 に答える
0

最初にファイルシステムに保存し、ファイルシステムのファイルで操作を行います...

于 2012-05-22T15:57:25.060 に答える