2

HardLight合成操作で画像を描画したい。次の描画コードで NSImageView を作成しました。

- (void)drawRect:(NSRect)dirtyRect {
//[super drawRect:dirtyRect];

if (self.image != NULL) {
    [self.image drawInRect:self.bounds fromRect:NSZeroRect operation:NSCompositeHardLight fraction:1.0];
}

}

通常の場合、うまく機能します。ただし、NSVisualEffectView では機能しません。

NSVisualEffectView に HardLight をブレンドするにはどうすればよいですか?

以下にリンクされている画像では、ウィンドウの背景とカラー画像に HardLight をブレンドする角の丸い四角形を見ることができます。しかし、NSVisualEffectView (赤い下の四角形) ではグレーのみが描画されます。

https://www.dropbox.com/s/bcpe6vdha6xfc5t/Screenshot%202015-03-27%2000.32.53.png?dl=0

4

1 に答える 1

2

大まかに言えば、画像の合成では、ソースと宛先からピクセルをまったく取得しないか、1 つまたは両方のピクセルを取得し、何らかの合成操作を適用して、それを宛先に書き込みます。デスティネーション ピクセルを考慮した効果を得るには、合成操作が行われるときにそのピクセルの色情報がわかっている必要があります。これは、 の実装にあり-drawRect:ます。

NSVisualEffectBlendingModeBehindWindowここでウィンドウ ブレンディング ( )の背後について話していると仮定しています。NSVisualEffectView の問題は、何も描画しないことです。代わりに、領域を定義して、WindowServer プロセスにその領域で活気を与えるように指示します。これは、アプリがビューを描画した後に発生します。

したがって、アプリの合成操作では、ウィンドウ サーバーが後で描画するピクセルを考慮することができません。要するに、これはできません。

于 2015-04-01T10:04:12.083 に答える