2011-12-21 10 views
3

私はこれを実行してみてください:ファイルサイズを変更せずにビットマップを回転するにはどうすればよいですか?

Bitmap bitmapOrg = BitmapFactory.decodeFile("/sdcard/"+ photoName + ".jpg"); 

     int width = bitmapOrg.getWidth(); 
     int height = bitmapOrg.getHeight(); 

     Matrix matrix = new Matrix(); 

     matrix.postRotate(90); 

     Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, 
       height, matrix, true); 

     FileOutputStream os; 
     try { 
      os = new FileOutputStream(String.format(
       "/sdcard/" + photoName + "-rotate.jpg", 
        System.currentTimeMillis())); 

     resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, os); 

回転ファイルサイズ>元のファイルサイズを、回転ファイル解像度= 96 DPIが、元のファイル= 72 DPIからです。なぜこれが起こっていて、それを修正するのですか?

答えて

1

あなたは右FileOutputStream os;の前に次の行に追加することができます。コードで

Bitmap bitmapOrg = BitmapFactory.decodeFile("/sdcard/"+ photoName + ".jpg"); 

resizedBitmap.setDensity(bitmapOrig.getDensity()); 
+1

動作しません。私は同じ結果を得る。 –

+0

@shermanこれは、ファイルのサイズではなく、ピクセルの密度にのみ影響します。 "BitmapFactoryから返されたビットマップが別のビット深度にある可能性があり、ピクセルごとのアルファを失う可能性があります(例:JPEGは不透明ピクセルのみをサポートしています)。さらに、 '100'の品質を指定しているため、入力よりも出力が大きくなる可能性があります。 –

+0

はい、そうですが、濃度が変わらないのはなぜですか? –

1

別の可能な解決策は、最初の行を変更することがあるように私には思える

Bitmap bitmapOrg = BitmapFactory.decodeFile("/sdcard/"+ photoName + ".jpg", (new BitmapFactory.Options()).inDensity=0); 

しかし、私はこの解決策を確認しませんでした。

さらに、あなたのソリューションも機能するはずです。 createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)ファイル(bitmap.mDensity = source.mDensity;)の密度を変更しない

  1. 機能:私はので、エラーは、AOSPのどこかにあると思います。新しい密度はソースの密度に等しい。したがって、この呼び出しの前に密度が変更されたようです。パラメータ(pathName, null)
  2. BitmapFactory.decodeFile(pathName, null)
  3. BitmapFactory.decodeFile calls BitmapFactory.decodeFileは、ストリームにファイルを変換し、
  4. BitmapFactory.decodeStream(stream, null, opts)コールネイティブ関数bm = nativeDecodeStream(is, tempStorage, outPadding, opts);ヌル=付き合えBitmapFactory.decodeStream(stream, null, opts)呼び出し、finishDecode(bm, outPadding, opts);は、我々の場合のoptsのは、nullに等しいであることを忘れないでください呼び出します。 finishDecode(bm, outPadding, opts)
  5. は不変のビットマップを返すべきである最初のチェック(我々の場合にOPTSがヌルでなければならない)がある。

    場合(BM == NULLが||オプト== NULL){ 戻りBM。 }

  6. したがって、悪い何かがネイティブ関数でのoptsで起こっているようだ:nativeDecodeStream(is, tempStorage, outPadding, opts)

問題がどこにあるか、さらに確認するために多くの時間を必要とします。また、私は私の所見が正しいことを確信していません。

関連する問題