2

私のアプリケーションでは、ACTION_IMAGE_CAPTUREインテントを使用して写真を撮影しています。カメラが戻ると、ファイルがチェックされ、回転が縦向きの場合、ビットマップが回転され、次のコードでディスクに保存されます。

BitmapFactory.Options options = new Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bmp = BitmapFactory.decodeFile(f.getAbsolutePath(), options);
if (bmp != null) {
    Matrix m = new Matrix();
    m.postRotate(90);
    Bitmap rotated = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), m,
                                        true);
    rotated = rotated.copy(Bitmap.Config.RGB_565, false); // added based on comment
    f.delete();
    FileOutputStream fos = new FileOutputStream(f);
    rotated.compress(Bitmap.CompressFormat.JPEG, 100, fos);
    fos.close();
}

これは正常に機能しますが、ファイルサイズは回転していない画像の2倍です。BitmapFactory.Options密度を0に、スケールをfalseに設定しようとしましたが、どちらも目的の効果がありません。変換する画像を、ディスクからロードする画像と同じサイズにしたい。これが起こらないようにする何かが私のコードにありますか?

4

3 に答える 3

7

元のJPEGは、ピクセルあたり2バイトを使用するRGB565を使用します。このファイルから派生したメモリ内ビットマップは、ピクセルあたり4バイトの「通常の」形式を使用します。これを新しいJPEGに保存すると、より密度の高い形式で保存されるため、サイズが2倍になります(これは回転とは関係ありません)。

于 2012-07-09T13:52:34.547 に答える
1

これは、JPEGに変換するときに不可逆圧縮を許可していないことが原因である可能性があります。品質を90または80に設定してみてください。これにより、ファイルサイズが大幅に減少します。

そして、「不可逆」という用語に恐れをなさないでください。これはJPEGの重要な部分であるため、JPEGは圧縮レベルを取得しますが、その損失は人間の目にはそれほど見えません。

于 2012-07-09T13:51:26.530 に答える
1

ExifInterfaceを使用して、実際にピクセルをデコードおよび再圧縮せずにJPEG画像を回転させることができます。例:

ExifInterface exif = new ExifInterface(filename);
int old_orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
int new_orientation = ...; // implement your business logic here
exif.setAttribute(TAG_ORIENTATION, new_orientation);
exif.saveAttributes();
于 2012-07-09T14:02:26.193 に答える