应用 CIFilter 后,无论我做啥,图像都会变大

Posted

技术标签:

【中文标题】应用 CIFilter 后,无论我做啥,图像都会变大【英文标题】:After applying CIFilter image got bigger no matter what I do应用 CIFilter 后,无论我做什么,图像都会变大 【发布时间】:2018-08-30 06:21:20 【问题描述】:

我阅读了有关将 CIFilter 应用于 UIImage 并将其显示回来的最新知识。但是我的图像仍然比原始图像大,不知道为什么。也许我错过了一些比例因子?。

这是我的屏幕,带有普通的 UIImageView 和一些图像。唯一的约束是超级视图的中心 X/Y。

应用过滤器之前的屏幕截图

但是我在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!)

我得到的结果与预期不同(是的,过滤器已应用,但大小已损坏)。我做错了什么?

应用过滤器后的屏幕截图

【问题讨论】:

【参考方案1】:

我找到了问题的根本原因和解决方案。显然最终的 UIImage 缺少 scaleimageOrientation。原始(源)图像具有 scale == 3.0,而处理后的图像保持 scale == 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)

现在结果如下:)

Fixed image on ViewController

【讨论】:

【参考方案2】:

很奇怪,

输入和输出图像的延伸值是多少?他们匹配吗?

你可以试试这个

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

【讨论】:

感谢您的帮助!我从 coreImagefilteredImageData 打印了 extent 然后我有相同的输出 (0.0, 0.0, 440.0, 393.0). 之后,由于不需要裁剪,因此裁剪不会改变任何内容。 我想我找到了根本原因。我检查了 UIImages 的 scale(原始并从 CIImage 创建)。原版的比例为 3.0,最终的比例为 1.0。 scale 属性是只读的。我该如何解决?

以上是关于应用 CIFilter 后,无论我做啥,图像都会变大的主要内容,如果未能解决你的问题,请参考以下文章

无论我做啥,PayPal IPN 都会不断返回“无效”代码

无论我做啥,我都会在打印时遇到语法错误。这是下面的代码,我找不到问题所在

无论我做啥,都会在 Node.js 中不断收到“ConfigError:Missing region in config”错误

无论我做啥,变量都是未定义的[重复]

无论我做啥,超级简单的 Flask 应用程序的云构建都失败了

应用 CIFilter 后图像旋转