如果真的变黑,原因九成是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时。