在Android应用程序中显示很多位图

时间:2013-01-17 13:42:46

标签: java android bitmap out-of-memory

我正在尝试向我在网站上找到的观众展示大量图片

它和< 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();
            }

        }
    }

2 个答案:

答案 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);