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

如何基于CGPoints导出仅含签名的自适应尺寸精准像素图像?

实现自适应签名内容的图像导出

要导出仅包含签名内容的自适应尺寸图像,核心是先计算出签名的最小包围边界框,再从原画布图片中裁剪对应区域,具体实现如下:

步骤1:计算签名的边界框

遍历你已保存的lines数组中的所有触摸点,确定签名的最小/最大X、Y坐标,再考虑画笔宽度扩展边界(避免裁剪掉线条边缘):

private func calculateSignatureBoundingBox() -> CGRect? {
    guard !lines.isEmpty else { return nil }
    
    var minX = lines[0].x
    var maxX = lines[0].x
    var minY = lines[0].y
    var maxY = lines[0].y
    
    for point in lines {
        minX = min(minX, point.x)
        maxX = max(maxX, point.x)
        minY = min(minY, point.y)
        maxY = max(maxY, point.y)
    }
    
    // 扩展边界以容纳画笔宽度,防止线条边缘被裁剪
    let padding = brushWidth / 2
    let boundingBox = CGRect(
        x: minX - padding,
        y: minY - padding,
        width: maxX - minX + padding * 2,
        height: maxY - minY + padding * 2
    )
    
    // 确保边界框不超出画布范围
    return boundingBox.intersection(canvasImageView.bounds)
}

步骤2:裁剪并导出图像

基于计算出的边界框,将原画布图片裁剪为仅包含签名的区域,注意转换UIKit与Core Graphics的坐标系差异:

func exportCroppedSignatureImage() -> UIImage? {
    guard let boundingBox = calculateSignatureBoundingBox(),
          let originalImage = canvasImageView.image else {
        return nil
    }
    
    // 转换坐标:UIKit原点在左上角,Core Graphics原点在左下角
    let cgBoundingBox = CGRect(
        x: boundingBox.origin.x,
        y: originalImage.size.height - boundingBox.origin.y - boundingBox.size.height,
        width: boundingBox.size.width,
        height: boundingBox.size.height
    )
    
    guard let croppedCGImage = originalImage.cgImage?.cropping(to: cgBoundingBox) else {
        return nil
    }
    
    return UIImage(cgImage: croppedCGImage)
}

关键注意事项

  • 确保lines数组完整记录所有触摸点:你的现有代码已在touchesBegan/touchesMoved/touchesEnded中追加点,若后续添加撤销功能,需同步更新lines数组。
  • 处理空签名情况:当lines为空时,exportCroppedSignatureImage会返回nil,导出时需做判断提示用户。
  • 坐标系转换不可省略:如果跳过这一步,裁剪出的图像会出现位置颠倒的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:33:27