web-dev-qa-db-ja.com

bitmap.compress(Bitmap.CompressFormat.PNG、0、fOut)により、画像サイズが元のサイズよりも大きくなります

カメラから取得した画像をpng形式に圧縮してサイズを小さくしたいので、次のコードを使用します。

compressedPictureFile = new File(imagePath);
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
FileOutputStream fOut = new FileOutputStream(compressedPictureFile);
boolean compressed = bitmap.compress(Bitmap.CompressFormat.PNG, 0, fOut);
fOut.flush();
fOut.close();

問題は、compressedPictureFileが実際には元の画像よりも大きいことです(1 Mbから6Mbへ)。

何が欠けていますか?そして、これは画像のサイズを縮小する最良の方法ですか?

ありがとう

17
Dany Y

カメラで撮影した画像は、おそらく jpg -formatに保存されます。これは非可逆ですが、写真などの色の多い画像には比較的適しています。

メソッドを使用してビットマップを圧縮する場合、ビットマップを png として保存します。 png圧縮はロスレスですが、色が少ない場合(特定のロゴタイプや他のグラフィックなど)はかなり小さなファイルサイズになります。 pngファイルの色の量と複雑さが増すと、ファイルサイズも増加します(これがカメラがjpgを保存する理由です-ほとんどの写真では、品質/ファイルサイズの比率はpngよりもはるかに優れています)。

したがって、写真のファイルサイズを小さくしたい場合は、jpg圧縮を使用して、品質パラメータを試してください。多くのスペースを節約できるため、画像の解像度を下げることもできます(50%の解像度のファイルは、データサイズが約25%になります)。

25
Jave

それは私のアプリでうまくいきます

    public static String makeScreen(View view) throws Exception {
    String filename = "file.png";
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();
    Bitmap b = view.getDrawingCache();
    FileOutputStream file = null;

    try {
        file = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "folder/" + filename);
        if (file != null) {
            b.compress(Bitmap.CompressFormat.PNG, 98, file);
            file.close();
        }
        view.destroyDrawingCache();
    } catch (Exception e) { view.destroyDrawingCache(); }
}