Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top