Очистка альфа-канала NSImage - PullRequest
1 голос
/ 14 октября 2009

Это может быть сделано путем неправильного размещения временной битовой карты с 32 битами на пиксель а затем очистить альфа-компонент с помощью цикла и и, наконец, снова превратить его в 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 можно с помощью используя черный цвет с NSCompositePlusLighter.

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

Ответы [ 2 ]

4 голосов
/ 14 октября 2009

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

   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];
2 голосов
/ 14 октября 2009

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

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

...