核心圖像路線將是最可靠的。這其實不是很複雜,我已經在下面發佈了一個示例。如果你知道沒有圖像會被翻轉,那麼你可以刪除轉換代碼。要注意的主要問題是,從NSImage
到CIImage
的轉換可能在性能方面非常昂貴,因此您應該確保在可能的情況下緩存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]];
謝謝,這的確解決了色彩反轉問題。不幸的是,它並沒有給我完整的分辨率:看起來最初的TIFFRepresentation比我想要繪製的尺寸小得多。我如何確保以高分辨率獲取數據? – smartgo 2010-01-27 23:53:32
你可以使用你想要的大小從NSImage創建一個'NSBitmapImageRep',然後從位圖創建'CIImage',參見這裏:http://pastie.org/798088 – 2010-01-28 01:31:19
非常完美,非常感謝! – smartgo 2010-01-28 06:32:59