Borrado del canal alfa de un NSImage
-
21-09-2019 - |
Pregunta
Se puede hacer por mallocing un mapa de bits temporal con 32 bits por píxel y luego despejar el componente alfa con un bucle y y finalmente convertirla de nuevo en una NSImage de nuevo.
Sospecho que se puede hacer de una manera más sencilla utilizando una ingeniosa combinación de NSColor y NSCompositingOperation. O tal vez la imagen necesita ser compuesta con sí mismo utilizando drawAtPoint.
Mi código es el siguiente.
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];
NOTA: Ajuste del canal alfa a 1 se puede hacer por utilizando un blackcolor con NSCompositePlusLighter.
¿Cuál es el secreto de despejar el canal alfa?
Solución
No será rápido, pero esto va a funcionar así:
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];
Otros consejos
(1) Por favor, lea las notas de la versión AppKit sobre el tema de la imagen de la mutabilidad. NSImage básicamente se debe tratar como inmutable.
(2) Todos los formatos de píxeles apoyados en contextos gráficos tienen premultiplicado alfa . Si el canal alfa es cero, los otros canales tienen que ser cero también.