2011-06-17 7 views
2

特定の色で画像を描画しようとしています。この効果を得るには、最初に画像(主に白と黒で構成されています)を描画し、指定した色で矩形を描きます(赤と言えば)。さまざまな合成オプションがありますが、まさに私が望むものはありません。Quartzで合成するときに色を掛ける

色とアルファ値を掛け合わせたいです。私はこれが他のグラフィックスシステムでは「変調」操作と呼ばれることもあると思います。したがって、イメージ内の白の値には、オーバーレイの矩形の赤の値が乗算され、赤が生成されます。画像の黒の値は、黒とプロダクトブラックを掛け合わせます。

つまり、R = S * D(結果は送信元に送信先を掛けたものに等しい)。

これは私が今で働いているコードです:

[image drawInRect:[self bounds] fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1]; 

NSColor * blend = [NSColor colorWithCalibratedRed:1 green:0 blue:0 alpha:1.0]; 

[blend setFill]; 
NSRectFillUsingOperation(self.bounds, NSCompositePlusDarker); 

NSCompositePlusDarkerは、私が欲しいものではありませんが、それは近いです。 (乗算ではなく加算です)。

Quartzでこれを行う方法はありますか?例えば、OpenGLでは非常に簡単です。私はCIFilterを見てきましたが、これは少し面倒です。しかしそれが唯一の方法であれば、私は正しい方向に私を得るためのサンプルコードを感謝します。

+1

Peterの回答は正しいですが、Core Imageは実際には非常に簡単なAPIであり、**は非常に高速です。それを怖がらないでください。 –

+0

+1 @Rob。フィルターを作る/取得する。準備する。それに入力画像を与えます。出力イメージを取得します。要するにCore Imageです。 –

答えて

2

Yes.

ノートのAppKitの合成操作とクォーツのブレンドモードという、かなりの数が共通でありますが、互換性はありません。 kCGBlendModeMultiplyの数値はNSCompositeCopyと同じです。後者のフラットな上書きはAppKitの描画APIに渡すとどうなりますか?

したがって、塗りのすべての部分にQuartzを使用する必要があります。 NSGraphicsContextget the CGContextを使用して、NSColorにCGColorを問い合わせることができます。

+1

これらは非常に役に立つリンクでした。私はAppKitとCoreGraphicsの違いがあることを知りませんでした。 あなたが言及したブレンドモードについての私の不平は、それがアルファ値を掛けているようではありませんが、あなたは間違いなく書かれたように私の質問に答えました。ありがとう! – whooops

関連する問題