如何基于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
相关产品推荐
相关产品推荐

