圆角图片
自定义圆角/圆形头像裁切
或四角独立设置(任一非 0 时覆盖统一圆角)
使用提示
· 统一圆角:四角同值,最常见做法
· 四角独立:用于做卡片"上方圆下方平"等特殊形状(如聊天气泡)
· iOS Squircle:苹果设计语言的"超椭圆"圆角,比标准圆角更柔和优雅,常用于 App 图标
· 圆形:圆角设为短边一半,图片变正圆(适合头像)
· 输出 PNG:保留圆角处透明区,可叠加到任意背景
关于本工具
了解工具定位 · 使用场景 · 对比优势
使用场景
社交头像统一
运营人员在多个平台(微信、钉钉、企业微信、飞书)上传团队头像时,不同平台对图片尺寸和圆角要求不同。本工具支持批量上传原图,统一裁切成圆形或指定圆角半径,一次导出适配各平台的头像规格,省去逐个裁剪的重复劳动。
电商商品图标
淘宝/拼多多卖家在制作商品详情页时,需要将产品主图裁切成统一的圆角矩形,以保持店铺视觉一致性。本工具提供圆角半径滑块,可实时预览裁切效果,输出 1:1 或 4:3 比例的圆角缩略图,无需打开 PS 或 Sketch。
校园证件照处理
学生或教务人员批量处理校园卡、准考证、毕业照时,要求将背景各异的照片统一裁切成圆形(直径 35mm 或 1 英寸)。本工具支持上传多张照片,一键裁切为圆形头像,保留原始分辨率,避免因手动裁剪导致的尺寸偏差。
App 用户头像
个人开发者或小团队在开发社交类 App 时,需要为用户上传的头像添加圆角蒙版。本工具支持自定义圆角半径(0-100%),可输出透明背景的 PNG 头像,直接用于 App 的圆形头像组件,无需后端额外处理。
直播间头像定制
抖音/快手主播在设置直播间头像时,希望将个人照片裁切成圆形并添加白边或阴影效果,以突出视觉焦点。本工具支持圆角裁切后叠加边框样式(颜色/粗细可调),输出适配直播平台的头像尺寸,提升直播间辨识度。
对比矩阵本工具 vs 竞品 vs 传统方法
| 维度 | 本工具 | 竞品 A (Canva) | 传统方法 |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,不上传服务器 | 上传至 Canva 服务器处理 | 需将图片发送给设计师或打印店,隐私风险最高 |
| 处理速度 | 即时处理,通常 1 秒内 | 取决于网络和服务器负载,通常 5-15 秒 | 数小时到数天,取决于沟通和排期 |
| 离线可用 | 支持,完全离线运行 | 不支持,必须联网 | 不支持,依赖人工 |
| 操作门槛 | 零门槛,上传即用 | 需注册账号,学习编辑界面 | 需沟通需求,依赖他人审美 |
| 收费 | 免费 | 免费功能有限,无水印导出需付费 | 按张或按小时收费,成本较高 |
| 自定义精度 | 支持精确到像素的圆角半径 | 提供预设圆角选项,精细控制有限 | 取决于设计师理解,沟通成本高 |
使用指南
上手步骤 · 输入输出 · 避坑提示
输入输出示例7 个典型场景,覆盖常规、边界与易错
| 输入 | 输出 | 说明 |
|---|---|---|
| 上传一张 800×800 像素的正面头像照片,选择“圆形”裁切,半径设为 200 像素 | 生成一张 400×400 像素的圆形头像,背景透明,圆形区域为原图中心 400×400 区域,超出部分裁剪为透明 | 典型场景:制作社交平台圆形头像 |
| 上传一张 1920×1080 像素的风景图,选择“圆角矩形”裁切,圆角半径设为 30 像素 | 生成一张 1920×1080 像素的圆角矩形图片,四个角为半径 30 像素的圆弧,其余部分保持不变 | 典型场景:为横幅或封面图添加圆角效果 |
| 上传一张 100×100 像素的图标,选择“圆形”裁切,半径设为 100 像素 | 生成一张 200×200 像素的圆形图标,原图被放大至完全填充圆形区域,超出部分裁剪为透明 | 边界 case:裁切半径大于原图短边,工具自动放大 |
| 上传一张 50×50 像素的小图标,选择“圆角矩形”裁切,圆角半径设为 100 像素 | 生成一张 50×50 像素的圆形图片(因圆角半径超过短边一半,实际变为正圆) | 边界 case:圆角半径超过短边一半,自动转为圆形 |
| 上传一张 2000×2000 像素的图片,选择“圆形”裁切,半径设为 0 像素 | 生成一张 0×0 像素的透明图片(无可见内容) | 边界 case:半径为 0 时无裁切区域,输出空图 |
| 上传一张 300×400 像素的竖版照片,选择“圆形”裁切,半径设为 150 像素 | 生成一张 300×300 像素的圆形头像,裁切区域为原图顶部 300×300 区域(默认居中对齐) | 易错 case:非正方形原图,用户需注意裁切区域对齐方式 |
| 上传一张带白色背景的 LOGO(如 500×500 像素),选择“圆角矩形”裁切,圆角半径设为 50 像素 | 生成一张 500×500 像素的圆角矩形 LOGO,四个角为半径 50 像素的圆弧,白色背景保留 | 易错 case:圆角裁切不会自动去除背景,需提前处理 |
常见错误对照7 个常踩的坑 · 错误 → 修复
1. 上传了透明背景的 PNG,但期望圆角后背景自动变白
上传一个透明背景的 PNG 图片,圆角裁切后直接下载,发现圆角区域是透明的,与预期不符上传前确认图片已有纯色背景(如白色),或使用工具自带的「填充背景色」功能(若有)将透明区域填为白色圆角裁切只改变图片形状,不修改原有透明通道。透明背景的图片裁切后,圆角部分会保留透明,不是工具 bug 而是图片本身特性
2. 用 JPEG 图片做圆角,但输出格式选了 PNG
上传一张 JPEG 图片,在输出格式下拉框中选择「PNG」,结果文件体积从 200KB 变成 1.2MB如果对透明背景无需求,直接保持输出格式为 JPEG 或与原图一致JPEG 不支持透明通道,但 PNG 支持。将 JPEG 转成 PNG 会丢失 JPEG 的压缩优势,体积膨胀 3-10 倍,且无透明需求时纯属浪费带宽
3. 上传前手动裁剪成正方形,再交给工具做圆形
先用其他软件把头像裁成 1:1 正方形,再上传到圆角工具做圆形裁切直接上传原始图片(任意比例),在工具中选择「圆形裁切」模式,工具会自动取图片中心区域裁切为圆形工具本身已内置中心裁剪逻辑,用户手动预裁切是多此一举,且可能因预裁切比例不对导致最终圆形区域丢失重要内容
4. 圆角半径设得太大,导致图片内容被切掉
一张 200×200 的头像,设置圆角半径 150px,结果图片几乎变成圆形,四个角的内容完全消失圆角半径不超过图片短边长度的 50%(如 200px 的图片,半径 ≤ 100px)圆角半径是每个角的圆弧半径,当半径 ≥ 短边的一半时,四个角的圆弧会相交,图片退化为圆形或胶囊形,不是所有场景都适用
5. 上传了 WebP 格式,但浏览器不支持下载为 WebP
上传 WebP 图片,圆角处理后点击下载,浏览器直接打开图片而不是弹出下载对话框如果浏览器行为异常,尝试将输出格式切换为 PNG 或 JPEG 再下载部分老旧浏览器(如 Safari 14 以下)不支持 WebP 下载或预览;工具基于浏览器处理,输出格式受浏览器能力限制
6. 期望圆角后图片尺寸不变,但实际文件体积变小了
上传一张 500KB 的 JPEG 头像,圆角后下载得到 200KB 的文件,认为工具压缩了画质检查输出格式和压缩质量设置;圆角裁切本身不会改变图片尺寸(像素数),但 JPEG 重新编码时默认质量可能低于原图工具在浏览器端重新编码图片时,JPEG 质量通常默认 0.92(92%),与原图可能不同;体积变化是编码参数差异,非工具错误
7. 上传了超大图片(4000×4000)做圆角,导致页面卡死
直接拖入一张 4000×4000 像素、8MB 的图片到工具中,浏览器标签页无响应 10 秒以上先用图片编辑软件将图片缩放到 1000×1000 以内再上传,或使用工具自带的「缩放」功能(若有)纯前端工具在浏览器内存中处理图片,超大图片会占用数百 MB 内存,导致页面卡顿甚至崩溃;移动端浏览器尤其脆弱
工作原理
公式推导 · 流程图解 · 依据出处
核心公式
R = min(W, H) / 2
变量说明
R— 圆角半径(像素)W— 原始图片宽度(像素)H— 原始图片高度(像素)
示例
一张 400×600 像素的头像照片,需要裁切成圆形。取 W=400,H=600,则 R = min(400, 600) / 2 = 200。以图片中心为圆心,半径 200 像素画圆,圆外部分透明化,得到直径 400 像素的圆形头像。
适用范围
适用于正方形或矩形图片裁切为完美圆形。若图片宽高比极大(如 100×1000),圆形区域仅覆盖短边,长边内容完全丢失,建议先手动裁剪为正方形再使用。
原理图
开发者集成
3 种主流语言 · 复制即用
from PIL import Image, ImageDraw
# 打开图片并转为 RGBA 模式(支持透明背景)
img = Image.open("input.jpg").convert("RGBA")
# 创建与图片同尺寸的透明蒙版
mask = Image.new("L", img.size, 0)
draw = ImageDraw.Draw(mask)
# 绘制圆角矩形(半径 50px)
width, height = img.size
radius = 50
draw.rounded_rectangle([(0, 0), (width-1, height-1)], radius=radius, fill=255)
# 应用蒙版:透明背景 + 圆角
result = Image.new("RGBA", img.size, (0, 0, 0, 0))
result.paste(img, (0, 0), mask)
result.save("output_rounded.png")
# 若需要圆形头像:将半径设为宽高最小值的一半
circle_radius = min(width, height) // 2
mask_circle = Image.new("L", img.size, 0)
draw_circle = ImageDraw.Draw(mask_circle)
draw_circle.ellipse([(0, 0), (width-1, height-1)], fill=255)
result_circle = Image.new("RGBA", img.size, (0, 0, 0, 0))
result_circle.paste(img, (0, 0), mask_circle)
result_circle.save("output_circle.png")package main
import (
"image"
"image/color"
"image/draw"
"image/png"
"log"
"math"
"os"
)
func main() {
// 打开输入图片
file, err := os.Open("input.jpg")
if err != nil {
log.Fatal(err)
}
defer file.Close()
src, _, err := image.Decode(file)
if err != nil {
log.Fatal(err)
}
bounds := src.Bounds()
width := bounds.Dx()
height := bounds.Dy()
// 创建带透明背景的目标图片
dst := image.NewRGBA(image.Rect(0, 0, width, height))
// 逐像素判断是否在圆角区域内(半径 50px)
radius := 50
for y := 0; y < height; y++ {
for x := 0; x < width; x++ {
// 判断是否在四个圆角之外
inCorner := false
// 左上角
if x < radius && y < radius {
dx := float64(x - radius)
dy := float64(y - radius)
if dx*dx+dy*dy > float64(radius*radius) {
inCorner = true
}
}
// 右上角
if x >= width-radius && y < radius {
dx := float64(x - (width - radius - 1))
dy := float64(y - radius)
if dx*dx+dy*dy > float64(radius*radius) {
inCorner = true
}
}
// 左下角
if x < radius && y >= height-radius {
dx := float64(x - radius)
dy := float64(y - (height - radius - 1))
if dx*dx+dy*dy > float64(radius*radius) {
inCorner = true
}
}
// 右下角
if x >= width-radius && y >= height-radius {
dx := float64(x - (width - radius - 1))
dy := float64(y - (height - radius - 1))
if dx*dx+dy*dy > float64(radius*radius) {
inCorner = true
}
}
if inCorner {
dst.Set(x, y, color.RGBA{0, 0, 0, 0}) // 透明
} else {
dst.Set(x, y, src.At(x, y))
}
}
}
// 保存结果
outFile, err := os.Create("output_rounded.png")
if err != nil {
log.Fatal(err)
}
defer outFile.Close()
png.Encode(outFile, dst)
}
// 圆形头像:将半径设为宽高最小值的一半,并裁剪为椭圆
func circleMask(width, height int) func(x, y int) bool {
r := float64(min(width, height)) / 2
cx, cy := float64(width)/2, float64(height)/2
return func(x, y int) bool {
dx := float64(x) - cx
dy := float64(y) - cy
return dx*dx+dy*dy > r*r
}
}
func min(a, b int) int {
if a < b {
return a
}
return b
}// 浏览器端使用 Canvas API 实现圆角/圆形裁剪
function applyRoundedCorners(imageUrl, radius, shape = 'rounded') {
const img = new Image();
img.crossOrigin = 'anonymous';
img.src = imageUrl;
img.onload = () => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
// 绘制圆角路径
ctx.beginPath();
if (shape === 'circle') {
// 圆形:以短边为直径
const size = Math.min(img.width, img.height);
const x = (img.width - size) / 2;
const y = (img.height - size) / 2;
ctx.arc(img.width / 2, img.height / 2, size / 2, 0, Math.PI * 2);
} else {
// 圆角矩形
const r = radius || 50;
ctx.moveTo(r, 0);
ctx.lineTo(img.width - r, 0);
ctx.quadraticCurveTo(img.width, 0, img.width, r);
ctx.lineTo(img.width, img.height - r);
ctx.quadraticCurveTo(img.width, img.height, img.width - r, img.height);
ctx.lineTo(r, img.height);
ctx.quadraticCurveTo(0, img.height, 0, img.height - r);
ctx.lineTo(0, r);
ctx.quadraticCurveTo(0, 0, r, 0);
ctx.closePath();
}
ctx.clip();
ctx.drawImage(img, 0, 0);
// 导出为 PNG(透明背景)
const dataUrl = canvas.toDataURL('image/png');
console.log('结果图片 data URL:', dataUrl);
// 可创建 <img> 标签显示:
// document.body.appendChild(Object.assign(new Image(), { src: dataUrl }));
};
img.onerror = () => console.error('图片加载失败');
}
// 使用示例:
// applyRoundedCorners('https://example.com/avatar.jpg', 30, 'rounded');
// applyRoundedCorners('https://example.com/avatar.jpg', 0, 'circle');常见问题
8 个高频疑问