核心图像路线将是最可靠的。这其实不是很复杂,我已经在下面发布了一个示例。如果你知道没有图像会被翻转,那么你可以删除转换代码。要注意的主要问题是,从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