将CIImage转换为NSImage

18

我正在使用 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];

我有一个将Core Image滤镜应用于核心图像(CIImage)的函数,我想测试它。我想将输出图像作为子视图添加到窗口中,因此我需要NSImage。如何将此核心图像转换回NSImage?如果我向Google询问,结果不理想。

谢谢你的帮助。


一个建议,让它变得更容易一些:删除第二行,并将第三行替换为:CGImageRef imageRef1 = [img1 CGImageForProposedRect:nil context:nil hints:nil]; - Heinrich Giesen
3个回答

35

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

CIImage *ciImage = ...;

NSCIImageRep *rep = [NSCIImageRep imageRepWithCIImage:ciImage];
NSImage *nsImage = [[NSImage alloc] initWithSize:rep.size];
[nsImage addRepresentation:rep];
在 Swift 中:
let ciImage = ...
let rep = NSCIImageRep(ciImage: ciImage)
let nsImage = NSImage(size: rep.size)
nsImage.addRepresentation(rep)

13

在Swift中:

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

第一行可能是:var rep: NSCIImageRep = NSCIImageRep(ciImage: ciimage) - Freek Sanders

0

有一些过滤器可以将图像的大小扩展很多,比如CIMotionBlur。 对于一个原始图像大小为5120x1440,我最终得到了一个具有“extent”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转换则可以。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接