[solved] Mengatasi Out of Memory pada Android Bitmap
Salah satu penerapan aplikasi adalah menampilkan image. Untuk menampilkan image dengan resolusi kecil atau sedikit bukan masalah, karena memory yang digunakan kecil. Namun akan menjadi masalah ketika image yang ditampilkan memiliki resolusi yang sangat besar, maka Anda kemungkinan akan mengalami berupa error "Out Of Memory".
Untuk menangani ini bisa ditangani dengan menurunkan kepadatan pixel, atau insamplesize, namun hasil imagenya menjadi sangat tidak bagus, menjadi blurry / kabur.
Setelah melakukan searching... ini mungkin salah satu solusinya yang berhasil saya gunakan.
Ini dibagian saat akan menampilkan image :
FileInputStream inputStream = new FileInputStream(file);
Bitmap mBitmap = decodeSampledBitmapFromResourceMemOpt(inputStream, 800,
800);
ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setImageBitmap(mBitmap);Ini fungsi dari decodeSampledBitmapFromResourceMemOpt :
public Bitmap decodeSampledBitmapFromResourceMemOpt(
InputStream inputStream, int reqWidth, int reqHeight) {
byte[] byteArr = new byte[0];
byte[] buffer = new byte[1024];
int len;
int count = 0;
try {
while ((len = inputStream.read(buffer)) > -1) {
if (len != 0) {
if (count + len > byteArr.length) {
byte[] newbuf = new byte[(count + len) * 2];
System.arraycopy(byteArr, 0, newbuf, 0, count);
byteArr = newbuf;
}
System.arraycopy(buffer, 0, byteArr, count, len);
count += len;
}
}
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(byteArr, 0, count, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
options.inPurgeable = true;
options.inInputShareable = true;
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
int[] pids = { android.os.Process.myPid() };
MemoryInfo myMemInfo = mAM.getProcessMemoryInfo(pids)[0];
Log.e(TAG, "dalvikPss (decoding) = " + myMemInfo.dalvikPss);
return BitmapFactory.decodeByteArray(byteArr, 0, count, options);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}Dan ini fungsi calculateInSampleSize :
private 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;
}Done, silahkan sesuaikan dengan codingan Anda. Saya mendapatkan referensi ini di sini dan di sini
credit untuk mereka
Bacaan terkait
Membuat dan Print Dokumen di Flutter
Dalam aplikasi adakalanya kita memerlukan agar aplikasi menghasilkan dokumen atau dokumen tersebut untuk bisa di print. Di flutter hal tersebut dapat dilakukan denga...
Mendapatkan String App Hash untuk SMS Retriever Android
Implementasi verifikasi menggunakan OTP pada aplikasi sering digunakan. Sebelumnya android memiliki permission (SMS_RECEIVE and SMS_READ) untuk membaca SMS agar memu...
flutter_stetho : Debug Flutter (Network) Menggunakan Chrome Dev Tools
Ada kalanya ketika melakukan development aplikasi mobile, kita perlu melakukan debugging terkait network layaknya inspect web pada browser chrome. Di flutter hal ter...
Komentar (0)
Belum ada komentar. Jadilah yang pertama.
Tulis komentar
Komentar akan dimoderasi sebelum tampil.