Cocoa 将NSView渲染为图像:cacheDisplayInRect绘制透明区域与通常的drawRect调用不同

Cocoa 将NSView渲染为图像:cacheDisplayInRect绘制透明区域与通常的drawRect调用不同,cocoa,nsview,drawrect,nsimage,image-capture,Cocoa,Nsview,Drawrect,Nsimage,Image Capture,你好我有个问题,谷歌搜索没有结果 我为NSView(子类)实现了drawRect方法来绘制一些阴影和半透明填充。一切看起来都很棒!但现在我需要从NSView(生成快照)中创建一个NSImage,用于拖放目的 它可以工作,但绘制方式有所不同:颜色更暗,对比度也不如预期。 为什么?也许是因为不同的选择?需要帮助和/或建议 以下是从NSView获取NSImage的代码: - (NSImage *)makeImageSnapshot { NSSize imgSize = self.bounds

你好我有个问题,谷歌搜索没有结果

我为NSView(子类)实现了drawRect方法来绘制一些阴影和半透明填充。一切看起来都很棒!但现在我需要从NSView(生成快照)中创建一个NSImage,用于拖放目的

它可以工作,但绘制方式有所不同:颜色更暗,对比度也不如预期。
为什么?也许是因为不同的选择?需要帮助和/或建议

以下是从NSView获取NSImage的代码:

- (NSImage *)makeImageSnapshot {

    NSSize imgSize = self.bounds.size;

    NSBitmapImageRep * bir = [self bitmapImageRepForCachingDisplayInRect:[self bounds]];
    [bir setSize:imgSize];

    [self cacheDisplayInRect:[self bounds] toBitmapImageRep:bir];

    NSImage* image = [[[NSImage alloc] initWithSize:imgSize] autorelease];
    [image addRepresentation:bir];

    return image;
}
下面是要进行视觉比较的图像:

  • 正常-由drawRect常规调用绘制:
  • 错误-捕获到NSImage中:
  • 虽然差异看起来很小,但请相信我,这在使用应用程序时是显而易见的。我不明白为什么会这样。希望有人能帮忙


    提前谢谢

    我认为透明度问题是由于当它自己缓存时,没有其他东西来混合它造成的


    尝试使用-dataWithPDFInsideRect:或-datawithepsiinside:并从那里获得您的图像复制。

    谢谢,Joshua!问题是,我在屏幕外渲染这个图像,这两种方法都会生成无效的图像,而且工作速度很慢。我知道的所有其他创建NSView快照的方法都无法保持透明度。看起来我必须纠正这个案例的drawRect。你的链接已经失效。你能把那些照片拿回来吗?把它们与问题本身联系起来可能是最好的。谢谢对不起,我错把它们永久删除了