После применения CIFilter изображение стало больше независимо от того, что я делаю - PullRequest
0 голосов
/ 30 августа 2018

Я прочитал последние ноу-хау о применении CIFilter к UIImage и отображаю его обратно. Однако, я все еще получаю свое изображение больше, чем оригинал, не знаю почему. Может быть, мне не хватает какого-то масштабного коэффициента?

Это мой экран с простым UIImageView и некоторым изображением. Единственные ограничения - центр X / Y для суперпредставления.

Снимок экрана перед применением фильтра

enter image description here

Однако я добавил этот код в viewDidLoad():

let ciContext = CIContext(options: nil)
let coreImage = CIImage(image: ledImageView.image!)

let filter = CIFilter(name: "CIExposureAdjust")
filter!.setValue(coreImage, forKey: kCIInputImageKey)
filter!.setValue(1.5, forKey: kCIInputEVKey)

let filteredImageData = filter?.outputImage as! CIImage
let filteredImageRef = ciContext.createCGImage(filteredImageData, from: filteredImageData.extent)

ledImageView.image = UIImage(cgImage: filteredImageRef!)

Я получаю результат, отличный от ожидаемого (да, фильтр применяется, но размер нарушен). Что я сделал не так?

Снимок экрана после применения фильтра

enter image description here

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я нашел как основную причину проблемы, так и решение. По-видимому, в окончательном UIImage отсутствовали scale и imageOrientation. Исходное (исходное) изображение имело масштаб == 3,0 , тогда как изображение после обработки оставалось с масштаб == 1,0 .

Вот правильный исходный код для этого:

let ciContext = CIContext(options: nil)
let coreImage = CIImage(image: sourceImageView.image!)

let srcScale = sourceImageView.image.scale // <-- keep this value
let srcOrientation = sourceImageView.image.imageOrientation // <-- keep that value

let filter = CIFilter(name: "CIExposureAdjust")
filter!.setValue(coreImage, forKey: kCIInputImageKey)
filter!.setValue(1.5, forKey: kCIInputEVKey)

let filteredImageData = filter?.outputImage as! CIImage
let filteredImageRef = ciContext.createCGImage(filteredImageData, from: filteredImageData.extent)

// use this constructor with scale/orientation values
ledImageView.image = UIImage(cgImage: filteredImageRef!, scale: srcScale: orientation: srcOrientation)

Теперь результат выглядит так:)

Исправлено изображение на ViewController

0 голосов
/ 30 августа 2018

Это странно,

каковы значения экстентов входного и выходного изображения? Они совпадают?

Вы можете попробовать это

// crop the output image to the input's image extend
let croppedImage = filteredImageData.cropped(to: coreImage.extent)
let result = UIImage(ciImage: croppedImage)
...