swati
swati

Reputation: 1283

how to set a large image in image view

I have an image view and I want to set an image on it. The size of the image is 7,707,446 bytes. Whenever I try to set the layout, the app crashes and the error is out of memory error.can anyone suggest me how to solve it.The xml is:-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:scrollbars="none">

    <RelativeLayout

        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/image" >
    </RelativeLayout>
</ScrollView>

Upvotes: 1

Views: 504

Answers (3)

Android
Android

Reputation: 2393

Bitmap picture=BitmapFactory.decodeFile("/sdcard...");
    int width = picture.getWidth();
    int height = picture.getWidth();
    float aspectRatio = (float) width / (float) height;
    int newWidth = 70;
    int newHeight = (int) (70 / aspectRatio);       
    picture= Bitmap.createScaledBitmap(picture, newWidth, newHeight, true);


public static Bitmap decodeImage(String arrayList_image) {

        URL aURL;

        try {

            aURL = new URL(arrayList_image);

            URLConnection conn = aURL.openConnection();

            conn.connect();

            InputStream is = conn.getInputStream();

            BufferedInputStream bis = new BufferedInputStream(is);

            bm = BitmapFactory.decodeStream(bis);

            bis.close();

            is.close();

            return bm;

        } catch (MalformedURLException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();
        }
        return null;
    }

Upvotes: 1

Zala Janaksinh
Zala Janaksinh

Reputation: 2927

Hi i suggest u to try this and display your image according the Device.

Bitmap bmp = BitmapFactory.decodeResource(myContext.getResources(),drawableId);
            int w = bmp.getWidth();
            int h = bmp.getHeight();

            System.out.println("OrgWidth : " + w);
            System.out.println("orgHeight : " + h);

            int targetWidth = (screenWidth * w)/iPadWidth;
            int targetHeight = (screenHeight * h)/iPadHeight;

            System.out.println("TargetWidth : " + targetWidth);
            System.out.println("TargetHeight : " + targetHeight);

            int[] arrWidthHeight = {targetWidth,targetHeight};

            // This for Slove the out of Memory problem

            int newWidth = 110;
            int newHeight = 110;
            float scaleWidth = ((float) newWidth) / w;
            float scaleHeight = ((float) newHeight) / h;

            Matrix bMatrix = new Matrix();
            bMatrix.postScale(scaleWidth, scaleHeight);
            Bitmap resizedBitmap = Bitmap.createBitmap(bmp, 0, 0, w, h , bMatrix, true);

First fetch the Image from resources and find new height and width of image according to device and after scale this image as purpose for solve the out of memory here.

This for find height and width according to device height and width..

WindowManager winManager = (WindowManager) myContext.getSystemService(Context.WINDOW_SERVICE);
            screenWidth = winManager.getDefaultDisplay().getWidth();
            screenHeight = winManager.getDefaultDisplay().getHeight();

            System.out.println("Screen Width : " + screenWidth);
            System.out.println("Screen Height : " + screenHeight);

and use bitmap to get image height and width witch like a ipathwidth and ipathHeight ok now Happy

Upvotes: 0

David
David

Reputation: 1718

See Loading Large Bitmaps Effectively.

You could create a function to calculate a downscaling factor:

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) {
        if (width > height) {
            inSampleSize = Math.round((float)height / (float)reqHeight);
        } else {
            inSampleSize = Math.round((float)width / (float)reqWidth);
        }
    }
    return inSampleSize;
}

And then use this to load a scaled Bitmap:

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

Thus if you wanted to load a 100x100 pixel thumbnail into your ImageView, you'd just use:

mImageView.setImageBitmap(
    decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100)
);

Upvotes: 0

Related Questions