Очистка альфа-канала NSImage

Это можно сделать, создав временное растровое изображение с 32 битами на пиксель, а затем очистив альфа-компонент с помощью цикла for и, наконец, снова превратив его в NSImage.

Я подозреваю, что это можно сделать более простым способом, используя умную комбинацию NSColor и NSCompositingOperation. Или, возможно, изображение нужно скомпоновать само с собой с помощью 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.

В чем секрет очистки альфа-канала?


person neoneye    schedule 13.10.2009    source источник


Ответы (2)


Это будет не быстро, но это тоже сработает:

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];
person Leibowitzn    schedule 14.10.2009
comment
Leibowitzn, да, похоже, это сработает. Нужно будет попробовать это позже сегодня. - person neoneye; 14.10.2009

  1. Пожалуйста, прочтите примечания к выпуску AppKit на предмет изменчивости изображений. NSImage в основном следует рассматривать как неизменяемый.

  2. Все форматы пикселей, поддерживаемые в графическом контексте, имеют умноженная альфа. Если альфа-канал равен нулю, другие каналы также должны быть равны нулю.

person Ken    schedule 13.10.2009
comment
ой, Premultiplied alpha, до сих пор я этого не замечал. Эта ссылка, которая объясняет предварительно умноженную альфу, хорошо написана. Примечания к выпуску AppKit, хороший момент. - person neoneye; 14.10.2009