Обрезка изображения по пути (проблема с масштабированием)

Приложение, которое я использую для тестирования, может сделать снимок и сохранить его в формате 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 к путям и переведено в 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)))

закомментированы, я вижу, что я ожидаю.

Благодаря изображению ниже и наличию его в качестве фона при перезапуске приложения.

Но когда они присутствуют (не закомментированы), я получаю фон в дальнейшем при перезапуске приложения (конечно же, делая ту же фотографию при запуске):

Если все работает как надо, мышь должна появиться внутри эллиптического клипа того же размера, что и на первом рисунке (не увеличена, как сейчас).

0 ответов

Другие вопросы по тегам