我正在使用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,我的效果不会很好。
感谢您的帮助。
答案 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
是原始图像的大小。我没有看到其他直接路径形式 CIImage
到 NSImage
允许您在 CIImage
中指定原点,而 CGImageRef
转换可以。