Я пытаюсь обрезать изображение в квадрат, но как только я на самом деле попытаюсь сделать обрезку с помощью CGImageCreateWithImageInRect(), эта строка выйдет из строя. Я установил точки останова и убедился, что аргументы, переданные в эту функцию, не ноль.CGImageCreateWithImageInRect() return nil
Я довольно новичок в программировании и Swift, но искал вокруг и не нашел решения для моей проблемы.
Причина неудачи:
fatal error: unexpectedly found nil while unwrapping an Optional value
func cropImageToSquare(imageData: NSData) -> NSData {
let image = UIImage(data: imageData)
let contextImage : UIImage = UIImage(CGImage: image!.CGImage!)
let contextSize: CGSize = contextImage.size
let imageDimension: CGFloat = contextSize.height
let posY : CGFloat = (contextSize.height + (contextSize.width - contextSize.height)/2)
let rect: CGRect = CGRectMake(0, posY, imageDimension, imageDimension)
// error on line below: fatal error: unexpectedly found nil while unwrapping an Optional value
let imageRef: CGImageRef = CGImageCreateWithImageInRect(contextImage.CGImage, rect)!
let croppedImage : UIImage = UIImage(CGImage: imageRef, scale: 1.0, orientation: image!.imageOrientation)
let croppedImageData = UIImageJPEGRepresentation(croppedImage, 1.0)
return croppedImageData!
}
Я готов держать пари, что 'rect' не прав. Я не уверен, что вы делаете, но вы устанавливаете его на высоту плюс половину разницы между шириной и высотой (которая сама по себе не имеет смысла для меня), но затем пытается получить прямоугольник, который начинается с этого 'posY', но затем снова является высотой изображения. Таким образом, 'posY' плюс эта странная высота, вероятно, дает« CGRect », который не соответствует размеру исходного изображения. Я уверен, что 'CGImageCreateWithImageInRect' терпит неудачу, потому что он не может использовать' rect', который вы передали ему. – Rob
Кроме того, вы также конвертируете данные в 'UIImage', получая его' CGImage', создавая из него еще один 'UIImage', а затем снова получая' CGImage'. Все это кажется излишне запутанным. Я не уверен, что вы пытаетесь сделать с 'contextImage', но я бы ушел в отставку и просто использую ваш' image.CGImage' при вашем вызове 'CGImageCreateWithImageInRect'. – Rob
То, что я пытаюсь сделать с 'posY', заключалось в том, чтобы обрезать квадрат из центра изображения, а не сверху. Кроме того, хотя я ограничиваю только портретные изображения, распечатка 'contextSize' даст мне высоту и ширину. (Высота была фактически меньше ширины, почему-то) –