Libathos
Libathos

Reputation: 3362

Scaling images for imageViews

In my android application I have a list which is populated with ImageViews and textViews. The imageViews are loaded dynamically from the sdCard. My problem is that I have higher resolution images, and for the purpose of list I need them to be significantly smaller like a thumbnail. So how can I scale the image to be like an imageView?

Upvotes: 0

Views: 103

Answers (4)

Joan P.S
Joan P.S

Reputation: 1573

You also can use the setMax from the image view:

imageView.setMaxHeight(myMaxHeight);
imageView.setMaxWidth(myMaxWidth);
imageView.setAdjustViewBounds(true);
imageView.setScaleType(ScaleType.FIT_CENTER);

You also can use the XML attributes for that

The problem of using this way is that you are setting the max size, so a smaller image will not fill the imageview

Upvotes: 0

Vaibs_Cool
Vaibs_Cool

Reputation: 6160

This code helps scale your image according to your imageview

private void scaleImage()
{
    // Get the ImageView and its bitmap
    ImageView view = (ImageView) findViewById(R.id.image_box);
    Drawable drawing = view.getDrawable();
    if (drawing == null) {
        return; // Checking for null & return, as suggested in comments
    }
    Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();

    // Get current dimensions AND the desired bounding box
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    int bounding = dpToPx(250);
    Log.i("Test", "original width = " + Integer.toString(width));
    Log.i("Test", "original height = " + Integer.toString(height));
    Log.i("Test", "bounding = " + Integer.toString(bounding));

    // Determine how much to scale: the dimension requiring less scaling is
    // closer to the its side. This way the image always stays inside your
    // bounding box AND either x/y axis touches it.  
    float xScale = ((float) bounding) / width;
    float yScale = ((float) bounding) / height;
    float scale = (xScale <= yScale) ? xScale : yScale;
    Log.i("Test", "xScale = " + Float.toString(xScale));
    Log.i("Test", "yScale = " + Float.toString(yScale));
    Log.i("Test", "scale = " + Float.toString(scale));

    // Create a matrix for the scaling and add the scaling data
    Matrix matrix = new Matrix();
    matrix.postScale(scale, scale);

    // Create a new bitmap and convert it to a format understood by the ImageView 
    Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
    width = scaledBitmap.getWidth(); // re-use
    height = scaledBitmap.getHeight(); // re-use
    BitmapDrawable result = new BitmapDrawable(scaledBitmap);
    Log.i("Test", "scaled width = " + Integer.toString(width));
    Log.i("Test", "scaled height = " + Integer.toString(height));

    // Apply the scaled bitmap
    view.setImageDrawable(result);

    // Now change ImageView's dimensions to match the scaled image
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams(); 
    params.width = width;
    params.height = height;
    view.setLayoutParams(params);

    Log.i("Test", "done");
}

private int dpToPx(int dp)
{
    float density = getApplicationContext().getResources().getDisplayMetrics().density;
    return Math.round((float)dp * density);
}

The xml code for the ImageView:

<ImageView a:id="@+id/image_box"
    a:background="#ff0000"
    a:src="@drawable/star"
    a:layout_width="wrap_content"
    a:layout_height="wrap_content"
    a:layout_marginTop="20dp"
    a:layout_gravity="center_horizontal"/>

Courtesy :http://www.anddev.org/resize_and_rotate_image_-_example-t621.html

Upvotes: 0

Pratik
Pratik

Reputation: 30855

here is the code for scale

private Bitmap decodeFile(File f){
    try {
        //decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);

        int scale=1;
        //Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE=250; // here provide your max size required
        int width_tmp=o.outWidth, height_tmp=o.outHeight;
        while(true){
            if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                break;
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }

        //decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        Bitmap bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        return bmp;
    } catch (FileNotFoundException e) {}
    return null;
}

Upvotes: 0

Ba Tới X&#236; Cơ
Ba Tới X&#236; Cơ

Reputation: 492

I hope this code below is useful for you

public static Bitmap resizeImage(Bitmap orignal, int new_width,
        int new_height) {
    // load the origial BitMap
    int width = orignal.getWidth();
    int height = orignal.getHeight();

    float scaleWidth = ((float) new_width) / width;
    float scaleHeight = ((float) new_height) / height;
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    Bitmap resizedBitmap = Bitmap.createBitmap(orignal, 0, 0, width,
            height, matrix, true);
    return resizedBitmap;
}

Upvotes: 2

Related Questions