Я пытаюсь сжать растровое изображение, выбранное из галереи или захваченное камерой, перед отправкой на сервер. Теперь я делаю это, выполнив следующие действия:
1) получить путь к изображению.
2) получить растровое изображение по этому пути.
3) проверьте начальную ширину и высоту растрового изображения и сравните их с максимальной шириной и высотой, а затем используйте коэффициент для регулировки ширины и высоты.
4) правильно проверять и вращать растровое изображение, используя exif.
5) окончательно снизить качество, чтобы получить окончательное сжатое растровое изображение.
код:
private static final float max_width = 1280.0f;
private static final float max_height = 1280.0f;
private static final float max_ratio = max_width/max_height;
private void CompressImage(String path , Bitmap bitmap_original){
//get width and height of original bitmap
int original_width = bitmap_original.getWidth();
int original_height = bitmap_origianl.getHeight();
float original_ratio = (float)width/(float)height;
if(original_height > max_height || original_width > max_width){
//adjust bitmap dimensions
int width = 0;
int height = 0;
if(original_ratio<max_ratio){
width= (int)((max_height/original_height)*original_width);
height=(int) max_height;
}else if(original_ratio>max_ratio){
height= (int)((max_width/original_width)*original_height);
width= (int)max_width;
}else{
height = max_height;
width = max_width;
}
//adjust the bitmap
Bitmap adjusted_bitmap = Bitmap.createScaledBitmap(bitmap_original,width,height,false);
//check rotation
Matrix matrix = new Matrix();
try{
ExifInterface exif = new ExifInterface(path);
int original_orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION , ExifInterface.ORIENTATION_UNDEFINED);
if(original_orientation == ExifInterface.ORIENTATION_ROTATE_90){
matrix.setRotate(90);
}else if(original_orientation == ExifInterface.ORIENTATION_180){
matrix.setRotate(180);
}else if(original_orientation == ExifInterface.ORIENTATION_270){
matrix.setRotate(270);
}
Bitmap rotated_adjusted_bitmap = Bitmap.createBitmap(adjusted_bitmap , 0 , 0 , adjusted_bitmap.getWidth(), adjusted_bitmap.getHeight(),matrix,true);
//lower the quality
ByteArrayOutputStream out = new ByteArrayOutputStream();
adjusted_rotated_bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out);
Bitmap adjusted_rotated_lowquality_bitmap = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray()));
}catch(IOException e){
}
}else{
//keep bitmap as is
Bitmap adjusted_bitmap = bitmap_original;
}
}
Проблема
Все выше работает нормально, но проблема в том, что в некоторых случаях приложение вылетает с исключением Out Of Memory.
Что-то не так с моим кодом?
Я немного знаю о растровых изображениях и сжатии.
Спасибо за вашу помощь.