石英钟:获取两张图片的不同之处

5
我有以下两个图片,背景可能是完全不同的图像,例如不只是纯色。
所以基本上我想得到这两个图像的差异图像,即:
两个图像的差异图像是具有相同大小但像素设置为透明的图像,这些像素没有改变。差异图像是从第二个图像中带有颜色的差异像素构建的。
我正在寻找基于核心图形技术的解决方案,请不要建议循环遍历所有像素。我关心性能。
由于我对Quartz不熟悉,我想知道是否可以使用蒙版实现这一点?或者请提出另一种方法!
使用差异混合模式的更新
实际上,如果我使用差异混合模式,它无法解决我的问题,因为它不能保留像素的正确颜色。如果我将差异混合模式应用于以上2个图像,则会得到以下结果:

接受的答案在https://dev59.com/hVHTa4cB1Zd3GeqPOAva看起来可以帮助。 - Rok Jarc
@rokjarc 谢谢你提供的链接,但是不同的混合模式并不能解决我的问题,在这里我更新了示例图片以证明它。 - deimus
如果您在设置了 CGContextSetBlendMode(kCGBlendModeDifference); 后只是将一幅图像绘制到另一幅图像上,会发生什么?这样做不就得到了您想要的效果吗? - David Rönnqvist
@DavidRönnqvist 请看一下我在应用差异混合模式上的更新问题。 - deimus
顺便问一下...你示例图片中的粉色部分不应该像你问题末尾的反转图片一样是蓝色的吗? - David Rönnqvist
1
如果您更新的问题最后得到的反转图像不是您想要的,那么您如何定义差异呢?您在帖子顶部给出的示例很奇怪,因为它将图像2中的黑色文本作为黑色,但图像1中的蓝色形状却不是蓝色。两者应该都是它们的原始颜色,或者不是,我错了吗? - David Rönnqvist
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);

谢谢你的代码,David。但是正如我之前提到的,差异混合对我来说不是解决方案。我已经更新了问题,并更好地定义了差异图像。实际上,两个图像的差异图像具有相同的大小,但未更改的像素设置为透明。差异图像是由差异像素构建而成,颜色来自第二个图像。 - deimus
1
所以基本上你想要在第二张图像中使用掩码来标记出差异的部分? - David Rönnqvist
是的,完全正确!有什么想法如何构建掩码吗? - deimus
你可以在QuartzDemo示例代码中找到CGImageMaskCreate的最佳解释。只需在项目中搜索它(只有一个出现)。 - David Rönnqvist
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/11598/discussion-between-deimus-and-david-ronnqvist - deimus
显示剩余2条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接