URI画像ファイルがありますが、アップロードするためにサイズを小さくしたいと思います。初期の画像ファイルサイズはモバイルごとに異なりますが(500KBの場合は2MB)、アップロードできるように最終的なサイズは約200KBにします。
私が読んだものから、私には(少なくとも)2つの選択肢があります:
- BitmapFactory.Options.inSampleSizeを使用して、元の画像をサブサンプリングし、より小さな画像を取得します。
- Bitmap.compressを使用して、圧縮品質を指定して画像を圧縮します。
最良の選択は何ですか?
最初に画像の幅/高さを1000px(1024x768など)を超えるまでサイズ変更し、次にファイルサイズが200KBを超えるまで品質を下げて画像を圧縮することを考えていました。次に例を示します。
int MAX_IMAGE_SIZE = 200 * 1024; // max final file size
Bitmap bmpPic = BitmapFactory.decodeFile(fileUri.getPath());
if ((bmpPic.getWidth() >= 1024) && (bmpPic.getHeight() >= 1024)) {
BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
bmpOptions.inSampleSize = 1;
while ((bmpPic.getWidth() >= 1024) && (bmpPic.getHeight() >= 1024)) {
bmpOptions.inSampleSize++;
bmpPic = BitmapFactory.decodeFile(fileUri.getPath(), bmpOptions);
}
Log.d(TAG, "Resize: " + bmpOptions.inSampleSize);
}
int compressQuality = 104; // quality decreasing by 5 every loop. (start from 99)
int streamLength = MAX_IMAGE_SIZE;
while (streamLength >= MAX_IMAGE_SIZE) {
ByteArrayOutputStream bmpStream = new ByteArrayOutputStream();
compressQuality -= 5;
Log.d(TAG, "Quality: " + compressQuality);
bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpStream);
byte[] bmpPicByteArray = bmpStream.toByteArray();
streamLength = bmpPicByteArray.length;
Log.d(TAG, "Size: " + streamLength);
}
try {
FileOutputStream bmpFile = new FileOutputStream(finalPath);
bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpFile);
bmpFile.flush();
bmpFile.close();
} catch (Exception e) {
Log.e(TAG, "Error on saving file");
}
それを行うためのより良い方法はありますか?2つの方法すべてを使い続けるべきですか、それとも1つだけを使い続けるべきですか?ありがとう