核心图像的高效下采样

时间:2016-09-02 05:03:36

标签: ios swift core-graphics core-image

根据获得最佳性能页面

  

使用Core Graphics或Image I / O函数进行裁剪或缩减采样,例如函数CGImageCreateWithImageInRect或CGImageSourceCreateThumbnailAtIndex。

但是,如果你只是在Core Image中进行图像处理,我想知道这是多么真实。如果我有一个需要进行缩减采样然后过滤的图像以及其他内容,那么转换为CGImage,下采样,然后将其转换回CIImage用于其他用途会不会效率低下?

我想知道如果下采样是您正在执行的图像处理算法的一部分,那么在Core Image框架中工作是否会更好。当然,如果以上更快,我想尝试一下,但我不确定是否有其他方法可以尽可能快地下采样。不,不幸的是CILanczosScaleTransform非常慢,我希望Core Image有更快的方式来构建除此之外的图像。

2 个答案:

答案 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 直接来自相机的实时处理,尽管我想进一步优化它,这就是为什么我正在寻找更快的选择!