Tengo un archivo de imagen URI, y quiero reducir su tamaño para subirlo. El tamaño del archivo de imagen inicial depende de un dispositivo móvil a otro (puede ser de 2MB, como puede ser 500KB), pero quiero que el tamaño final sea de aproximadamente 200KB, para que pueda cargarlo.
Por lo que leo, tengo (al menos) 2 opciones:Android - Reducir el tamaño del archivo de imagen
- Uso BitmapFactory.Options.inSampleSize, a submuestra imagen original y obtener una imagen más pequeña;
- Usando Bitmap.compress para comprimir la imagen que especifica la calidad de compresión.
¿Cuál es la mejor opción?
pensaba para cambiar el tamaño de la imagen inicialmente anchura/altura hasta el ancho o alto está por encima de 1000 píxeles (algo así como 1024x768 u otros), y luego comprimir la imagen con la disminución de la calidad hasta el tamaño del archivo es superior a 200 KB. He aquí un ejemplo:
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");
}
¿Hay una mejor manera de hacerlo? ¿Debo intentar seguir usando los 2 métodos o solo uno? Gracias
si la imagen de origen png o jpg? –
Imagen de fuente es JPG – KitKat