我想用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。
如何将HardLight与NSVisualEffectView混合?
在下面链接的图像中,您可以看到圆形矩形,它将HardLight混合在窗口背景和彩色图像上。但是在NSVisualEffectView(红底矩形)上,它只是灰色。
https://www.dropbox.com/s/bcpe6vdha6xfc5t/Screenshot%202015-03-27%2000.32.53.png?dl=0
答案 0 :(得分:2)
粗略地说,图像合成从源和目标中获取无,一个或两个像素,应用一些复合操作并将其写入目标。要获得考虑目标像素的任何效果,在合成操作发生时必须知道该像素的颜色信息,这在-drawRect:
的实现中。
我假设你在这里谈论窗口混合(NSVisualEffectBlendingModeBehindWindow
)。 NSVisualEffectView的问题是它不会绘制任何东西。相反,它定义了一个区域,告诉WindowServer进程在该区域中执行其活力。这会在您的应用绘制其视图后发生。
因此,应用中的合成操作无法考虑窗口服务器稍后绘制的像素。简而言之,这是不可能的。