0

私は「画像エディタ」のようなアプリケーションをやっています。デフォルトのカメラ インテントを使用して画像をキャプチャしました。以前は URI を解析し、それを次のようなイメージ ビューに設定していました。

imgCaptured.setImageURI(Uri.parse(filePath));

この生の画像を使用すると、メモリ不足のエラーが発生することがあります。そこで、次を使用して画像をデコードすることにしました。

「スタックオーバーフローから取得」

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 8;
    preview_bitmap = BitmapFactory.decodeStream(is, null, options);


private Bitmap decodeFile(File f) {
    try {
        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f), null, o);

        // The new size we want to scale to
        final int REQUIRED_SIZE = 95;

        // Find the correct scale value. It should be the power of 2.
        int scale = 1;
         while (o.outWidth / scale / 2 >= REQUIRED_SIZE
         && o.outHeight / scale / 2 >= REQUIRED_SIZE)
         scale *= 2;

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {
    }
    return null;
}

デコードした画像を使用すると、出力の品質が良くありません。なんとなくぼやけて見える。鮮明な画像が欲しい!ImageViewに設定した後。別のビューをドラッグ アンド ドロップする必要があります。

  • 上記を達成するにはどうすればよいですか?
  • これを行う良い方法は何ですか?
4

3 に答える 3

0

options.inSampleSize = 8 を options.inSampleSize = 4 に変更します。

于 2012-12-20T06:21:38.600 に答える
0

ループで 2 で割る理由は何ですか? これを試して

while (o.outWidth / scale  >= REQUIRED_SIZE
         && o.outHeight / scale  >= REQUIRED_SIZE)

おそらく、このメソッドhttp://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap(android.graphics.Bitmap , int, int, boolean)を使用して、画像をビューのサイズに合わせたいと思うでしょう

于 2012-12-20T06:03:17.660 に答える
0

あなたが使用した方法は完全ではありません。画像の品質を維持するために、いくつかの数学関数を追加する必要があります。

private static Bitmap decodeFile(File f) {
            Bitmap b = null;
            final int IMAGE_MAX_SIZE = 100;
            try {
                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                FileInputStream fis = new FileInputStream(f);
                BitmapFactory.decodeStream(fis, null, o);
                fis.close();
                int scale = 1;
                if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
                    scale = (int) Math.pow(
                            2.0,
                            (int) Math.round(Math.log(IMAGE_MAX_SIZE
                                    / (double) Math.max(o.outHeight, o.outWidth))
                                    / Math.log(0.5)));
                }
                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                fis = new FileInputStream(f);
                b = BitmapFactory.decodeStream(fis, null, o2);
                fis.close();
            } catch (Exception e) {
                Log.v("Exception in decodeFile() ", e.toString() + "");
            }
            return b;
        }

それがあなたのために働いた場合は、私に知らせてください...!!!!:)

于 2012-12-20T06:26:34.963 に答える