gpt4 book ai didi

ios - CGImageCreateWithImageInRect() 返回零

转载 作者:行者123 更新时间:2023-11-28 08:44:33 24 4
gpt4 key购买 nike

我正在尝试将图像裁剪成正方形,但一旦我实际尝试使用 CGImageCreateWithImageInRect() 进行裁剪,此行就会崩溃。我设置了断点并确保传递给该函数的参数不为零。

我对编程和 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!

}

最佳答案

您的代码使用了很多带有 ! 的强制解包。我建议避免这种情况——编译器试图帮助您编写不会崩溃的代码。将可选链接与 ?if let/guard let 结合使用。

该特定行上的 ! 隐藏了 CGImageCreateWithImageInRect 可能返回 nil 的问题。 The documentation解释当 rect 不正确地位于图像边界内时会发生这种情况。您的代码适用于纵向图像,但不适用于横向图像。

此外,AVFoundation 提供了一个方便的功能,可以自动找到合适的矩形供您使用,称为 AVMakeRectWithAspectRatioInsideRect。无需手动进行计算:-)

以下是我的建议:

import AVFoundation

extension UIImage
{
func croppedToSquare() -> UIImage
{
guard let cgImage = self.CGImage else { return self }

// Note: self.size depends on self.imageOrientation, so we use CGImageGetWidth/Height here.
let boundingRect = CGRect(
x: 0, y: 0,
width: CGImageGetWidth(cgImage),
height: CGImageGetHeight(cgImage))

// Crop to square (1:1 aspect ratio) and round the resulting rectangle to integer coordinates.
var cropRect = AVMakeRectWithAspectRatioInsideRect(CGSize(width: 1, height: 1), boundingRect)
cropRect.origin.x = ceil(cropRect.origin.x)
cropRect.origin.y = ceil(cropRect.origin.y)
cropRect.size.width = floor(cropRect.size.width)
cropRect.size.height = floor(cropRect.size.height)

guard let croppedImage = CGImageCreateWithImageInRect(cgImage, cropRect) else {
assertionFailure("cropRect \(cropRect) was not inside \(boundingRect)")
return self
}

return UIImage(CGImage: croppedImage, scale: self.scale, orientation: self.imageOrientation)
}
}

// then:
let croppedImage = myUIImage.croppedToSquare()

关于ios - CGImageCreateWithImageInRect() 返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35677095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com