4

这是我第一次有一个问题,尽管进行了彻底的搜索,但似乎还没有被问到。

我遇到了一个问题,即无论输入的配置如何,Bitmap.createScaledBitmap()生成的缩放位图总是。ARGB_8888自然,在使用有限的内存时,这是一个问题。

        InputStream is;
    try {
        is = mAssets.open("test.png");
        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inPreferredConfig = Config.ARGB_4444;
        Bitmap originalBitmap = BitmapFactory.decodeStream(is, null, opts);
        System.out.println("Original Config: " + originalBitmap.getConfig());
        mScale = (float) mHeight / originalBitmap.getHeight();
        mBitmapScaled = Bitmap.createScaledBitmap(originalBitmap, (int)(mScale*(float)originalBitmap.getWidth()),
                (int)(mScale*(float)originalBitmap.getHeight()), true);
        System.out.println("Scaled: " + mBitmapScaled.getConfig());
        originalBitmap.recycle();
        is.close();
    } catch (IOException e) {
        // Do something.
    }

上面的代码返回输出:

原始位图:ARGB_4444

缩放:ARGB_8888

由于该Bitmap.createScaledBitmap()方法不采用配置,因此似乎没有办法防止这种情况。有任何想法吗?

4

1 回答 1

4

createScaledBitmap(...)创建一个新的缩放位图,因此将您提供的参数传递给该createBitmap(...)方法。

以下是来自源代码的片段createBitmap(...)

    if (config != null) {
        switch (config) {
            case RGB_565:
                newConfig = Config.RGB_565;
                break;
            case ALPHA_8:
                newConfig = Config.ALPHA_8;
                break;
            //noinspection deprecation
            case ARGB_4444:
            case ARGB_8888:
            default:
                newConfig = Config.ARGB_8888;
                break;
        }
    }

如您所见,每个具有ARGB_4444配置的位图都会转换为位图。ARGB_8888所以回答你的问题:不,没有办法阻止这种情况(除非你想复制部分 Bitmap.java 源代码并创建自己的缩放方法)。

为什么带有ARGB_4444配置的位图会转换为ARGB_8888?

文档是这样说的:

ARGB_4444

该字段已弃用。由于此配置质量较差,建议ARGB_8888改用。

于 2013-06-20T17:22:02.740 回答