13

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

感谢您的解决方案。

原始图片: 替代文字 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();
                }
            }
        });
    }
}
4

6 回答 6

15

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

于 2010-01-11T16:50:58.793 回答
10

请参阅下面的Romain 的回答

我想删除这个答案,但我不能,因为它被标记为已接受。


请注意,Android [最初编写此答案时,没有明确请求 32 位颜色]只会使用 16 位颜色,因此有时您可能会得到不需要的伪像。

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

于 2010-01-11T11:25:05.267 回答
2

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

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

于 2010-01-11T10:47:27.543 回答
1

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

因此,由于 API 级别 12 有一个方法(在位图类中)

setHasAlpha(boolean value);

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

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

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

希望这可以帮助。

于 2012-08-30T18:07:55.957 回答
0

我遇到了类似的问题,这就是我最终要做的:在运行时调整图像大小时的质量问题

于 2010-11-22T23:34:29.203 回答
-1

此外,如果您的调整大小功能不考虑图像的纵横比,则质量会受到影响。你可以在网上找到一些调整大小的算法,例如看看这个

于 2010-01-11T11:11:12.280 回答