Bitmap之RGB_565

  • Post author:
  • Post category:其他


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

效果图2


无法得出结论

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的:

RGB565

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


暂时的结论

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


在验证中发现的问题

bitmap.getAllocationByteCount()并不能获取到Bitmap占用的内存大小,因为会报空指针异常,至于为什么,我不知道。


获取其占用内存大小,可以图片长度*图片宽度*4,这个只针对其默认的颜色模式ARGB_8888,其它颜色模式同理可得。



版权声明:本文为qq_23263825原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。