我跟随两张图片,背景可能是完全不同的图像,例如不只是简单的颜色。
所以基本上我想得到这两个图像的差异图像,即
两幅图像的差异图像是具有相同尺寸的图像 像素被设置为透明的,尚未更改。差异图像由具有来自第二图像的颜色的差异像素构成
我正在寻找基于Core Graphics技术的解决方案,请不要建议在循环中运行所有像素。我确实关心表现。
由于我是Quartz的新手,我想知道是否可以通过面具实现这一目标? 或者请提出另一种方法!
使用差异混合模式更新 实际上,如果我使用差异混合模式,它不能解决我的问题,因为它不能保持像素的正确颜色。如果我将差异混合模式应用于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
中发布了解决方案