automatically adjust image compression to keep files under 512MiB

This commit is contained in:
Daniel Gultsch 2016-01-09 16:16:18 +01:00
parent 6acb80a83a
commit 708d7c5b98
2 changed files with 15 additions and 8 deletions

View File

@ -36,6 +36,7 @@ public final class Config {
public static final int IMAGE_SIZE = 1920; public static final int IMAGE_SIZE = 1920;
public static final Bitmap.CompressFormat IMAGE_FORMAT = Bitmap.CompressFormat.JPEG; public static final Bitmap.CompressFormat IMAGE_FORMAT = Bitmap.CompressFormat.JPEG;
public static final int IMAGE_QUALITY = 75; public static final int IMAGE_QUALITY = 75;
public static final int IMAGE_MAX_SIZE = 524288; //512KiB
public static final int MESSAGE_MERGE_WINDOW = 20; public static final int MESSAGE_MERGE_WINDOW = 20;

View File

@ -135,7 +135,7 @@ public class FileBackend {
} }
File file = new File(path); File file = new File(path);
long size = file.length(); long size = file.length();
if (size == 0 || size >= 524288 ) { if (size == 0 || size >= Config.IMAGE_MAX_SIZE ) {
return false; return false;
} }
BitmapFactory.Options options = new BitmapFactory.Options(); BitmapFactory.Options options = new BitmapFactory.Options();
@ -211,8 +211,6 @@ public class FileBackend {
try { try {
file.createNewFile(); file.createNewFile();
is = mXmppConnectionService.getContentResolver().openInputStream(image); is = mXmppConnectionService.getContentResolver().openInputStream(image);
os = new FileOutputStream(file);
Bitmap originalBitmap; Bitmap originalBitmap;
BitmapFactory.Options options = new BitmapFactory.Options(); BitmapFactory.Options options = new BitmapFactory.Options();
int inSampleSize = (int) Math.pow(2, sampleSize); int inSampleSize = (int) Math.pow(2, sampleSize);
@ -226,12 +224,20 @@ public class FileBackend {
Bitmap scaledBitmap = resize(originalBitmap, Config.IMAGE_SIZE); Bitmap scaledBitmap = resize(originalBitmap, Config.IMAGE_SIZE);
int rotation = getRotation(image); int rotation = getRotation(image);
scaledBitmap = rotate(scaledBitmap, rotation); scaledBitmap = rotate(scaledBitmap, rotation);
boolean success = scaledBitmap.compress(Config.IMAGE_FORMAT, Config.IMAGE_QUALITY, os); boolean targetSizeReached = false;
long size = 0;
int quality = Config.IMAGE_QUALITY;
while(!targetSizeReached) {
os = new FileOutputStream(file);
boolean success = scaledBitmap.compress(Config.IMAGE_FORMAT, quality, os);
if (!success) { if (!success) {
throw new FileCopyException(R.string.error_compressing_image); throw new FileCopyException(R.string.error_compressing_image);
} }
os.flush(); os.flush();
long size = file.getSize(); size = file.getSize();
targetSizeReached = size <= Config.IMAGE_MAX_SIZE || quality <= 50;
quality -= 5;
}
int width = scaledBitmap.getWidth(); int width = scaledBitmap.getWidth();
int height = scaledBitmap.getHeight(); int height = scaledBitmap.getHeight();
message.setBody(Long.toString(size) + '|' + width + '|' + height); message.setBody(Long.toString(size) + '|' + width + '|' + height);