石英:获取两个图像的差异图像

时间:2012-05-20 09:40:31

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

我跟随两张图片,背景可能是完全不同的图像,例如不只是简单的颜色。

Image number one enter image description here

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

enter image description here

  

两幅图像的差异图像是具有相同尺寸的图像   像素被设置为透明的,尚未更改。差异图像由具有来自第二图像的颜色的差异像素构成

我正在寻找基于Core Graphics技术的解决方案,请不要建议在循环中运行所有像素。我确实关心表现。

由于我是Quartz的新手,我想知道是否可以通过面具实现这一目标? 或者请提出另一种方法!

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

enter image description here

这似乎是像素的反色,然后如果我反转它们,我会得到以下

enter image description here

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

2 个答案:

答案 0 :(得分:6)

您可以使用

在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);

答案 1 :(得分:1)

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

我已在我的博客http://levonp.blogspot.com/2012/05/quartz-getting-diff-images-of-two.html

中发布了解决方案