Как можно исправить артефакт границы фильтра 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 для ограниченного доступа