FC2ブログ
    08 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.» 10

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【Java】カメラで写真を撮った後の処理 

    金曜日です!今週ずっと眠かった大坂です。

    今週もJavaのお題。
    では早速。カメラで撮った画像をそのまま使ったらOutOfMemoryが発生したときのお話。
    流れは「画像サイズ情報を取得」⇒「スケールを決定」⇒「オプションの設定」⇒「画像を保存」といった感じ。
    ではコード。ちょっと長めです。
      // カメラで撮影後画像生成後に呼ばれる
    private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
    if(data != null) {
    try {
    // オプションの取得
    BitmapFactory.Options options = new BitmapFactory.Options();
    // 画像情報のみを取得
    options.inJustDecodeBounds = true;
    // 画像の読み込み(実際には読み込まず情報のみ)
    BitmapFactory.decodeByteArray(data, 0, data.length, options);
    // 画像データをスケールする係数を決定する
    int bitmap_size = 0;
    if((options.outWidth * options.outHeight) > 1000000) {
    //1Mピクセル超えてる場合は小さく
    double out_area = (double)(options.outWidth * options.outHeight)
                     / 1000000;
    bitmap_size = (int) (Math.sqrt(out_area) + 1);
    } else {
    //小さい場合はそのまま
    bitmap_size = 1;
    }

    // 画像を実際に読み込むモードに変更
    options.inJustDecodeBounds = false;
    // 画像データをスケールする係数の設定
    // (係数に2を設定したら縦横のサイズが1/2となる。例:1024×720⇒512×360)
    options.inSampleSize = bitmap_size;
    // 画像の読み込み
    Bitmap tmp_bitmap = BitmapFactory.decodeByteArray(data, 0,
                      data.length, options);
    // 縦横の長さを取得
    int width = tmp_bitmap.getWidth ();
    int height = tmp_bitmap.getHeight ();
    // 画像のスケール変更や回転に使用(今回は回転)
    Matrix matrix = new Matrix ();
    // 画像を90°回転させる
    matrix.postRotate(90);
    // Bitmapの作成
    Bitmap bitmap = Bitmap.createBitmap(tmp_bitmap, 0, 0, width,
                    height, matrix, true);
    // 画像の保存
    String filePath = Environment.getExternalStorageDirectory().getPath()
    + File.separator + "sample"
                   + File.separator + "sample.jpg"
    FileOutputStream fos = new FileOutputStream(filePath);
    bitmap.compress(CompressFormat.JPEG, 100, fos);

    // クローズ処理
    fos.close();
    // ビットマップの解放
    tmp_bitmap.recycle();
    bitmap.recycle();

    } catch(FileNotFoundException fnfe) {
    fnfe.printStackTrace();
    } catch(IOException ioe) {
    ioe.printStackTrace();
    }
    }
    }
    };


    このような感じで、メモリ対策をしつつ指定した場所にファイルが保存されます。
    画像サイズをあまりに小さくしたりすると表示したときに荒くなったりするので、
    適当に数字をいじって調整してみてください!

    他にもオプションでメモリ対策するものがあるので色々試してみるといい感じになっていくはずです!
    一例を書いておきます。
      // システムメモリ上に再利用性の無いオブジェクトがある場合に勝手に解放
    options.inPurgeable = true;
    // 現在の表示メトリクスの取得
    DisplayMetrics dm = getResources().getDisplayMetrics();
    // ビットマップのサイズを現在の表示メトリクスに合わせる
    options.inDensity = dm.densityDpi;

    ではでは、また来週(´・ω・)ノシ

    Category: 開発日記(Java)

    Thread: 日記

    Janre: 日記

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/15-acdf1910
    この記事にトラックバックする(FC2ブログユーザー)