我正在尝试翻转使用 NSImageBitmapRep 表示创建的 NSImage 。经过一番挖掘(翻转 Quicktime preview & capture和Mirroring CIImage/NSImage),我尝试了两种方法,通过 CIImage 并为这两个因素应用 -1 的缩放转换。
首先使用 CIImage imageByApplyingTransform:
NSBitmapImageRep *imgRep = ...
CGImageRef cgi = [imgRep CGImage];
CIImage *cii = [CIImage imageWithCGImage:cgi];
CGAffineTransform at = CGAffineTransformTranslate(CGAffineTransformMakeScale(-1, -1), 0, 0);
NSCIImageRep *ciiRep = [NSCIImageRep imageRepWithCIImage:[cii imageByApplyingTransform:at]];
NSImage *img = [[[NSImage alloc] init] autorelease];
[img addRepresentation:ciiRep];
[self.ivImage setImage:img];
然后使用 CIAffineTransform 过滤器:
NSBitmapImageRep *imgRep = ...
CGImageRef cgi = [imgRep CGImage];
CIImage *cii = [CIImage imageWithCGImage:cgi];
CIFilter *f = [CIFilter filterWithName:@"CIAffineTransform"];
NSAffineTransform *t = [NSAffineTransform transform];
[t scaleXBy:1.0 yBy:1.0];
//[t translateXBy:width yBy:0];
[f setValue:t forKey:@"inputTransform"];
[f setValue:cii forKey:@"inputImage"];
CIImage *cii2 = [f valueForKey:@"outputImage"];
NSCIImageRep *ciiRep = [NSCIImageRep imageRepWithCIImage:cii2];
NSImage *img = [[[NSImage alloc] init] autorelease];
[img addRepresentation:ciiRep];
[self.ivImage setImage:img];
两种方式都会产生空白图像。我还尝试翻译图像,以防它因-1缩放而超出屏幕,但无济于事。如果我使用正值进行缩放,我可以看到转换已正确应用。
self.ivImage 是一个 NSImageView。我想要一个被翻转的实际 NSImage,因此对 NSImageView 应用转换不是一种选择。
这是 32 位,Lion 上的 Xcode 4.3.2。