圆角图片

自定义圆角/圆形头像裁切

416 次访问

图片圆角

拖入或点击选择图片
统一圆角 / 四角独立 / iOS Squircle 风

使用提示

· 统一圆角:四角同值,最常见做法

· 四角独立:用于做卡片"上方圆下方平"等特殊形状(如聊天气泡)

· 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),圆形区域仅覆盖短边,长边内容完全丢失,建议先手动裁剪为正方形再使用。

原理图

上传图片选择本地图片文件Canvas 绘制圆角clip() 裁剪路径无服务器参与下载结果PNG / 自定义尺寸⚡ 全在浏览器内完成,图片不上传服务器隐私安全 · 即时处理 · 无需等待
用户输入 本地处理 输出结果

开发者集成

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 个高频疑问

怎么用这个工具给图片加圆角?需要上传到服务器吗?
不需要上传。工具完全在浏览器本地运行,选择图片后,页面会实时显示原图和一个可拖拽的圆角滑块或半径输入框。调整半径到满意后,点击「下载」按钮即可保存带圆角的 PNG 图片。整个处理过程不经过任何服务器,图片数据只停留在你的设备内存里,关闭页面即清除。
为什么我裁切出来的圆角图片边缘有锯齿或毛边?
锯齿通常出现在图片本身分辨率较低(如 200×200 以下)或保存时选择了低画质 JPEG 格式。本工具输出为 PNG 格式,本身无损,但原图边缘像素不足时浏览器渲染圆角会产生锯齿。建议:① 使用原图分辨率至少 500×500 以上的图片;② 如果原图背景是白色,裁切前先确认图片主体边缘与背景对比度足够,否则圆角区域会混入背景色。
这个工具能裁切圆形头像吗?和圆角有什么区别?
可以。工具提供了「圆角矩形」和「圆形」两种裁切模式。圆形模式相当于把圆角半径拉到最大(半径=图片宽或高的一半),裁切结果是一个正圆。区别在于:圆角矩形保留矩形主体,四个角变成圆弧;圆形则完全裁剪为圆形,四个角被切掉。微信/QQ 头像常用圆形,公众号封面常用圆角矩形。
裁切后的图片背景是透明的吗?我想用在 PPT 或海报上。
默认输出为 PNG 格式,圆角以外的区域是透明背景(Alpha 通道),可以直接叠加到 PPT、海报或网页上,不需要再抠图。如果原图本身有白色或纯色背景,裁切后圆角边缘会保留原背景色,建议先用去背景工具处理后再裁切。部分浏览器预览时可能显示白色占位背景,下载后的 PNG 文件在专业软件中打开即可看到透明区域。
工具支持批量处理多张图片吗?一次能上传几张?
本工具为单张处理设计,一次只能上传一张图片。如果需要批量给多张图片加相同圆角,可以手动重复操作——因为所有处理都在本地,不依赖网络,每张处理速度很快(通常 1-2 秒)。目前没有批量上传按钮,也不支持拖拽多文件。如果需要批量处理,可以先用 PS 动作或在线批量工具(如 TinyPNG 的批量功能)配合此工具使用。
为什么我下载的圆角图片比原图小?是不是被压缩了?
下载的是 PNG 格式,属于无损压缩,图片质量没有损失。文件变小是因为圆角区域被裁切为透明像素,这些透明像素的信息量比原图彩色像素少,PNG 压缩算法会优化存储,所以体积减小。如果原图是 JPEG(有损压缩),转换为 PNG 后体积反而可能变大。文件大小变化是正常的,不代表画质下降。
我在手机上能用这个工具吗?操作和电脑上一样吗?
可以。工具页面自适应移动端,手机浏览器(微信内置浏览器、Chrome、Safari 等)均可使用。操作方式相同:点击上传按钮从相册选择图片,调整圆角半径或选择圆形模式,点击下载保存到相册。注意:部分手机浏览器下载图片时可能弹出「下载失败」提示,可以尝试长按结果图片→「保存图片」来替代。
裁切后图片的尺寸会变吗?我想保留原图大小。
尺寸不会改变。原图的宽度和高度像素值保持不变,只是四个角被裁切成圆角或圆形,背景区域变为透明。例如一张 800×600 的图片,裁切后仍然是 800×600 像素,圆角区域为透明。如果输出后感觉图片「变小了」,可能是预览时浏览器缩放了显示,下载后的文件属性中可查看实际像素尺寸。
选择 打开 +新窗口 esc关闭