Обрезка изображения по пути (проблема с масштабированием)
Приложение, которое я использую для тестирования, может сделать снимок и сохранить его в формате 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)))
закомментированы, я вижу, что я ожидаю.
Благодаря изображению ниже и наличию его в качестве фона при перезапуске приложения.
Но когда они присутствуют (не закомментированы), я получаю фон в дальнейшем при перезапуске приложения (конечно же, делая ту же фотографию при запуске):
Если все работает как надо, мышь должна появиться внутри эллиптического клипа того же размера, что и на первом рисунке (не увеличена, как сейчас).