Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: neoneyeОтветов: 2

Это можно сделать, создав временное растровое изображение с 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.

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

cocoatransparencynsimagealphablending

Ответы

Ответ 1 · рейтинг 4 · Leibowitzn

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

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 · рейтинг 2 · Ken

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы