将CIImage转换为NSImage

时间:2013-06-30 02:46:33

标签: objective-c macos cocoa core-image nsimage

我正在使用Core Image框架。据我了解,如果我有一个图像( NSImage ),首先需要将其转换为 CIImage 。我能做到。

NSImage *im1 = [[NSImage alloc] initWithContentsOfFile:imagepath];
NSRect rect1;rect1.size.width = img1.size.width; rect1.size.height = img1.size.height;
CGImageRef imageRef1 = [img1 CGImageForProposedRect:&rect1 context:[NSGraphicsContext currentContext] hints:nil];
CIImage *ciimage = [CIImage imageWithCGImage:imageRef1];

我有一个将核心图像过滤器应用于核心图像( CIImage )的功能,我想测试它。我想将输出图像添加到窗口作为子视图。所以我需要NSImage。如何将此核心图像转换回NSImage?如果我问Google,我的效果不会很好。

感谢您的帮助。

3 个答案:

答案 0 :(得分:24)

我没有测试过,但我认为应该这样做:

CIImage *ciImage = ...;

NSCIImageRep *rep = [NSCIImageRep imageRepWithCIImage:ciImage];
NSImage *nsImage = [[NSImage alloc] initWithSize:rep.size];
[nsImage addRepresentation:rep];

在斯威夫特:

let ciImage = ...
let rep = NSCIImageRep(ciImage: ciImage)
let nsImage = NSImage(size: rep.size)
nsImage.addRepresentation(rep)

答案 1 :(得分:13)

在斯威夫特:

var rep: NSCIImageRep = NSCIImageRep(ciImage: gaussianBlurFilter.outputImage)
var nsImage: NSImage = NSImage(size: rep.size)
nsImage.addRepresentation(rep)

答案 2 :(得分:0)

有些滤镜可以大大扩展图像的大小,例如 CIMotionBlur。 对于尺寸为 5120x1440 的原始图像,我最终得到了具有“范围”x,y,w,h = -126,-502,5184,2444 的图像。要将其转换为 NSImage,我使用:

CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cg_img = [context createCGImage:img fromRect:CGRectMake(0, 0, size.width, size.height)];

NSImage *ns_img = [[NSImage alloc] initWithCGImage:cg_img size:NSZeroSize];
CGImageRelease(cg_img);  // Don't forget this! (memory leak)

其中 size 是原始图像的大小。我没有看到其他直接路径形式 CIImageNSImage 允许您在 CIImage 中指定原点,而 CGImageRef 转换可以。