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

如何在PyMuPDF中使用贝塞尔曲线绘制圆角矩形?

在PyMuPDF中绘制圆角矩形的实现方法

PyMuPDF确实没有原生的圆角矩形绘制方法,但可以通过Shape.draw_bezier()(三次贝塞尔曲线)拼接路径来实现,核心思路是用直线连接矩形的直边部分,用贝塞尔曲线近似圆角的圆弧部分。

实现代码

import fitz

def draw_rounded_rect(shape, x0, y0, x1, y1, radius):
    # 计算贝塞尔曲线近似90度圆弧的控制系数
    k = 4 * (2**0.5 - 1) / 3
    r = radius
    
    # 初始化路径:移动到底边左侧的圆角起点
    shape.moveto(x0 + r, y0)
    # 绘制底边直边
    shape.lineto(x1 - r, y0)
    # 绘制右下角圆角(贝塞尔曲线)
    shape.draw_bezier(
        (x1, y0),
        (x1, y0 + r * k),
        (x1 - r * k, y0 + r),
        (x1, y0 + r)
    )
    # 绘制右边直边
    shape.lineto(x1, y1 - r)
    # 绘制右上角圆角
    shape.draw_bezier(
        (x1, y1),
        (x1 - r * k, y1),
        (x1 - r, y1 - r * k),
        (x1 - r, y1)
    )
    # 绘制顶边直边
    shape.lineto(x0 + r, y1)
    # 绘制左上角圆角
    shape.draw_bezier(
        (x0, y1),
        (x0 + r * k, y1),
        (x0 + r, y1 - r * k),
        (x0 + r, y1 - r)
    )
    # 绘制左边直边
    shape.lineto(x0, y0 + r)
    # 绘制左下角圆角
    shape.draw_bezier(
        (x0, y0),
        (x0, y0 + r * k),
        (x0 + r * k, y0),
        (x0 + r, y0)
    )
    # 闭合路径,形成完整的圆角矩形
    shape.close_path()

# 示例使用
doc = fitz.open()
page = doc.new_page(width=300, height=200)
shape = page.new_shape()

# 调用函数绘制圆角矩形:参数分别为左下角坐标、右上角坐标、圆角半径
draw_rounded_rect(shape, 50, 50, 250, 150, 20)

# 设置样式:描边颜色、填充颜色、线条宽度
shape.set_stroke_color(fitz.utils.get_color("blue"))
shape.set_fill_color(fitz.utils.get_color("#f0f8ff"))
shape.set_line_width(2)

# 将形状提交到页面
shape.commit()

# 保存文档
doc.save("rounded_rect.pdf")
doc.close()

关键说明

  • 系数k是用于近似90度圆弧的贝塞尔曲线控制参数,值为4*(√2-1)/3,能让贝塞尔曲线尽可能贴近标准圆弧的弧度。
  • 每个圆角通过draw_bezier()绘制,传入的四个参数分别是两个控制点和终点(起点为当前路径的最后位置)。
  • 完成路径构建后,可通过set_stroke_color()、set_fill_color()等方法设置样式,最后调用commit()将形状渲染到页面。

内容的提问来源于stack exchange,提问作者Kikolo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:31:00