Bitmap 颜色模式RGB_565每个像素占2字节的内存,特点是没有透明度,即alpha值
这里我们来讨论其没有透明度细节
结论是:其有透明度呀
测试写的自定义View:
public class MyImageView extends ImageView {
private Paint paint;
public MyImageView(Context context) {
super(context);
}
public MyImageView(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setAlpha(255);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeResource(getResources(), R.mipmap.sauce, options);
options.inPreferredConfig= Bitmap.Config.RGB_565;
options.inJustDecodeBounds=false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.sauce, options);
canvas.drawBitmap(bitmap,0,0,paint);
}}
效果:
无法得出结论
1.背景为红色,为了验证其RGB_565是否支持PNG图片的透明像素,答案是支持。
2.两张图片其透明度有变化,通过设置paint的alpha,一个是255,一个是100,与RGB_565不支持alpha主流观点不太一样。
在此感觉好郁闷,希望有大神告诉我原因,是我验证方式有问题吗?
分隔线
后续
群里,一个热心的朋友回答了我,挺有道理的,也解决了我前面论证的不足,下面是原话:
rbg_565验证的是图片本身没有透明通道,但画笔设置为透明,会影响显示的透明度,而图片本身仍是木有透明通道,不知道这样理解对不对 笑哭
于是,我在MainActivity加入了如下代码测试
MyImageView imageView = (MyImageView) findViewById(R.id.iv);
Toast.makeText(this,imageView.getAlpha()+"",Toast.LENGTH_LONG).show();
测试结果,无论如何修改paint.setAlpha()的值,Toast弹出的都是1.0。
写到这里,已经证明了,我前面说的,RGB_565有透明度是不准确的,但还是无法证明其到底是否有透明度,我会继续验证
分隔线
经过自己的努力,终于有一点眉目了。
修改后的MyImageView
public class MyImageView extends ImageView {
public MyImageView(Context context) {
super(context);
}
public MyImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.sauce);
Bitmap bitmap1 = bitmap.copy(Bitmap.Config.RGB_565, true);
canvas.drawBitmap(bitmap1,0,0,new Paint());
}
}
效果图如下:
这是默认的,即ARGB_8888
这是RGB_565的:
这下终于看出眉目了吧,把bitmap颜色模式改成RGB_565之后,本来有透明像素的位图变得没有透明像素,透明像素被黑色取代,所以我怀疑原来的代码是错的,方式是错的,原来我或许并没有修改到图片的颜色模式。
暂时的结论
RGB_565是没有透明属性的,有透明像素的位图,设置成此模式后,透明像素会变为黑色。
在验证中发现的问题
bitmap.getAllocationByteCount()并不能获取到Bitmap占用的内存大小,因为会报空指针异常,至于为什么,我不知道。
获取其占用内存大小,可以图片长度*图片宽度*4,这个只针对其默认的颜色模式ARGB_8888,其它颜色模式同理可得。