安卓生成png背景变黑以及网络上一段可能误导的代码

如果你保存成本地文件,背景真的变黑了,注意是真的!因为,有很多看图软件的背景是黑色的,当png透明时,当然也是黑色的,但是,换到ps里,或者其他看图软件中,就看出透明了。
如果真的变黑,原因九成是Bitmap对象在处理的过程中,有一个地方的颜色配置不对,以下生成Bitmap的方法:

Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);


Config.ARGB_8888是图片的配置,A代表透明度。

如果参数是不带A的,比如是Config.RGB_565,那么就肯定黑了。这和在window上,png另存为jpg,通常默认背景会变成白色的一样。


而在需要生成Bitmap,或者保持Bitmap到本地的过程中,往往需要将Drawable转成Bitmap,然后才能够通过bitmap.compress(CompressFormat.PNG, 100, fos);方法保存到指定的地方。那么怎么将Drawable转成Bitmap呢?网络上广泛流传着这样一种写法:


public static Bitmap drawableToBitmap(Drawable drawable) {
 Bitmap bitmap = Bitmap.createBitmap(
                                        drawable.getIntrinsicWidth(),
                                        drawable.getIntrinsicHeight(),
                                        drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                                                        : Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        //canvas.setBitmap(bitmap);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        drawable.draw(canvas);
        return bitmap;
}



乍一看,很正确,很正常。然而,实际使用过程中,往往就是它导致转换后的图片背景变黑。该方法使用三目运算符确定Bitmap的颜色配置:


drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RB_565



这么做本来无可厚非,但关键是Bitmap.Config.RGB_565,这个配置文件是不包含A通道的,也就是不支持透明,当图片存在透明像素时,它给自动搞掉了,于是就变黑。这么写,极易导致png图变黑,透明Drawable变黑。</span>





因为不是所有Drawable获取不透明度的方法getOPacity()返回的值都是PixelFormat.TRANSLUCENT(透明);

只要任何一个Drawable的这个方法,返回的值为PixelFormat.OPAUE(不透明)时(可能发生在自定义Drawable中),那么就使用了无透明通道的颜色配置。

所以,事实上,我们可以定死它的颜色配置文件,Bitmap.createBitmap(width, height, Config.ARGB_8888);管他是否不透明,不透明时,ARGB照样可以做,但透明时,RGB就明显做不了。


另外,这个方法还可能引起崩溃,比如当Drawable为ShapeDrawable时。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值