我正在尝试向我在网站上找到的观众展示大量图片
它和< 20张图片一起工作得非常好,但在那之后我得到了一张“OutOfMemory”
我添加了这个代码,在stackoverflow上找到但看起来还不够
bmpOptions.inSampleSize = sampleSize;
bmpOptions.inDither=false; //Disable Dithering mode
bmpOptions.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
bmpOptions.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
bmpOptions.inTempStorage=new byte[32 * 1024];
我怎么能改善它? 这是完整的代码
protected void onActivityResult(int requestCode,int resultCode,Intent data){
if (resultCode == RESULT_OK) {
// check if we are returning from picture selection
if (requestCode == PICKER) {
// the returned picture URI
Uri pickedUri = data.getData();
// declare the bitmap
Bitmap pic = null;
// declare the path string
String imgPath = "";
// retrieve the string using media data
String[] medData = { MediaStore.Images.Media.DATA };
// query the data
Cursor picCursor = managedQuery(pickedUri, medData, null, null,
null);
if (picCursor != null) {
// get the path string
int index = picCursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
picCursor.moveToFirst();
imgPath = picCursor.getString(index);
} else
imgPath = pickedUri.getPath();
// if we have a new URI attempt to decode the image bitmap
if (pickedUri != null) {
// set the width and height we want to use as maximum
// display
int targetWidth = 600;
int targetHeight = 400;
// create bitmap options to calculate and use sample size
BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
// first decode image dimensions only - not the image bitmap
// itself
bmpOptions.inDither=false; //Disable Dithering mode
bmpOptions.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
bmpOptions.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
bmpOptions.inTempStorage=new byte[32 * 1024];
bmpOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imgPath, bmpOptions);
// image width and height before sampling
int currHeight = bmpOptions.outHeight;
int currWidth = bmpOptions.outWidth;
// variable to store new sample size
int sampleSize = 1;
// calculate the sample size if the existing size is larger
// than target size
if (currHeight > targetHeight || currWidth > targetWidth) {
// use either width or height
if (currWidth > currHeight)
sampleSize = Math.round((float) currHeight
/ (float) targetHeight);
else
sampleSize = Math.round((float) currWidth
/ (float) targetWidth);
}
// use the new sample size
bmpOptions.inSampleSize = sampleSize;
bmpOptions.inDither=false; //Disable Dithering mode
bmpOptions.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
bmpOptions.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
bmpOptions.inTempStorage=new byte[32 * 1024];
// now decode the bitmap using sample options
bmpOptions.inJustDecodeBounds = false;
// get the file as a bitmap
pic = BitmapFactory.decodeFile(imgPath, bmpOptions);
// pass bitmap to ImageAdapter to add to array
imgAdapt.addPic(pic);
// redraw the gallery thumbnails to reflect the new addition
picGallery.setAdapter(imgAdapt);
// display the newly selected image at larger size
picView.setImageBitmap(pic);
// scale options
picView.setScaleType(ImageView.ScaleType.FIT_CENTER);
pic.recycle();
}
}
}
答案 0 :(得分:1)
首先跟踪20张图像后的堆大小增加 您可以尝试这个简单的解决方案Just Pass Image和Width and height将返回Resized Image
public static Bitmap getResizedBitmap(Bitmap image, int newHeight, int newWidth) {
int width = image.getWidth();
int height = image.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// create a matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
// recreate the new Bitmap
Bitmap resizedBitmap = Bitmap.createBitmap(image, 0, 0, width, height,
matrix, false);
return resizedBitmap;
}
答案 1 :(得分:1)
你必须在放入调整大小位图代码后缩放位图,或者你可以直接在图像视图上设置试试这个
int h = 100; // height in pixels
int w = 100; // width in pixels
Bitmap photoBitMap = Bitmap.createScaledBitmap(yourSelectedImage, h, w, true);
imageView.setBitmap(photoBitMap);