CIRadialGradient уменьшает размер изображения - PullRequest
0 голосов
/ 09 ноября 2018

После применения CIRadialGradient к моему изображению его ширина уменьшается примерно на 20%.

guard let image = bgImage.image, let cgimg = image.cgImage else {
    print("imageView doesn't have an image!")
    return
}
let coreImage = CIImage(cgImage:cgimg)

guard let radialMask = CIFilter(name:"CIRadialGradient") else {
    return
}

guard let maskedVariableBlur = CIFilter(name:"CIMaskedVariableBlur") else {
    print("CIMaskedVariableBlur does not exist")
    return 
}
maskedVariableBlur.setValue(coreImage, forKey: kCIInputImageKey)

maskedVariableBlur.setValue(radialMask.outputImage, forKey: "inputMask")
guard let selectivelyFocusedCIImage = maskedVariableBlur.outputImage else {
    print("Setting maskedVariableBlur failed")
    return
}


bgImage.image = UIImage(ciImage: selectivelyFocusedCIImage)

Чтобы уточнить, bgImage это UIImageView.

Почему это происходит и как это исправить?

Без RadialMask:

enter image description here

С RadialMask:

enter image description here

С той разницей, что на моем физическом iPhone уменьшенное изображение выравнивается по левому краю.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Я имею тенденцию явно указывать, насколько велико изображение, используя CIContext и создавая CGImage определенного размера вместо простого UIImage(ciImage:). Попробуйте это, предполагая, что ваш inputImage называется coreGraphics:

let ciCtx = CIContext()
let cgiig = ctx.createCGImage(selectivelyFocusedCIImage, from: coreImage.extent)
let uiImage = UIImage(cgImage: cgIMG!)

Несколько заметок ....

(1) Я вытащил этот код из приложения, которое я закрываю. Это непроверенный код (включая принудительное развертывание), но концепция того, что я делаю, является твердой.

(2) Вы не объясняете многое из того, что вы пытаетесь сделать, но когда я вижу переменную с именем selectivelyFocusedCIImage, меня беспокоит, что вы можете пытаться использовать CoreImage более интерактивным способом, чем "просто "создание одного изображения. Если вам нужна производительность «почти в реальном времени», визуализируйте CIImage в формате (устаревшем в iOS 12) GLKView или MTKView вместо UIImageView. Последний использует только процессор, где два первых используют графический процессор.

(3) Наконец, слово предупреждения на CIContexts - создавать их дорого! Обычно вы можете закодировать его так, чтобы в вашем приложении был только один контекст, которым может поделиться все.

0 голосов
/ 16 ноября 2018

Различные размеры обусловлены размером ядра фильтра размытия:

Фильтру размытия необходимо выбрать область вокруг каждого пикселя. Поскольку за границами изображения отсутствуют пиксели, Core Image уменьшает extend результирующего изображения на половину размера ядра (радиуса размытия), чтобы указать, что для этих пикселей недостаточно информации для правильного размытия.

Тем не менее, вы можете указать Core Image обрабатывать пиксели границы как бесконечно расширяющиеся во всех направлениях, так что фильтр размытия получает достаточно информации даже по краям изображения. После этого вы можете обрезать результат до исходного размера.

В вашем коде просто измените следующие две строки:

maskedVariableBlur.setValue(coreImage.clampedToExtent(), forKey: kCIInputImageKey)

bgImage.image = UIImage(ciImage: selectivelyFocusedCIImage.cropped(to:coreImage.extend))
0 голосов
/ 09 ноября 2018

Посмотрите документацию, это маска, которая применяется к изображению: enter image description here

Документы: CIRadialGradient

...