3

r、g、b、および 2 つの CGImages の値を乗算して、1 つの画像をマスク (アルファ チャネル) とティント (rgb チャネル) の両方として使用したいと考えています。私は最初に簡単に試しました:

CGContextDrawImage(context, CGRectMake(0, 0, _w, _h), handle());
CGContextSetBlendMode(context, kCGBlendModeMultiply);
CGContextDrawImage(context, CGRectMake(0, 0, other->width(), other->height()), over);

ただし、これは着色するだけで、マスクはしません。したがって、マスキング イメージから CGImage マスク グレースケール イメージにアルファを抽出し (CGDataProvider を使用)、それをコンテキストのマスクとして使用しました。

// "mask" is "other"'s alpha channel as an inverted grayscale image
CGContextSaveGState(context);
CGContextClipToMask(context, CGRectMake(0, 0, other->width(), other->height()), mask);
CGImageRelease(mask);
CGContextDrawImage(context, CGRectMake(0, 0, _w, _h), handle());
CGContextRestoreGState(context); // Don't apply the clip mask to 'other', since it already has it
CGContextSetBlendMode(context, kCGBlendModeMultiply);
CGContextDrawImage(context, CGRectMake(0, 0, other->width(), other->height()), other->handle());

ただし、それでも正しく表示されません。画像が明るくなります。乗算された画像は常に少なくとも暗くする必要がありますか? 画像のプレビュー:

http://dl.dropbox.com/u/6775/multiply/index.html

啓発を事前にありがとう:)

4

1 に答える 1

2

まず、マスキングを行うためにアルファ チャンネルを別のチャンネルに抽出する必要はありません。でそのまま描けますkCGBlendModeDestinationIn。反転マスクの場合も同じですが、kCGBlendModeDestinationOut.

したがって、解決策は、Multiply で 2 番目のイメージを描画してから、Destination In または Out で再度描画することです。

于 2010-09-16T18:16:17.237 に答える