CGContextClipToMask不会在iOS中剪裁图像

时间:2016-01-25 04:52:56

标签: ios swift uigraphicscontext

我正在尝试将UIImage保存到照片库,并使用以下方法执行此操作:

func savePhoto() {
    UIGraphicsBeginImageContextWithOptions(CGSize(width: device.x, height: device.y), false, 2.0)
    CGContextClipToRect(UIGraphicsGetCurrentContext(), self.drawingCanvas)
    self.mainImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: device.x, height: device.y), blendMode: CGBlendMode.Normal, alpha: 1.0)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    UIImageWriteToSavedPhotosAlbum(image, self, "image:didFinishSavingWithError:contextInfo:", nil)
}

图像保存成功,但问题是图像没有裁剪到CGRect drawingCanvas的大小,但导出的图像是相应屏幕的大小。

由于drawingCanvas只是屏幕大约2/3的大小,因此最终图像中会留下一个大的空白区域。

此外,如果我打印CGContextGetClipBoundingBox(UIGraphicsGetCurrentContext()),它会打印正确的尺寸,这与drawingCanvas相同。

任何人都知道为什么最终图像没有剪裁?

1 个答案:

答案 0 :(得分:2)

CoreGraphics正在剪裁它应该如何。 "剪辑"意味着"对于后续的绘图调用,只在我提供的矩形内绘制,而不是在它之外绘制"。这就是为什么你看到图像外面有白色区域的原因。

剪切使您的上下文变小,并且使结果图像变小。裁剪与裁剪不同。

如果您希望结果图像更小,则应将传递的大小更改为UIGraphicsBeginImageContextWithOptions。它不必基于任何特定设备。

从您的问题中不清楚您真正想要的尺寸。但是,如果您希望它基于绘图画布的大小,请改为使用它:

UIGraphicsBeginImageContextWithOptions(self.drawingCanvas, false, 2.0)
self.mainImageView.image?.drawInRect(CGRect(origin: CGPoint.zero, size:self.drawingCanvas))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()