Android java.lang.OutOfMemoryError (แก้ปัญหาเรื่อง OutOfMemoryError ในการแสดงรูปภาพ) |
Android java.lang.OutOfMemoryError (แก้ปัญหาเรื่อง OutOfMemoryError ในการแสดงรูปภาพ) ในการเขียนโปรแกรม Android เพื่อแสดงรูปภาพ ปัญหาที่หลาย ๆ คนพบเจอก็มือเมื่อโหลดหรือแสดงรูปภาพขนาดใหญ่บน ImageView เราจะพับปัญหาโปรแกรมหยุดการทำงานและแสดง Error ว่า java.lang.OutOfMemoryError ปัญหานี้เกิดจาก Android ได้ใช้ Memory ที่มีอยู่อย่างจำกัดกับการจัดการกับรุปภาพจนไม่เหลือ Memory ให้ทำงานอย่างอื่น และวิธีการแก้ปัยหาง่าย ๆ ก็คือ ใช้การย่อรุปภาพให้มีขนาดเล็กลง ก่อนที่จะนำไปแสดงผลกับ ImageView ด้วย Code ง่าย ๆ ดังนี้
ฟิังก์ชั่นการ Decode เพื่อย่อขนาด
public static Bitmap decodeFile(File file, int iWidth, int iHeight){
try {
//Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(file),null,o);
//The new size we want to scale to
final int REQUIRED_WIDTH = iWidth;
final int REQUIRED_HIGHT = iHeight;
//Find the correct scale value. It should be the power of 2.
int scale=1;
while(o.outWidth/scale/2>=REQUIRED_WIDTH && o.outHeight/scale/2>=REQUIRED_HIGHT)
scale*=2;
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
return BitmapFactory.decodeStream(new FileInputStream(file), null, o2);
} catch (FileNotFoundException e) {}
return null;
}
การใช้งาน
Bitmap bm = decodeFile(new File("/sdcard/image.jpg"),200,200);
imgView.setImageBitmap(bm);
อีกตัวอย่างจะย่อขนาดของรุปภาพให้เท่ากันขนาดของ ImageView
public static void decodeFile(ImageView imgView, String filePath){
int targetW = imgView.getWidth();
int targetH = imgView.getHeight();
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(filePath, bmOptions);
imgView.setImageBitmap(bitmap);
}
ImageView imgView = (ImageView) findViewById(R.id.imgView);
decodeFile(imgView,"/sdcard/image.jpg");
อ่านเพิ่มเติม : Android Taking Photo and Resize Images (Quality, Size, Width, Height)
|