Macos 如何绘制NSImage,但向侧面淡出(线性alpha渐变)?

Macos 如何绘制NSImage,但向侧面淡出(线性alpha渐变)?,macos,core-graphics,appkit,nsimage,Macos,Core Graphics,Appkit,Nsimage,我有一个生成为NSImage的图像,然后使用自定义draw()方法将其绘制到NSView子类中 我想修改此自定义视图,以便在同一位置绘制图像,但图像在侧面淡出。也就是说,它被绘制为线性渐变,从alpha=1.0到alpha=0.0 我最好的猜测是NScompositionOperation的draw()变体之一可能会帮助我做我想做的事情,但我很难理解它们是如何做到这一点的。我不是一个图形专家,NSImage和NSCompositingOperation文档似乎使用了不同的术语 快速版:基本上是在

我有一个生成为NSImage的图像,然后使用自定义draw()方法将其绘制到NSView子类中

我想修改此自定义视图,以便在同一位置绘制图像,但图像在侧面淡出。也就是说,它被绘制为线性渐变,从alpha=1.0到alpha=0.0

我最好的猜测是NScompositionOperation的draw()变体之一可能会帮助我做我想做的事情,但我很难理解它们是如何做到这一点的。我不是一个图形专家,NSImage和NSCompositingOperation文档似乎使用了不同的术语


快速版:基本上是在macOS上,而不是在Android上。

你走对了方向。您需要使用
nscompositionOperationDestinationOut
来实现这一点。这将根据正在绘制的源的alpha有效地打孔出目标。因此,如果您首先绘制图像,然后在顶部使用.destinationOut操作绘制从alpha 0.0到1.0的渐变,那么最终的图像将使用alpha 1.0到0.0

因为这种打孔发生在渐变绘制到的背景存储中的任何东西上,所以您需要小心使用它的位置/方式

  • 如果您想在视图的图形中完成这一切,您应该使用
    CGContextBeginTransparencyLayer
    CGContextEndTransparencyLayer
    在一个窗口中绘制图像和打孔渐变,以防止打孔其他任何内容
  • 您还可以首先创建一个新的NSImage来表示这个褪色的变体,或者使用or并在其中绘制相同的图像和渐变(不必担心透明度层)。然后将该图像绘制到视图中,或者简单地将该图像与NSImageView一起使用

    • 你走对了方向。您需要使用
      nscompositionOperationDestinationOut
      来实现这一点。这将根据正在绘制的源的alpha有效地打孔出目标。因此,如果您首先绘制图像,然后在顶部使用.destinationOut操作绘制从alpha 0.0到1.0的渐变,那么最终的图像将使用alpha 1.0到0.0

      因为这种打孔发生在渐变绘制到的背景存储中的任何东西上,所以您需要小心使用它的位置/方式

      • 如果您想在视图的图形中完成这一切,您应该使用
        CGContextBeginTransparencyLayer
        CGContextEndTransparencyLayer
        在一个窗口中绘制图像和打孔渐变,以防止打孔其他任何内容
      • 您还可以首先创建一个新的NSImage来表示这个褪色的变体,或者使用or并在其中绘制相同的图像和渐变(不必担心透明度层)。然后将该图像绘制到视图中,或者简单地将该图像与NSImageView一起使用