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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top