16

我正在使用 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?如果我问谷歌,我不会得到好的结果。

谢谢您的帮助。

4

3 回答 3

33

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

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)
于 2013-06-30T03:31:06.760 回答
13

在斯威夫特:

var rep: NSCIImageRep = NSCIImageRep(ciImage: gaussianBlurFilter.outputImage)
var nsImage: NSImage = NSImage(size: rep.size)
nsImage.addRepresentation(rep)
于 2016-06-11T08:10:26.000 回答
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中指定原点。

于 2021-04-22T20:15:01.233 回答