2009-11-20 54 views

回答

3

您鏈接的圖像是帶有白色背景的圖像,這使得它有點竅門(儘管可能有一種方法可以使我找不到特定的顏色)。一種方法是獲取圖像的位圖表示並遍歷每個像素以更改顏色。

這些例子不會直接在iPhone上運行,但可能會成爲您想要做的事情的起點。

在第一個中,它只是遍歷像素並將所有非白色像素更改爲紅色。除非您想要更改的顏色始終爲黑色,否則可能需要爲顏色着色,而不是將其設置爲全紅色。

NSImage *image = [NSImage imageNamed:@"football.jpg"]; 
NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithData:[image TIFFRepresentation]]; 
NSSize imageSize = [bitmap size]; 

int samples = imageSize.height * [bitmap bytesPerRow]; 
unsigned char *bitmapData = [bitmap bitmapData]; 
int samplesPerPixel = [bitmap samplesPerPixel]; 

int startSample = [bitmap bitmapFormat] & NSAlphaFirstBitmapFormat ? 1 : 0; 

for (int i = startSample; i < samples; i = i + samplesPerPixel) { 

    if (bitmapData[i] < 255.0 && bitmapData[i + 1] < 255.0 && bitmapData[i + 2] < 255.0) { 
     bitmapData[i] = 255.0; 
    } 
} 

NSImage *newImage = [[NSImage alloc] initWithSize:[bitmap size]]; 
[newImage addRepresentation:bitmap]; 
[bitmap release]; 

如果不具備源圖像控制它可能會更容易,如果你創建它們具有透明背景並將其保存爲PNG(或支持alpha通道其他格式)。至少使用AppKit,你可以做一個更簡單的解決方案。

NSImage *image = [NSImage imageNamed:@"football-transparent.png"]; 
NSSize size = [anImage size]; 
NSRect imageBounds = NSMakeRect(0, 0, size.width, size.height); 

NSImage *newImage = [anImage copy]; 

[newImage lockFocus]; 

[[NSColor redColor] set]; 

NSRectFillUsingOperation(imageBounds, NSCompositeSourceAtop); 

[newImage unlockFocus]; 
+0

NSImage中技術不會幫助的iPhone,因爲NSImage中是應用程序套件的一部分,而iPhone已經UIKit的代替了AppKit。 – 2009-11-21 02:39:24

+0

謝謝,png與透明bg這是個好主意。 – 2009-11-21 09:07:16

+0

謝謝你指出彼得,我天真地希望UIImage和NSImage會更相似。我更新了文字,以反映這些例子不會直接在iPhone上運行,但可以作爲一個起點。 – hallski 2009-11-21 09:59:03