【问题标题】:Quartz : Getting the diff images of two imagesQuartz:获取两个图像的差异图像
【发布时间】:2012-05-20 09:40:31
【问题描述】:

我关注了两张图片,背景可能是完全不同的图片,例如不仅仅是纯色。

所以基本上我想得到这两个图像的差异图像,即

两个图像的差异图像是具有相同大小的图像,但 像素设置为未更改的透明。差异图像由具有第二张图像颜色的差异像素构成

我正在寻找基于核心图形技术的解决方案,请不要建议在循环中运行所有像素。我确实关心性能。

由于我是 Quartz 的新手,我想知道是否可以使用遮罩来实现这一点? 或者请提出另一种方法!

关于使用差异混合模式的更新 实际上,如果我使用差异混合模式,它并不能解决我的问题,因为它不能保持像素的正确颜色。如果我将差异混合模式应用于以上 2 张图像,我将得到以下结果

这似乎对像素有反转的颜色,然后如果我反转它们,我会跟随

这实际上不是我想要的,因为像素颜色完全不同

【问题讨论】:

  • stackoverflow.com/questions/3901404/… 接受的答案看起来可能会有所帮助。
  • @rokjarc 感谢您的链接,但在我的情况下,差异混合模式并不是一个解决方案,只是更新了示例图像来演示它。
  • 如果你在设置CGContextSetBlendMode(kCGBlendModeDifference); 之后只在另一张图像上绘制会发生什么,这不是你想要的吗?
  • @DavidRönnqvist 请查看我关于应用差异混合模式的更新问题
  • 如果更新问题末尾的倒置图像不是您想要的,您如何定义差异?您在帖子顶部给出的示例很奇怪,因为它具有来自 image2 的黑色文本为黑色,但来自 image1 的蓝色形状不是蓝色。要么两者都应该是它们的原始颜色,还是我错了?

标签: iphone objective-c ipad image-processing core-graphics


【解决方案1】:

您可以使用 Core Graphics 混合任何绘图

CGContextSetBlendMode(kCGBlendModeDifference);

通过绘制第一张图像,然后将混合模式设置为差异并绘制第二张图像,您将获得差异(正如我在评论中建议的那样)。这为您提供了一个倒置的图像(如您的更新问题中所示)。要反转图像,您可以使用白色填充相同的矩形(因为混合模式仍设置为“差异”)。

CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(context, frame);

执行所有这些操作的示例代码(在 drawRect 内部:)如下所示。

CGContextRef context = UIGraphicsGetCurrentContext();

// Your two images
CGImageRef img1 = [[UIImage imageNamed:@"Ygsvt.png"] CGImage];
CGImageRef img2 = [[UIImage imageNamed:@"ay5DB.png"] CGImage];

// Some arbitrary frame
CGRect frame = CGRectMake(30, 30, 100, 100);

// Invert the coordinates to not draw upside down
CGContextTranslateCTM(context, 0, frame.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

// Draw original image
CGContextDrawImage(context, frame, img1);

// Draw the second image using difference blend more over the first
CGContextSetBlendMode(context, kCGBlendModeDifference);
CGContextDrawImage(context, frame, img2);

// Fill the same rect with white color to invert 
// (still difference blend mode)
CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(context, frame);

【讨论】:

  • 感谢 David 的代码,但正如我已经提到的,差异混合不是我的解决方案,我已经用更好的差异图像定义更新了这个问题。实际上,两个图像的差异图像是具有相同大小但像素设置为透明且未更改的图像。差异图像由具有第二张图像颜色的差异像素构成
  • 那么基本上你想在有差异的地方使用掩码第二张图像?
  • 没错!任何想法如何构建面具?
  • 您可以使用以下方法将上下文剪辑到蒙版:CGContextClipToMask(context, rect, mask) 其中蒙版是“DeviceGray”色彩空间中没有 alpha 的 CGImageRef。您可以使用CGImageMaskCreate( ... params ...) 创建图像蒙版
  • 您将在the QuartzDemo sample code 中找到对 CGImageMaskCreate 的最佳解释。只需要在项目中搜索即可(仅在出现时才有)。
【解决方案2】:

感谢@David Rönnqvist 的提示,我的问题已解决 +2 给他 :)

我已经在我的博客http://levonp.blogspot.com/2012/05/quartz-getting-diff-images-of-two.html 中发布了解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多