0

在我的 android 应用程序中,我有一个列表,其中填充了 ImageViews 和 textViews。imageViews 是从 sdCard 动态加载的。我的问题是我有更高分辨率的图像,为了列表的目的,我需要它们像缩略图一样小得多。那么如何将图像缩放为像 imageView?

4

4 回答 4

2

我希望下面的这段代码对你有用

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;
}
于 2013-10-16T10:33:11.837 回答
0

这是规模的代码

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;
}
于 2013-10-16T10:34:53.370 回答
0

此代码有助于根据您的 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);
}

的xml代码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"/>

礼貌:http ://www.anddev.org/resize_and_rotate_image__-_example-t621.html

于 2013-10-16T10:35:11.287 回答
0

您还可以使用图像视图中的 setMax:

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

您还可以为此使用 XML 属性

使用这种方式的问题是您正在设置最大尺寸,因此较小的图像不会填充图像视图

于 2013-10-16T17:20:41.043 回答