如何移除Bitmap旋转后出现的黑色背景?多种方法未果求解决方案
解决Bitmap旋转后出现黑色背景的问题
我来帮你搞定这个头疼的问题!你遇到的黑色背景,是因为默认情况下Bitmap旋转后,超出原画布范围的空白区域会被填充为黑色(毕竟Bitmap默认是不透明的格式)。要解决这个问题,我们需要创建一个带透明通道的画布,把旋转后的内容绘制上去,让空白区域变成透明的。
具体修改思路
- 先计算旋转后Bitmap的实际宽高,避免内容被裁剪或者出现多余空白
- 创建ARGB_8888格式的透明Bitmap(该格式支持Alpha透明通道)
- 通过Canvas将旋转后的原Bitmap绘制到这个透明Bitmap上,确保空白区域为透明
修改后的代码片段
替换你原代码中Bitmap b = drawView.getDrawingCache(); b = Bitmap.createBitmap(...)这部分逻辑,改成下面的实现:
if (view.getId() == R.id.save_btn) { emojiOn = false; timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date()); drawView.setDrawingCacheEnabled(true); if (drawView.getDrawingCache() != null) drawView.destroyDrawingCache(); drawView.buildDrawingCache(); AlertDialog.Builder saveDialog = new AlertDialog.Builder(this); saveDialog.setTitle("Save drawing"); saveDialog.setMessage("Save drawing to device Gallery?"); saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Bitmap originalBitmap = drawView.getDrawingCache(); Matrix matrix = new Matrix(); matrix.setRotate(Rotation); // 计算旋转后Bitmap的实际尺寸 RectF rectF = new RectF(0, 0, originalBitmap.getWidth(), originalBitmap.getHeight()); matrix.mapRect(rectF); int rotatedWidth = (int) Math.round(rectF.width()); int rotatedHeight = (int) Math.round(rectF.height()); // 创建带透明背景的Bitmap Bitmap rotatedBitmap = Bitmap.createBitmap(rotatedWidth, rotatedHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(rotatedBitmap); // 初始化画布为透明 canvas.drawColor(Color.TRANSPARENT); // 调整画布位置,让旋转后的内容居中显示 matrix.postTranslate((rotatedWidth - originalBitmap.getWidth()) / 2f, (rotatedHeight - originalBitmap.getHeight()) / 2f); canvas.drawBitmap(originalBitmap, matrix, null); // 保存图片到相册 String imgSaved = MediaStore.Images.Media.insertImage(getContentResolver(), rotatedBitmap, timeStamp, "drawing"); if (imgSaved != null) Toast.makeText(getApplicationContext(), "Drawing saved to gallery!", Toast.LENGTH_SHORT).show(); else Toast.makeText(getApplicationContext(), "Oops! Image could not be saved.", Toast.LENGTH_SHORT).show(); // 回收Bitmap,避免内存泄漏 originalBitmap.recycle(); rotatedBitmap.recycle(); drawView.destroyDrawingCache(); } }); saveDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); saveDialog.show(); }
关键细节说明
Bitmap.Config.ARGB_8888:这是支持透明通道的核心格式,必须使用它才能实现透明背景canvas.drawColor(Color.TRANSPARENT):确保画布初始状态是透明,而非默认的黑色- 计算旋转后尺寸并居中:避免旋转后内容被裁剪,同时保证画面布局美观
- 回收Bitmap:用完后及时回收不再使用的Bitmap对象,防止内存溢出
这样修改后,你旋转后的图片空白区域就会变成透明,不会再出现烦人的黑色背景啦!
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

