android.widget.ImageView缩放会产生难看的结果

时间:2013-01-18 14:27:11

标签: android bitmap imageview scaling

我正在尝试在Android上的ImageView中缩放图像,但无论我尝试什么设置,缩小的图像总是看起来很难看。这是我的代码生成的图像:

http://i.imgur.com/4yubR.png?1

左侧的图像使用台式计算机上的ImageMagick进行预缩放。 ImageView显示此图像没有问题。右边的图像是实际由ImageView缩放的图像,你可以清楚地看到,它看起来很丑:/

产生上述两种图像的代码如下:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    RelativeLayout body = new RelativeLayout(this);

    for(int i = 0; i < 2; ++i)
    {
        ImageView iv;

        iv = new ImageView(this);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(34, 34);
        params.leftMargin = i*50;
        body.addView(iv, params);

        AssetManager am = this.getAssets();

        try
        {
            BufferedInputStream buf;
            if(i == 0)
                buf = new BufferedInputStream(am.open("images/search_34x34.png"));
            else
                buf = new BufferedInputStream(am.open("images/search.png"));

            Bitmap bitmap = BitmapFactory.decodeStream(buf);
            BitmapDrawable bd = new BitmapDrawable(bitmap);
            bd.setAntiAlias(true);
            iv.setImageDrawable(bd);
            buf.close();
        }
        catch(java.io.IOException e)
        {
        }
    }

    setContentView(body);
}

请告诉我,如果我遗失了什么。我简直无法相信Android会严重缩放图像(实际上,我发现很难相信这是默认行为)。

另请注意,我不想预先缩放图像,因为我的应用必须处理来自未知来源的图像,所以我必须动态缩放。

2 个答案:

答案 0 :(得分:0)

也许您必须在xml布局中设置scaleType。例如

     <ImageView
          android:scaleType="center"
       </ImageView>

有以下scaleTypes:

  1. CENTER
  2. CENTER_CROP
  3. CENTER_INSIDE
  4. FIT_CENTER
  5. FIT_END
  6. FIT_START
  7. FIT_XY
  8. MATRIX
  9. 你可以在这里看到:

    http://developer.android.com/reference/android/widget/ImageView.ScaleType.html

    修改

    尝试了一些东西,现在我得到的结果与其他照片相同。我意识到,当我缩小手机内的图像时,一切看起来都不错。我使用的例如是一个120x120 dp的imageView和一个300x300px的资源。如果我在平板电脑上使用相同的imageView,即使是120x120,以及相同大小的相同资源图像,它看起来非常糟糕。我认为摆脱这种情况的唯一方法是将应用程序外部的图像缩放到所需的大小,然后再将其设置为您的项目。例如,如果使用带有200x200dp的imageView,请将图像缩放到此大小附近。如果您支持多种屏幕尺寸,并且将平板电脑的此imageView的尺寸设置为500x500dp,请将图像缩放到此尺寸附近。当然,如果你的图像分辨率高于最大的imageView,那么这只会很好用。 我知道这不是令人满意的答案,但这是我看到这个问题的唯一方法。

答案 1 :(得分:0)

我看不到你缩小位图的位置。我认为您正在尝试将高分辨率位图插入到尺寸较小的ImageView中。

Here is a document on scaling the bitmaps。所描述的技术也适用于动态缩放位图。