【问题标题】:Applying CIFilter to UIImage results in resized and repositioned image将 CIFilter 应用于 UIImage 会导致调整大小和重新定位图像
【发布时间】:2017-09-28 07:00:11
【问题描述】:

对用相机拍摄的照片应用 CIFilter 后,拍摄的图像会缩小并自行重新定位。

我在想,如果我能够获得原始图像的大小和方向,它将相应地缩放并将图像视图固定到屏幕的角落。但是,这种方法没有任何改变,并且不知道我可以正确地将图像缩放到屏幕的完整尺寸。

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
}

图片说明: 图像的照片捕获和屏幕截图,其中空白间距是图像缩小的结果。

【问题讨论】:

  • 删除scaleorientation 参数从CIImageUIImage 的转换,一切都会好起来的

标签: ios swift cifilter ciimage


【解决方案1】:

试试这样的。替换:

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!)
}
  • 我保留了各种变量来帮助解释正在发生的事情。
  • 显然,根据您的代码,可能需要对选项进行一些调整和展开。

发生了什么 - 获取过滤/输出的 CIImage,并使用 CIContext,写入一个与输入 CIImage 大小相同的 CGImage。

  • 请注意,CIContext 很昂贵。如果您已经创建了一个,您可能应该使用它。
  • 几乎,UIImage size 与 CIImage extent 相同。 (我这么说是因为一些生成的 CIImage 可以有无限范围。)
  • 根据您的特定需求(和您的 UIImageView),您可能希望改用输出 CIImage 范围。但通常它们是相同的。

最后,一个建议。如果您尝试使用 CIFilter 来显示对图像的“近实时”更改(如照片编辑器),请考虑使用 CIImages 和 GLKView 而不是 UIImages 和 UIImageView 将获得的主要性能改进.前者使用设备 GPU 而不是 CPU。

【讨论】:

  • 我非常感谢解释的细节!解决方案工作了大约 90%。就像我之前创建上下文的尝试一样,输出会将图像旋转 90 度。简单的方向修复就可以了。而且我可能需要对使用 CIContext 和 EAGLContext 进行一些研究,以使用 GPU 而不是 CPU 来找出最佳攻击计划。非常感谢,您提供的所有信息都帮了大忙!
  • @lifewithelliott,这里有一个很好的 CoreImage 链接:objc.io/issues/21-camera-and-photos/core-image-intro 顶部是一个指向 GitHub 项目的链接,他们将 GLKView 子类化为 FilteredImageView。它具有使用不同 contentModes(aspectFit、aspectFIll 等)的设置以及设置 EAGLContext 和 CIContext。
  • 我最近发现 CIFilters 正在对通过相机图像更新的图像执行使用标准 iPhone 相机分辨率。这根本不匹配像素或点分辨率。例如,iPhone 6s plus 使用 1280x720。
  • @VagueExplanation 这听起来像是一个在 SO 上问的好问题。我有 iPhone SE 和 iPhone 7 plus,以及 iPad Mini 和 10.5 英寸 iPad。如果您包含一些代码(并确保标记问题 [core-image]),我会尽力提供帮助。
  • 谢谢 dfd,这不是一个真正的问题,只是对我的经验的一些输入。 @lifewithelliott 说该解决方案的工作效率为 90%,但我相信这是因为该解决方案巧合地比他们以前的解决方案工作得更好,但使用相机的输出分辨率可以使其 100% 工作。
【解决方案2】:

如果CIFilter 输出的图像尺寸与输入图像不同(例如CIPixellate),也会发生这种情况

在这种情况下,只需告诉CIContext 以较小的矩形呈现图像:

let cgOutputImage = context.createCGImage(ciOutputImage, from: ciInputImage.extent.insetBy(dx: 20, dy: 20))

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 2017-06-23
    • 2018-01-29
    • 2015-11-20
    • 2018-02-09
    • 2014-10-08
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多