根据获得最佳性能页面,
使用Core Graphics或Image I / O函数进行裁剪或缩减采样,例如函数CGImageCreateWithImageInRect或CGImageSourceCreateThumbnailAtIndex。
但是,如果你只是在Core Image中进行图像处理,我想知道这是多么真实。如果我有一个需要进行缩减采样然后过滤的图像以及其他内容,那么转换为CGImage,下采样,然后将其转换回CIImage用于其他用途会不会效率低下?
我想知道如果下采样是您正在执行的图像处理算法的一部分,那么在Core Image框架中工作是否会更好。当然,如果以上更快,我想尝试一下,但我不确定是否有其他方法可以尽可能快地下采样。不,不幸的是CILanczosScaleTransform非常慢,我希望Core Image有更快的方式来构建除此之外的图像。
答案 0 :(得分:1)
我使用下面的代码,我在这里找到了:
<强> http://flexmonkey.blogspot.com/2014/12/scaling-resizing-and-orienting-images.html 强>
extension UIImage {
public func resizeToBoundingSquare(_ boundingSquareSideLength : CGFloat) -> UIImage {
let imgScale = self.size.width > self.size.height ? boundingSquareSideLength / self.size.width : boundingSquareSideLength / self.size.height
let newWidth = self.size.width * imgScale
let newHeight = self.size.height * imgScale
let newSize = CGSize(width: newWidth, height: newHeight)
UIGraphicsBeginImageContext(newSize)
self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
return resizedImage!
}
}
在缩小尺寸和/或使各种像素尺寸保持一致之后,我使用CI过滤器,包括自定义和链接。我没有看到任何性能或内存问题。
答案 1 :(得分:0)
我认为通过在 CIImage 本身上使用 CGAffineTransform(scale X, y),我已经看到了最快的性能。我尝试了 CGImagesource 缩略图方法,开销方式超过了任何好处,可能是因为必须进行更多的源转换。请注意,我从 CVSampleBuffer 开始,所以我的链是这样的:
CVSampleBuffer -> CIImage -> 使用 CGAffineTransform 进行下采样 -> 使用过滤器链进行 CIFiltering...直接输入到 VNRequest。我可以使用这种方法获得 60Hz 直接来自相机的实时处理,尽管我想进一步优化它,这就是为什么我正在寻找更快的选择!