2010-01-26 203 views
3

我試圖用白色而不是黑色繪製標準NSImage。罰款在目前獲取到NSGraphicsContext黑色繪製的圖像,下面的工作:繪製標準NSImage倒置(白色而不是黑色)

NSImage* image = [NSImage imageNamed:NSImageNameEnterFullScreenTemplate]; 
[image drawInRect:r fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 

我預計NSCompositeXOR這樣的伎倆,但沒有。我需要去複雜的[CIFilter filterWithName:@「CIColorInvert」]路徑嗎?我覺得我必須錯過簡單的東西。

Anders

回答

6

核心圖像路線將是最可靠的。這其實不是很複雜,我已經在下面發佈了一個示例。如果你知道沒有圖像會被翻轉,那麼你可以刪除轉換代碼。要注意的主要問題是,從NSImageCIImage的轉換可能在性能方面非常昂貴,因此您應該確保在可能的情況下緩存CIImage,並且不要在每次繪圖操作期間重新創建它。

CIImage* ciImage = [[CIImage alloc] initWithData:[yourImage TIFFRepresentation]]; 
if ([yourImage isFlipped]) 
{ 
    CGRect cgRect = [ciImage extent]; 
    CGAffineTransform transform; 
    transform = CGAffineTransformMakeTranslation(0.0,cgRect.size.height); 
    transform = CGAffineTransformScale(transform, 1.0, -1.0); 
    ciImage = [ciImage imageByApplyingTransform:transform]; 
} 
CIFilter* filter = [CIFilter filterWithName:@"CIColorInvert"]; 
[filter setDefaults]; 
[filter setValue:ciImage forKey:@"inputImage"]; 
CIImage* output = [filter valueForKey:@"outputImage"]; 
[output drawAtPoint:NSZeroPoint fromRect:NSRectFromCGRect([output extent]) operation:NSCompositeSourceOver fraction:1.0]; 

注意:釋放/保留內存管理留作練習,上面的代碼假設垃圾回收。

如果你想以任意大小呈現圖像,你可以做到以下幾點:

NSSize imageSize = NSMakeSize(1024,768); //or whatever size you want 
[yourImage setSize:imageSize]; 
[yourImage lockFocus]; 
NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, imageSize.width, imageSize.height)]; 
[yourImage unlockFocus]; 
CIImage* image = [CIImage imageWithData:[bitmap TIFFRepresentation]]; 
+0

謝謝,這的確解決了色彩反轉問題。不幸的是,它並沒有給我完整的分辨率:看起來最初的TIFFRepresentation比我想要繪製的尺寸小得多。我如何確保以高分辨率獲取數據? – smartgo 2010-01-27 23:53:32

+0

你可以使用你想要的大小從NSImage創建一個'NSBitmapImageRep',然後從位圖創建'CIImage',參見這裏:http://pastie.org/798088 – 2010-01-28 01:31:19

+0

非常完美,非常感謝! – smartgo 2010-01-28 06:32:59

0

只要一注:我發現CIColorInvert過濾器並不總是可靠的。例如,如果您想要將Photoshop中反轉的圖像反轉回來,CIFilter會生成更輕的圖像。據我瞭解,這是因爲CIFilter(gamma爲1)和來自其他來源的圖像的伽瑪值不同而發生的。

當我正在尋找方法來更改CIFilter的伽瑪值時,我發現一個提示CIContext中存在一個錯誤:將其伽瑪值從默認值1更改將產生不可預知的結果。

無論如何,還有另一種解決方案來反轉NSImage,它總能產生正確的結果 - 通過反轉NSBitmapImageRep的像素。

我重新發布從etutorials.org(http://bit.ly/Y6GpLn)代碼:

// srcImageRep is the NSBitmapImageRep of the source image 
int n = [srcImageRep bitsPerPixel]/8;   // Bytes per pixel 
int w = [srcImageRep pixelsWide]; 
int h = [srcImageRep pixelsHigh]; 
int rowBytes = [srcImageRep bytesPerRow]; 
int i; 

NSImage *destImage = [[NSImage alloc] initWithSize:NSMakeSize(w, h)]; 
NSBitmapImageRep *destImageRep = [[[NSBitmapImageRep alloc] 
     initWithBitmapDataPlanes:NULL 
      pixelsWide:w 
      pixelsHigh:h 
      bitsPerSample:8 
      samplesPerPixel:n 
      hasAlpha:[srcImageRep hasAlpha] 
      isPlanar:NO 
      colorSpaceName:[srcImageRep colorSpaceName] 
      bytesPerRow:rowBytes 
      bitsPerPixel:NULL] autorelease]; 

unsigned char *srcData = [srcImageRep bitmapData]; 
unsigned char *destData = [destImageRep bitmapData]; 

for (i = 0; i < rowBytes * h; i++) 
    *(destData + i) = 255 - *(srcData + i); 

[destImage addRepresentation:destImageRep]; 
相關問題