这是我第一次有一个问题,尽管经过彻底的搜索,似乎还没有被问到.
我遇到了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.
}
上面的代码返回输出:
Original Bitmap: ARGB_4444
Scaled: ARGB_8888
由于Bitmap.createScaledBitmap()方法不采用Config,因此似乎没有办法阻止这种情况.有任何想法吗?
解决方法:
createScaledBitmap(…)创建一个新的缩放位图,因此将提供的参数传递给createBitmap(…)方法.以下是createBitmap(…)源代码中的snippet:
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:
This field is deprecated. Because of the poor quality of this
configuration, it is advised to use ARGB_8888 instead.
标签:android,bitmap,scaling,config
来源: https://codeday.me/bug/20190625/1283746.html