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

粗略地说,图像合成从源和目标中获取一个或两个像素,应用一些合成操作并将其写入目标。要获得考虑到目标像素的任何效果,必须在合成操作发生时知道该像素的颜色信息,这在您的-drawRect:.

我假设您在这里谈论的是窗口混合 ( NSVisualEffectBlendingModeBehindWindow) 背后的问题。NSVisualEffectView 的问题在于它不绘制任何东西。相反,它定义了一个区域,告诉 WindowServer 进程在该区域中执行其活力工作。这发生在您的应用绘制其视图之后。

因此,您的应用程序中的合成操作不能考虑窗口服务器稍后绘制的像素。简而言之,这是做不到的。

于 2015-04-01T10:04:12.083 回答