Очистка альфа-канала NSImage
-
21-09-2019 - |
Вопрос
Это можно сделать, выделив временное растровое изображение с 32 битами на пиксель а затем очистив альфа-компонент с помощью цикла for и и, наконец, снова превратив его обратно в NSImage.
Я подозреваю, что это можно сделать более простым способом, используя умный комбинация NSColor и Nсоставляющая операция.Или, возможно, изображение должно быть скомпоновано само с собой с помощью drawAtPoint.
Мой код выглядит примерно так.
NSImage* img = some image with RGB and Alpha;
NSRect rect = some rect inside the image;
[img lockFocus];
[[NSColor clearColor] set];
NSRectFillUsingOperation(rect, NSCompositeXOR);
[img unlockFocus];
ПРИМЕЧАНИЕ:Установка альфа-канала на 1 может быть выполнена с помощью с помощью blackColor с помощью NSCompositePlusLighter.
В чем секрет очистки альфа-канала?
Решение
Это будет не быстро, но это тоже сработает:
NSImage *newImage = [[NSImage alloc] initWithSize:[srcImage size]];
[newImage lockFocus];
[[NSColor whiteColor] set];
NSRectFill(NSMakeRect(0,0,[newImage size].width, [newImage size].height));
[srcImage compositeToPoint:NSZeroPoint operation:NSCompositeCopy];
[newImage unlockFocus];
Другие советы
(1) Пожалуйста, ознакомьтесь с примечаниями к выпуску AppKit на тему изменчивости изображений.NSImage в принципе следует рассматривать как неизменяемый.
(2) Все из форматы пикселей, поддерживаемые в графических контекстах иметь предварительно умноженная альфа - версия.Если альфа-канал равен нулю, то другие каналы тоже должны быть равны нулю.