我正在尝试翻转使用NSImageBitmapRep表示的NSImage。经过一些搜索( Flipping 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位的,Xcode 4.3.2在Lion上。