5

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

图片一 在此处输入图像描述

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

在此处输入图像描述

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

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

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

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

在此处输入图像描述

这似乎对像素有反转的颜色,然后如果我反转它们,我会得到关注

在此处输入图像描述

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

4

2 回答 2

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);
于 2012-05-22T14:55:44.100 回答
1

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

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

于 2012-05-24T19:03:56.550 回答