将 CIFilter 应用于 UIImage 会导致调整大小和重新定位图像
Applying CIFilter to UIImage results in resized and repositioned image
将 CIFilter 应用到用相机拍摄的照片后,拍摄的图像会缩小并重新定位。
我在想,如果我能够获得原始图像的大小和方向,它会相应地缩放并将 imageview 固定到屏幕的角落。然而,这种方法没有任何改变,也不知道我可以正确地让图像缩放到屏幕的全尺寸的方法。
func applyBloom() -> UIImage {
let ciImage = CIImage(image: image) // image is from UIImageView
let filteredImage = ciImage?.applyingFilter("CIBloom",
withInputParameters: [ kCIInputRadiusKey: 8,
kCIInputIntensityKey: 1.00 ])
let originalScale = image.scale
let originalOrientation = image.imageOrientation
if let image = filteredImage {
let image = UIImage(ciImage: image, scale: originalScale, orientation: originalOrientation)
return image
}
return self.image
}
图片说明:
已捕获的照片和带有空白间距的图像的屏幕截图是图像缩小的结果。
尝试这样的事情。替换:
func applyBloom() -> UIImage {
let ciInputImage = CIImage(image: image) // image is from UIImageView
let ciOutputImage = ciInputImage?.applyingFilter("CIBloom",
withInputParameters: [kCIInputRadiusKey: 8, kCIInputIntensityKey: 1.00 ])
let context = CIContext()
let cgOutputImage = context.createCGImage(ciOutputImage, from: ciInputImage.extent)
return UIImage(cgImage: cgOutputImage!)
}
- 我保留了各种变量来帮助解释正在发生的事情。
- 显然,根据您的代码,可能需要对可选项和展开进行一些调整。
这是怎么回事 - 使用 filtered/output CIImage,并使用 CIContext,编写一个 CGImage,其大小与输入 CIImage 的大小相同。
- 请注意 CIContext 很昂贵。如果您已经创建了一个,您可能应该使用它。
- 差不多,UIImage size 与 CIImage extent 相同。 (我说几乎是因为一些生成的 CIImages 可以有 无限 范围。)
- 根据您的具体需求(和您的 UIImageView),您可能希望改用输出 CIImage 范围。不过通常情况下,它们是相同的。
最后,一个建议。如果您尝试使用 CIFilter 来显示图像的 "near real-time" 更改(例如照片编辑器),请考虑使用 CIImages 和 GLKView
而不是 UIImages 和 UIImageView
。前者使用设备 GPU 而不是 CPU.
如果 CIFilter
输出的图像尺寸与输入图像不同(例如 CIPixellate
)
,也会发生这种情况
在这种情况下,只需告诉 CIContext
以较小的矩形渲染图像:
let cgOutputImage = context.createCGImage(ciOutputImage, from: ciInputImage.extent.insetBy(dx: 20, dy: 20))
将 CIFilter 应用到用相机拍摄的照片后,拍摄的图像会缩小并重新定位。
我在想,如果我能够获得原始图像的大小和方向,它会相应地缩放并将 imageview 固定到屏幕的角落。然而,这种方法没有任何改变,也不知道我可以正确地让图像缩放到屏幕的全尺寸的方法。
func applyBloom() -> UIImage {
let ciImage = CIImage(image: image) // image is from UIImageView
let filteredImage = ciImage?.applyingFilter("CIBloom",
withInputParameters: [ kCIInputRadiusKey: 8,
kCIInputIntensityKey: 1.00 ])
let originalScale = image.scale
let originalOrientation = image.imageOrientation
if let image = filteredImage {
let image = UIImage(ciImage: image, scale: originalScale, orientation: originalOrientation)
return image
}
return self.image
}
图片说明: 已捕获的照片和带有空白间距的图像的屏幕截图是图像缩小的结果。
尝试这样的事情。替换:
func applyBloom() -> UIImage {
let ciInputImage = CIImage(image: image) // image is from UIImageView
let ciOutputImage = ciInputImage?.applyingFilter("CIBloom",
withInputParameters: [kCIInputRadiusKey: 8, kCIInputIntensityKey: 1.00 ])
let context = CIContext()
let cgOutputImage = context.createCGImage(ciOutputImage, from: ciInputImage.extent)
return UIImage(cgImage: cgOutputImage!)
}
- 我保留了各种变量来帮助解释正在发生的事情。
- 显然,根据您的代码,可能需要对可选项和展开进行一些调整。
这是怎么回事 - 使用 filtered/output CIImage,并使用 CIContext,编写一个 CGImage,其大小与输入 CIImage 的大小相同。
- 请注意 CIContext 很昂贵。如果您已经创建了一个,您可能应该使用它。
- 差不多,UIImage size 与 CIImage extent 相同。 (我说几乎是因为一些生成的 CIImages 可以有 无限 范围。)
- 根据您的具体需求(和您的 UIImageView),您可能希望改用输出 CIImage 范围。不过通常情况下,它们是相同的。
最后,一个建议。如果您尝试使用 CIFilter 来显示图像的 "near real-time" 更改(例如照片编辑器),请考虑使用 CIImages 和 GLKView
而不是 UIImages 和 UIImageView
。前者使用设备 GPU 而不是 CPU.
如果 CIFilter
输出的图像尺寸与输入图像不同(例如 CIPixellate
)
在这种情况下,只需告诉 CIContext
以较小的矩形渲染图像:
let cgOutputImage = context.createCGImage(ciOutputImage, from: ciInputImage.extent.insetBy(dx: 20, dy: 20))