2017-01-15 51 views
1

イメージサイズを拡大することなく、カメラで撮影した画像を圧縮しようとしています。Bitmap.compress - 動作しません。

私はbitmap.compressを試しましたが、うまくいきませんでした。 リソースからロードされたビットマップを圧縮しようとしましたが、まだ成功していないことを確認してください。

コード例:

//load bitmap from resources: 
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.trolltunga); 
Log.d("roee", "onImageCaptured: before compress = " + bitmap.getByteCount() + ", " + bitmap.getWidth() + ", " + bitmap.getHeight()); 

//compressing 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bos); 
Bitmap comp = BitmapFactory.decodeStream(new ByteArrayInputStream(bos.toByteArray())); 
Log.d("roee", "onImageCaptured: after compress = " + comp.getByteCount() + ", " + comp.getWidth() + ", " + comp.getHeight()); 

ログの結果:

D/roee: onImageCaptured: before compress = 10800000, 3000, 900 
D/roee: onImageCaptured: after compress = 10800000, 3000, 900 
+1

'Bitmap'は決して圧縮されません。あなたのコードは期待どおりに動作しています。ビットマップ*ファイル*は、 'PNG'や' JPEG'のような圧縮ファイル形式を使って 'compress()'すると圧縮されます(技術的には 'ByteArrayOutputStream'は圧縮されています。 – CommonsWare

答えて

3

ショートバージョン:あなたはビットマップを圧縮し、その後すぐに

ロングバージョンそれを解凍:

Bitmapは圧縮されていません。高速な描画と処理のために、イメージをフルサイズで表現するバイト配列のコンテナクラスです。

画像を別の形式で読み込むためによく使用されます。表示または編集するためにJPEGをメモリに記憶させ、他のファイル形式に直接読み込んだり保存したりする方法がいくつかあります。

compress圧縮されたファイル形式(あなたの場合はJPEG)で圧縮されていないバイト配列を変換し、それをストリームに出力して、ストレージなどに保存できるようにします。

BitmapFactory.decodeStreamを使用すると、ストリーム内の情報を読み取り、ファイル形式を認識し、は非圧縮バイト配列にをデコードします。通常は、イメージフォームストレージを読み込むために使用します。

あなたがここで行ったことは、Bitmapを取り、それをJPEGに圧縮し(いくつかの情報を失う)、そのJPEGを解凍したビットマップに再度デコードします。これは同じ解像度、つまりメモリ内の同じバイト数と同じサイズ。

ソリューション: あなたは圧縮が働いていたかどうかを確認したい場合は、ちょうどあなたがビットマップを圧縮することはできませんbos.toByteArray().length

0

で出力ストリームのサイズを測定します。 ByteArrayOutputStreamのみがJPEGのような特定の形式に圧縮され、ByteArrayOutputStreamの圧縮された長さをチェックできます。

関連する問題