Devo inviare un'immagine da un file a un server. Il server richiede l'immagine con una risoluzione di 2400x2400.BitmapFactory.decode. Memoria insufficiente con immagini 2400x2400
Quello che sto cercando di fare è:
1) Ottenere un bitmap utilizzando BitmapFactory.decodeFile utilizzando l'inSampleSize corretta.
2) comprime l'immagine in formato JPEG con una qualità del 40%
3) Codificare l'immagine in base64
4) inviata al server
non riesco a raggiungere il primo passo, lancia un'eccezione di memoria insufficiente. Sono sicuro che inSampleSize sia corretto, ma suppongo che anche con inSampleSize la Bitmap sia enorme (circa 30 MB in DDMS).
Qualche idea come può farlo? Posso fare questi passaggi senza creare un oggetto bitmap? Intendo farlo su file system invece che su memoria RAM.
Questo è il codice corrente:
// The following function calculate the correct inSampleSize
Bitmap image = Util.decodeSampledBitmapFromFile(imagePath, width,height);
// compressing the image
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 40, baos);
// encode image
String encodedImage = Base64.encodeToString(baos.toByteArray(),Base64.DEFAULT));
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) height/(float) reqHeight);
final int widthRatio = Math.round((float) width/(float) reqWidth);
// Choose the smallest ratio as inSampleSize value, this will guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromFile(String path,int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path,options);
}
facciamo attraverso u otterrà qualche idea http://developer.android.com/training/displaying-bitmaps/manage-memory.html –
getBitmap(). recycle(); –
Hai l'immagine in un file, giusto? Basta inviare questo file al server e apportare le necessarie trasformazioni lì. – Henry