2009-10-13 8 views
1

Cela peut être fait en allouant un bitmap temporaire avec 32 bits par pixel puis en effaçant le composant alpha avec une boucle for et et enfin le remettre dans un NSImage à nouveau.Effacer le canal alpha d'un NSImage

Je suppose que peut être fait d'une manière plus simple en utilisant une combinaison intelligente de NSColor et NSCompositingOperation. Ou peut-être que l'image doit être composée avec elle-même en utilisant drawAtPoint.

Mon code ressemble à ceci.

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]; 

REMARQUE: Réglage du canal alpha 1 peut être fait en utilisant un BlackColor avec NSCompositePlusLighter.

Quel est le secret pour effacer le canal alpha?

Répondre

4

Il ne sera pas rapide, mais cela fonctionnera aussi bien:

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]; 
+0

Leibowitzn, oui, il semble que cela va fonctionner. Je vais devoir essayer ça plus tard aujourd'hui. – neoneye

2

(1) Veuillez lire les notes de mise à jour d'AppKit sur le sujet de la mutabilité de l'image. NSImage devrait être traité comme immuable.

(2) Tous les pixel formats supported in graphics contexts ont premultiplied alpha. Si le canal alpha est à zéro, les autres canaux doivent également être à zéro.

+0

aïe, Prémultiplié alpha, je ne vraiment remarqué que jusqu'à présent. Ce lien qui explique l'alpha prémultiplié est bien écrit. Notes de mise à jour AppKit, bon point. – neoneye

Questions connexes