Android Java如何实现从源Bitmap裁剪出甜甜圈(环形)形状图像
Android 环形(甜甜圈)Bitmap 裁剪实现方案
实现原理
核心使用Android图形库的PorterDuffXfermode图层混合能力,先生成对应尺寸的环形遮罩,再将源Bitmap与遮罩混合,仅保留环形范围内的图像内容。
完整实现代码
你现有的正方形裁剪逻辑可以直接复用,后续裁剪环形的完整代码如下:
// 你已有的正方形裁剪逻辑 int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; Bitmap squareBitmap = Bitmap.createBitmap(source, x, y, size, size); if (squareBitmap != source) { source.recycle(); // 不需要原Bitmap的话可回收以节省内存 } // 配置环形参数,可自行调整 float innerRadiusRatio = 0.5f; // 内圆半径占外圆的比例,值越大环越窄 Bitmap output = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 关闭硬件加速,避免PorterDuff模式兼容性问题 canvas.setLayerType(LAYER_TYPE_HARDWARE, null); // 第一步:绘制环形遮罩的外圆 float outerRadius = size / 2f; canvas.drawCircle(outerRadius, outerRadius, outerRadius, paint); // 第二步:挖掉中心内圆,得到环形遮罩 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); float innerRadius = outerRadius * innerRadiusRatio; canvas.drawCircle(outerRadius, outerRadius, innerRadius, paint); // 第三步:绘制源Bitmap,使用SRC_IN模式仅保留环形区域的图像 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(squareBitmap, 0, 0, paint); // 清空Xfermode,避免画笔复用异常 paint.setXfermode(null); squareBitmap.recycle(); // 最终output即为环形裁剪后的Bitmap
参数调整说明
- 修改
innerRadiusRatio可以调整环形的宽度:取值范围为0~1,值越大内圆越大,环形就越窄,比如设置为0.7时环宽仅为外圆半径的30%。 - 如果需要固定环宽,可以直接按像素计算
innerRadius = outerRadius - 固定环宽值即可。
内容的提问来源于stack exchange,提问作者Harkal
相关产品推荐
相关产品推荐

