在android中创建缩放位图时保持图像质量

Posted

技术标签:

【中文标题】在android中创建缩放位图时保持图像质量【英文标题】:Maintaining Image quality when creating scaled bitmap in android 【发布时间】:2011-12-04 00:41:14 【问题描述】:

我有一个尺寸为 960x800 的图像,我正在尝试让它填满屏幕。

我目前的做法是加载完整的 960x800 位图并使用源和目标 Rect 对象。到目前为止,我的目标矩形是 480x320(我的屏幕尺寸),源矩形是 960x800。

background = BitmapFactory.decodeResource(getResources(), R.drawable.background, null);
destRect = new Rect(0,0, screenWidth, screenHeight);
sourceRect = new Rect(0,0, background.getWidth(), background.getHeight());
...
c.drawBitmap(background, sourceRect, destRect, backgroundPaint);

如果我在尝试画布背景时使用Paint 对象并将抖动设置为真,则图像看起来绝对完美。

Paint backgroundPaint = new Paint();
backgroundPaint .setDither(true);

我得出的结论是,这可能效率不高,导致每次绘制调用都需要做不必要的工作。为了解决这个问题,我想尝试执行以下操作:

background = BitmapFactory.decodeResource(getResources(), R.drawable.background, null);
background = Bitmap.createScaledBitmap(background, display.getWidth(), display.getHeight(), true);

从而创建一个已经调整大小的位图,消除对任何Rect 对象的需求。但是,这样做时,我无法保持与上述方法相同的图像质量。事实上,如果我不使用上述方法使用Paint 对象,图像看起来类似于可以看到的图像。在缩放的位图上使用绘制对象似乎没有任何效果。

举个例子说明我的图片看起来如何,它类似于this图片(虽然没有那么严重)

我可以做些什么来获得相同的图像质量?

【问题讨论】:

【参考方案1】:

如果您希望图像的宽度为 140,则此条件会自动调整高度的大小

    Bitmap originalBitmap = BitmapFactory.decodeFile(getResources(), R.drawable.background, null);
    Bitmap bitmap=originalBitmap;
    if (bitmap !=null) 
        int h = bitmap.getHeight();
        int w = bitmap.getWidth();
        h = 140*h/w;
        w = 140;
        bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true);
        setIconImage(bitmap);
    

【讨论】:

以上是关于在android中创建缩放位图时保持图像质量的主要内容,如果未能解决你的问题,请参考以下文章

brcc32 无效位图格式(降低图像质量)

缩放位图保持纵横比

Android Java:在保持质量的同时缩小位图?

如何在缩放时保持图像的文本清晰度?

Android 如何使用 BitmapFactory 选项缩放图像

在 c# 中从图像中创建具有特定像素格式的位图而不加载图像