【问题标题】:android: quality of the images resized in runtimeandroid:在运行时调整大小的图像质量
【发布时间】:2011-01-03 17:09:24
【问题描述】:

我想使用 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();
                }
            }
        });
    }
}

【问题讨论】:

    标签: android image drawing resize draw


    【解决方案1】:

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

    【讨论】:

    • 我发现,Android 仅在使用 BitmapFactory.Options::inSampleSize->BitmapFactory.decodeResource() 但这仅允许在小于原始整数倍的范围内缩小比例。有没有办法在 Android 中使用比最近邻算法更好的方法(每次调用 createScaledBitmap()、createBitmap+matrix 和 e.t.c. 时使用)将 Android 缩小到我需要的精确分辨率?
    【解决方案2】:

    请参考下方Romain's answer

    我想删除此答案,但我无法删除,因为它已被标记为已接受。


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

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

    【讨论】:

    • 谢谢,这个回答很有帮助!但我没有声望投票。
    • 现在我正在使用“565 dither photoshop 插件”来准备我的图形。因为抖动是高成本操作,它不适用于 decodeStream 和 drawBitmap 方法。
    • Android 可以做 32 位就好了。只需确保您的位图和窗口都使用 ARGB8888 格式。
    • @RomainGuy 一直都是这样吗?只是想知道两年前我写这篇文章时是否属实..:)无论如何,我会优先删除我的答案,而不是你的答案,两年前我显然也赞成!
    • 这在 2 年前是真的,只是应用程序需要它。 32 位现在是默认值。
    【解决方案3】:

    签出http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html(与 unscaledBitmap = BitmapFactory.decodeStream(in);

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

    【讨论】:

    • BitmapFactory.Options 中的“质量设置”是什么?我什么都看不到,而且“质量”这个词在文档中也没有出现过一次。
    • developer.android.com/reference/android/graphics/…,但文档说它仅指JPEG解码,您的文件是PNG。
    【解决方案4】:

    当您尝试缩放没有实际 alpha 值(即每个像素的 alpha = 255)的 ARGB_8888 位图时,旧平台(API 级别

    因此,从 API 级别 12 开始,就有了一个方法(在 Bitmap 类中)

    setHasAlpha(boolean value);
    

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

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 不,两张图片的比例相同。原图:600x900 比例 1.5 新图尺寸:320x480 比例 1.5
        • 在您提供的链接中未找到任何大小调整算法。只是讨论正确的比例值计算......
        猜你喜欢
        • 2011-05-13
        • 1970-01-01
        • 2014-02-17
        • 2021-02-15
        • 1970-01-01
        • 2010-10-22
        • 2021-11-06
        • 2017-06-25
        • 1970-01-01
        相关资源
        最近更新 更多