2009-10-13 71 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