2009-10-13 74 views
1

可以通过mallocing一个32位/像素的临时位图 ,然后使用for循环清除alpha组件,然后再使用 清除alpha组件,最后再次将其重新转换为NSImage。清除NSImage的alpha通道

我怀疑是可以使用巧妙的 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]; 

注:alpha通道设置为1可通过 使用具有NSCompositePlusLighter一个blackColor来完成。

清除Alpha通道的秘诀是什么?

回答

4

它不会那么快,但这也能发挥作用:

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,是的,它看起来像这样会起作用。今天晚些时候将不得不尝试这个。 – neoneye 2009-10-14 05:59:36

2

(1)请阅读关于图像可变性主题的AppKit发布说明。基本上NSImage应该被视为不可变的。

(2)所有的pixel formats supported in graphics contexts都有premultiplied alpha。如果alpha通道为零,其他通道也必须为零。

+0

哎哟,预乘alpha,我真的没有注意到,直到如今。解释预乘alpha的链接写得很好。 AppKit发布说明,好点。 – neoneye 2009-10-13 22:54:28