图像剪切与路径(缩放问题)

时间:2016-01-08 03:33:02

标签: swift uibezierpath cgpath uiimagepngrepresentation image-clipping

我用于测试目的的应用程序能够拍照并将其保存为PNG文件。下次启动应用程序时,它会检查文件是否存在,如果存在,则存储在文件中的图像将用作应用程序的背景视图。到目前为止一切都还可以。

我决定在这个应用程序中添加一个剪贴蒙版,以防出现问题。 剪辑本身有效,但出于某种神秘的原因,剪切的图像会被扩展。如果有人能告诉我我做错了什么会非常有帮助。

以下是相关代码(如果需要,我可以提供更多信息):

    if let videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo) {
        stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) {
            (imageDataSampleBuffer, error) -> Void in
            if error == nil {
                var localImage = UIImage(fromSampleBuffer: imageDataSampleBuffer)
                var imageSize = CGSize(width: UIScreen.mainScreen().bounds.height * UIScreen.mainScreen().scale,
                    height: UIScreen.mainScreen().bounds.width * UIScreen.mainScreen().scale)
                localImage = resizeImage(localImage!, toSize: imageSize)

                imageSize = CGSize(width: imageSize.height, height: imageSize.width)
                UIGraphicsBeginImageContext(imageSize)
                CGContextRotateCTM (UIGraphicsGetCurrentContext(), CGFloat(M_PI_2))
                localImage!.drawAtPoint(CGPoint(x: 0.0, y: -imageSize.width))
                localImage = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()

                // Clipping code:
                localImage = maskImage(localImage!,
                    path: UIBezierPath(CGPath: CGPathCreateWithEllipseInRect(UIScreen.mainScreen().bounds, nil)))

                if let data = UIImagePNGRepresentation(localImage!) {
                    data.writeToFile(self.bmpFilePath, atomically: true)
                }
            } else {print("Error on taking a picture:\n\(error)")}
        }
    }

maskImage函数是这个(取自iOS UIImage clip to paths并转换为Swift):

func maskImage(originalImage :UIImage, path:UIBezierPath) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(originalImage.size, false, 0);
    path.addClip()
    originalImage.drawAtPoint(CGPointZero)
    let maskedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return maskedImage;
}

当行:

            localImage = maskImage(localImage!,
                path: UIBezierPath(CGPath: CGPathCreateWithEllipseInRect(UIScreen.mainScreen().bounds, nil)))

被评论出来,我看到了我的期望。

重新启动应用程序时,请将下面的图片作为背景信息。

enter image description here 但是当它们存在(没有注释掉)时,我会在重新启动应用程序时获得背景(当然,在开始时使用相同的图片):

enter image description here

如果事情有效,鼠标应该出现在椭圆形剪辑内,其大小与第一张图片相同(不会像现在那样放大)。

0 个答案:

没有答案