保存NSView表示忽略透明度

时间:2011-09-29 22:55:11

标签: objective-c cocoa nsview

我正在尝试将文件的图标更改为NSView的表示形式。我使用以下代码来执行此操作。

    [mainDisplay lockFocus];
    NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:[mainDisplay bounds]];
    [mainDisplay unlockFocus];
    NSImage *image = [[NSImage alloc] initWithData:[rep representationUsingType:NSTIFFFileType properties:nil]];
    [[NSWorkspace sharedWorkspace] setIcon:image forFile:[savePanel filename] options:0];

这很有效。它完全按照我的意愿改变图标,除了白色的任何透明度这一事实。我怎样才能保持透明度?我知道它适用于Photoshop,但可以使用Apple的框架吗?

1 个答案:

答案 0 :(得分:4)

您不能以这种方式获取具有透明度的图像,因为[NSBitmapImageRep initWithFocusedViewRect:]从窗口服务器获取一段渲染图像,其中视图的图像已经展平为具有其他底层视图和窗口背景的图像。

您需要的是以适当的格式分配新的干净NSBitmapImageRep并在其上呈现视图的内容:

NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil 
pixelsWide:[mainDisplay bounds].size.width pixelsHigh:[mainDisplay bounds].size.height
bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:[mainDisplay bounds].size.width * 4 bitsPerPixel:32];

[mainDisplay cacheDisplayInRect:[mainDisplay bounds] toBitmapImageRep:rep];