核心图像:使用 CICrop 后,应用合成过滤器不对齐

Posted

技术标签:

【中文标题】核心图像:使用 CICrop 后,应用合成过滤器不对齐【英文标题】:Core Image: after using CICrop, applying a compositing filter doesn't line up 【发布时间】:2011-11-17 16:05:27 【问题描述】:

我正在使用 CICrop 通过切断图像的顶部和底部来将图像裁剪为特定大小。

之后,我应用 CIMultiplyCompositing 过滤器之类的东西,将裁剪后的图像与另一张图像结合起来。

两张图片大小相同,但结果显示两张图片不对齐……一张是偏移的。

所以,我检查了以下内容:

NSLog(@"image after crop: %g, %g, %g, %g", imageToFilter.extent.origin.x,
                       imageToFilter.extent.origin.y,
                       imageToFilter.extent.size.width,
                       imageToFilter.extent.size.height);

NSLog(@"second image: %g, %g, %g, %g", secondImage.extent.origin.x,
                       secondImage.extent.origin.y,
                       secondImage.extent.size.width,
                       secondImage.extent.size.height);

这表明裁剪图像的 origin.y 具有我看到的偏移量(使用 CICrop 的结果):

image after crop: 0, 136, 3264, 2176
second image: 0, 0, 3264, 2176

那么,我有什么办法可以重置裁剪图像的“范围”矩形,使 origin.y 为零?检查 CIImage 的文档,“范围”是一个只读属性。

或者我将不得不做一些非常低效的转换为另一种图像类型/原始数据,然后再转换回 CIImage?

感谢您的建议。

【问题讨论】:

【参考方案1】:

我想出了这个问题的答案……而且很简单。我只需要在裁剪 CIImage 后对其应用“翻译”变换,如下所示:

imageToFilter = [imageToFilter imageByApplyingTransform:CGAffineTransformMakeTranslation(0, -imageToFilter.extent.origin.y)];

这实际上将其 y 原点移回 0。

【讨论】:

感谢您解决这个问题,这真的很有帮助。然而有一个小错误。您还需要标准化 X 范围。 imageToFilter = [imageToFilter imageByApplyingTransform:CGAffineTransformMakeTranslation(-imageToFilter.extent.origin.x, -imageToFilter.extent.origin.y)];【参考方案2】:

您也可以将其用作扩展程序。对于斯威夫特:

import CoreImage

extension CIImage 
  var correctedExtent: CIImage 
    let toTransform = CGAffineTransform(translationX: -self.extent.origin.x, y: -self.extent.origin.y)
    return self.transformed(by: toTransform)
  

你可以用作:

let corrected = ciImage.correctedExtent

【讨论】:

以上是关于核心图像:使用 CICrop 后,应用合成过滤器不对齐的主要内容,如果未能解决你的问题,请参考以下文章

可以应用哪些核心图像过滤器来改善文本文档的图像?

核心图像过滤器的输出图像第二次在 UIImage 上运行时为零

核心图像过滤器崩溃问题

iOS - 在创建核心图像过滤器循环时保留原始图像

用于合成红色、绿色和蓝色颜色通道的 CIFilter

核心图像过滤器 CISourceOverCompositing 未按预期显示与 alpha 叠加