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()メソッドは Config を使用しないため、これを防ぐ方法はないようです。何か案は?

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 に答える