1

我想为 iOS 实现图像缩小算法。在阅读了 Core ImagesCILanczosScaleTransform非常适合它之后,我通过以下方式实现了它:

public func resizeImage(_ image: UIImage, targetWidth: CGFloat) -> UIImage? {
    assert(targetWidth > 0.0)

    let scale = Double(targetWidth) / Double(image.size.width)

    guard let ciImage = CIImage(image: image) else {
        fatalError("Couldn't create CIImage from image in input")
    }

    guard let filter = CIFilter(name: "CILanczosScaleTransform") else {
        fatalError("The filter CILanczosScaleTransform is unavailable on this device.")
    }

    filter.setValue(ciImage, forKey: kCIInputImageKey)
    filter.setValue(scale, forKey: kCIInputScaleKey)

    guard let result = filter.outputImage else {
        fatalError("No output on filter.")
    }

    guard let cgImage = context.createCGImage(result, from: result.extent) else {
        fatalError("Couldn't create CG Image")
    }

    return UIImage(cgImage: cgImage)
}

它运行良好,但我得到了一个经典的边界伪影,这可能是由于算法的像素邻域基础。我在 Apple 的文档中找不到任何关于此的内容。有没有比渲染更大的图像然后裁剪边框来解决这个问题更聪明的方法?

在此处输入图像描述

4

1 回答 1

0

您可以使用imageByClampingToExtent.

调用此方法...通过从原始图像的边缘重复像素颜色来创建无限范围的图像。

你可以像这样使用它:

...
guard let ciImage = CIImage(image: image)?.clampedToExtent() else {
    fatalError("Couldn't create CIImage from image in input")
}

在此处查看更多信息:用于clampedtoextent 的Apple Doc

于 2018-03-15T21:41:48.953 回答