5

私は2つの画像をフォローしましたが、背景はまったく異なる画像である可能性があります。たとえば、無地だけではありません。

画像ナンバーワン ここに画像の説明を入力してください

つまり、基本的に、これら2つの画像の差分画像を取​​得したいと思います。

ここに画像の説明を入力してください

2つの画像の差分画像は同じサイズの画像ですが、ピクセルは変更されていない透明に設定されています。差分画像は、2番目の画像の色の差分ピクセルから構成されます

コアグラフィックス手法に基づくソリューションを探しています。ピクセル全体をループで実行することを提案しないでください。パフォーマンスは気になります。

私はクォーツに慣れていないので、マスクでこれを達成することは可能ですか?または、別のアプローチを提案してください!

ディファレンスブレンディングモードの使用に関する最新情報 実際にディファレンスブレンディングモードを使用すると、ピクセルの正しい色が維持されないため、問題は解決しません。上記の2つの画像に差分ブレンドモードを適用すると、次のようになります

ここに画像の説明を入力してください

ピクセルの色が反転しているようですが、反転すると次のようになります

ここに画像の説明を入力してください

ピクセルの色がまったく違うので、これは実際には私が望んでいたものではありません

4

2 に答える 2

6

を使用してコアグラフィックスの任意の図面をブレンドできます

CGContextSetBlendMode(kCGBlendModeDifference);

最初の画像を描画してから、ブレンドモードを差分に設定し、2番目の画像を描画すると、違いが得られます(コメントで提案したように)。これにより、反転した画像が得られます(更新の質問に見られるように)。画像を反転するには、を使用して同じ長方形を白色で塗りつぶすことができます(ブレンドモードはまだ「差分」に設定されているため)。

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

@DavidRönnqvistのヒントに感謝します。問題を解決してくれました+2:)

解決策をブログに投稿しましたhttp://levonp.blogspot.com/2012/05/quartz-getting-diff-images-of-two.html

于 2012-05-24T19:03:56.550 に答える