Сохранить представление NSView игнорирует прозрачность - PullRequest
2 голосов
/ 30 сентября 2011

Я пытаюсь изменить значок файла на представление 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 Ответ

4 голосов
/ 30 сентября 2011

Вы не можете получить изображение с прозрачностью таким способом, потому что [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];
...