Android联系人数据库保存带透明背景图片失效问题排查
Android联系人头像透明背景失效问题排查与解决
问题描述
在Android联系人数据库中添加联系人功能正常,但设置联系人头像时,将资源中的Vector转为Bitmap再转ByteArray后,保存为PNG格式的头像透明背景未生效。疑问:联系人数据库是否支持透明背景?还是Bitmap转换过程存在疏漏?
原转换代码
public static Bitmap getBitmapFromVectorDrawable(Context context, int drawableId) { Drawable drawable = ContextCompat.getDrawable(context, drawableId); drawable = (DrawableCompat.wrap(drawable)).mutate(); Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); paint.setARGB(255,255,255,255); canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; } public static byte[] toByteArray(Bitmap bitmap) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); return stream.toByteArray(); }
问题原因与修复
首先明确:Android联系人数据库完全支持透明背景的头像,问题出在你的Bitmap转换代码中。
你在getBitmapFromVectorDrawable里手动绘制了一个完全不透明的白色矩形,这行代码直接填充了整个Bitmap的背景,把原本的透明区域覆盖了:
canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);
修复后的代码
只需要移除绘制白色矩形的逻辑,保留VectorDrawable到Bitmap的正确转换流程即可:
public static Bitmap getBitmapFromVectorDrawable(Context context, int drawableId) { Drawable drawable = ContextCompat.getDrawable(context, drawableId); if (drawable == null) { return null; } drawable = DrawableCompat.wrap(drawable).mutate(); Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); // 移除白色背景绘制逻辑 drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; } // toByteArray方法无需修改 public static byte[] toByteArray(Bitmap bitmap) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); return stream.toByteArray(); }
补充说明
- 你已经正确使用了
Bitmap.Config.ARGB_8888配置,这个格式支持Alpha通道,是实现透明效果的必要条件; - PNG格式本身支持透明,所以
toByteArray的压缩逻辑没有问题; - 修复后可以先把转换后的Bitmap显示在ImageView中验证透明效果,再存入联系人数据库确认最终结果。
内容的提问来源于stack exchange,提问作者Chris Pi
相关产品推荐
相关产品推荐

