You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:15:00