android:运行时调整大小的图像质量

时间:2010-01-11 10:36:56

标签: android image drawing resize draw

我想使用drawBitmap()方法显示图像。但在我想根据屏幕尺寸调整大小之前。我的结果图像质量有问题。您可以在下面看到屏幕截图和测试代码。如何在运行时以高质量调整图像大小?

感谢您提供解决方案。

原始图片: alt text http://dl.dropbox.com/u/709109/gradient.png

设备上的结果截图: alt text http://dl.dropbox.com/u/709109/device.png

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;

import java.io.IOException;
import java.io.InputStream;

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LinearLayout container = (LinearLayout) findViewById(R.id.container);
        container.addView(new View(this) {
            @Override
            protected void onDraw(Canvas canvas) {
                Bitmap unscaledBitmap;
                try {
                    InputStream in = getAssets().open("images/gradient.png");
                    unscaledBitmap = BitmapFactory.decodeStream(in);
                    in.close();
                    canvas.drawBitmap(unscaledBitmap, null, new Rect(0, 0, 320, 480), null);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

6 个答案:

答案 0 :(得分:15)

不要在绘图时调整大小(这将是非常昂贵的),而是尝试在屏幕外位图中调整大小并确保位图为32位(ARGB888)。

答案 1 :(得分:10)

请参阅下面的Romain's answer

我想删除这个答案,但我无法将其标记为已接受。


请注意,Android [最初编写此答案时,未明确请求32位颜色] 只会执行16位颜色,因此有时会出现不需要的瑕疵。

您还可以尝试使用抖动选项告诉Android自动应用抖动,虽然不完美,但可以帮助让事情看起来更好。

答案 2 :(得分:2)

查看http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html(与...一起使用     unscaledBitmap = BitmapFactory.decodeStream(in);

您可以为图像添加质量设置。我猜测质量正在下降,因为您没有通过任何设置来处理图像。

答案 3 :(得分:1)

当您尝试缩放没有实际alpha值的ARGB_8888位图(即每个像素的alpha = 255)时,在较旧的平台(API级别< 12)上实现createScaledBitmap(..)方法会导致问题,因为他们的hasAlpha标志设置为false。在这种情况下,缩放的位图会自动转换为RGB_565格式。

因此,自API级别12以来,有一种方法(在类Bitmap中)

setHasAlpha(boolean value);

使用createScaledBitmap(..)时,这有助于防止转换。

有一种方法可以在API级别上使用相同的方法>它已存在很长一段时间,只是隐藏起来。这里描述了包括源代码在内的所有必要步骤:

https://stackoverflow.com/a/12202069/1082933

希望这有帮助。

答案 4 :(得分:0)

我遇到了类似的问题,这就是我最终做的事情:Quality problems when resizing an image at runtime

答案 5 :(得分:-1)

此外,如果您的调整大小功能不符合图像的宽高比,则质量会受到影响。您可以在网上找到一些调整大小算法,例如check this out