Bitmap之RGB_565

时间:2024-03-29 22:25:55

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);
    }}

效果:

Bitmap之RGB_565



Bitmap之RGB_565


无法得出结论

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

Bitmap之RGB_565



这是RGB_565的:

Bitmap之RGB_565


这下终于看出眉目了吧,把bitmap颜色模式改成RGB_565之后,本来有透明像素的位图变得没有透明像素,透明像素被黑色取代,所以我怀疑原来的代码是错的,方式是错的,原来我或许并没有修改到图片的颜色模式。


暂时的结论


RGB_565是没有透明属性的,有透明像素的位图,设置成此模式后,透明像素会变为黑色。


在验证中发现的问题


bitmap.getAllocationByteCount()并不能获取到Bitmap占用的内存大小,因为会报空指针异常,至于为什么,我不知道。
获取其占用内存大小,可以图片长度*图片宽度*4,这个只针对其默认的颜色模式ARGB_8888,其它颜色模式同理可得。