Как можно исправить артефакт границы фильтра CILanczosScaleTransform для Core Image?

Я хочу реализовать алгоритм уменьшения изображения для iOS. После прочтения основных образов CILanczosScaleTransform отлично подошел, я реализовал это следующим образом:

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 об этом. Есть ли что-то умнее, чем рендеринг большего изображения, а затем обрезка границы для решения этой проблемы?

1 ответ

Решение

Ты можешь использовать imageByClampingToExtent,

Вызов этого метода... создает изображение бесконечной степени, повторяя пиксельные цвета от краев исходного изображения.

Вы можете использовать это так:

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

См. Дополнительную информацию здесь: Apple Doc для ограниченного доступа

Другие вопросы по тегам