2011-06-29 1 views
2

私は、私が比較したいと思う3人のCGレイヤーを持っています。iOSでビットマップの比較を行う方法は?

void *a = CGBitmapContextGetData(CGLayerGetContext(layerA)); 
void *b = CGBitmapContextGetData(CGLayerGetContext(layerB)); 
void *c = CGBitmapContextGetData(CGLayerGetContext(layerC)); 

私のような結果を得る((AまたはB)およびC)のみlayerAまたはlayerBでオンになっているビットとも上のlayerCでは、結果に終わる場所にしたいと思います。これらのレイヤーはkCGImageAlphaOnlyなので、8ビットしか「深い」とは言えず、1.0アルファで描いています。私はまた、重複がどこにあるのか知る必要はありません、私はちょうどのいずれかが結果にビットがあるかどうかを知る必要があります。

今日、QuickDrawは本当に欠けています。ビット指向の操作が非常に迅速でした。このようなことを達成するためのどのような考え?ここで

+0

これらの画像はありますか?または、Core Graphics APIを使用して他のデータを操作していますか? – benzado

+0

これは、私がCGコールでデータを「ストローク」させたというイメージです。しかし、私はそれらが画像として比較されるかどうかについて本当に気にしません、私は実際には、最後の "c"データと最初の2つの "a"と "b"セットの組み合わせ。 – EFC

答えて

2

はナイーブな実装ですが、3つのすべてが同じサイズであると仮定すると:あなたはQuickDrawのために切望しているので

unsigned char *a = CGBitmapContextGetData(CGLayerGetContext(layerA)); 
unsigned char *b = CGBitmapContextGetData(CGLayerGetContext(layerB)); 
CGContextRef context = CGLayerGetContext(layerC); 
unsigned char *c = CGBitmapContextGetData(context); 
size_t bytesPerRow = CGBitmapContextGetBytesPerRow(context); 
size_t height = CGBitmapContextGetHeight(context); 
size_t len = bytesPerRow * height; 
BOOL bitsFound = NO; 
for (int i = 0; i < len; i++) { 
    if ((a[i] | b[i]) & c[i]) { bitsFound = YES; break; } 
} 

することは、私はあなたがあなた自身、そしてあなたはそれはおそらく遅いだろう知っていることが書かれている可能性が想定しています。

ビットマップサイズを保証できる場合は、charの代わりにintを使用し、一度に4バイトで動作させることができます。

さらに深刻な最適化を行うには、Accelerateフレームワークをチェックしてください。

+0

はい、私はサイズを知っていて、私はこの場合に 'int'を使うことができると思いますが、例はまだ大きな助けになっています。私はAccelerateフレームワークを考えていなかったので、iOSで利用できるかどうかを確認する必要があります。ありがとう! – EFC

+0

ところで、この回答を、私がhttp://stackoverflow.com/questions/6482362/hit-detection-when-drawing-lines-in-ios/6526850#に残したサンプルアプリケーションでどのように適用したかを見ることができます6526850 – EFC

2

CGBlendModesについてはどうなりますか? kCGBlendModeDestinationOverはAとBのためにORとして機能し、kCGBlendModeDestinationInANDの結果が得られます。

+0

それは興味深い選択肢です、ジョシュと私はそれを試してみる必要があります。画像の合成には時間を節約できるかもしれませんが、そこに何かが残っているかどうかを調べるためには、ループを使って結果を歩かなければならないと思います。私がそれをするまでに、@benzadoのループはちょっと速いかもしれません。これは特に、ループが何かを見つけたらすぐにブレークと短絡する可能性があるためです。また、このブレンドが 'kCGImageAlphaOnly'ビットマップでどのように動作するのか不明です。 – EFC

+0

はい、どれくらいうまく動いているか分かりませんが、あなたの質問を読んですぐにアイデアが襲ってきたので、私はそこに投げ捨てると思っていました。 AFAIKは、彼らがアルファのみであるという事実は問題ではないはずです。私は間違っているかもしれません。 –

+0

これが動作すれば、合成はグラフィックスハードウェアで行うことができるので、ループを書くよりもほぼ確実に高速です。私はそれがビットの等価であることを確信していなかったので、私はそれを示唆しませんでした。しかし、あなたが衝突試験をしているなら、それは重要ではないかもしれません... – benzado

関連する問題