绘制标准NSImage倒置(白色而不是黑色)

sma*_*tgo 3 macos drawing objective-c nsimage invert

我试图用白色而不是黑色绘制标准的NSImage.以下适用于在当前NSGraphicsContext中以黑色绘制图像:

NSImage* image = [NSImage imageNamed:NSImageNameEnterFullScreenTemplate];
[image drawInRect:r fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
Run Code Online (Sandbox Code Playgroud)

我希望NSCompositeXOR可以做到这一点,但不是.我是否需要沿着复杂的[CIFilter filterWithName:@"CIColorInvert"]路径走下去?我觉得我一定会错过一些简单的东西.

安德斯

Rob*_*ger 6

核心图像路线将是最可靠的.它实际上并不复杂,我在下面发布了一个示例.如果您知道不会翻转任何图像,则可以删除转换代码.需要注意的主要事项是,转换NSImageCIImage可能在性能上是昂贵的,因此您应该确保在CIImage可能的情况下缓存,并且不要在每次绘制操作期间重新创建它.

CIImage* ciImage = [[CIImage alloc] initWithData:[yourImage TIFFRepresentation]];
if ([yourImage isFlipped])
{
    CGRect cgRect    = [ciImage extent];
    CGAffineTransform transform;
    transform = CGAffineTransformMakeTranslation(0.0,cgRect.size.height);
    transform = CGAffineTransformScale(transform, 1.0, -1.0);
    ciImage   = [ciImage imageByApplyingTransform:transform];
}
CIFilter* filter = [CIFilter filterWithName:@"CIColorInvert"];
[filter setDefaults];
[filter setValue:ciImage forKey:@"inputImage"];
CIImage* output = [filter valueForKey:@"outputImage"];
[output drawAtPoint:NSZeroPoint fromRect:NSRectFromCGRect([output extent]) operation:NSCompositeSourceOver fraction:1.0];
Run Code Online (Sandbox Code Playgroud)

注意:释放/保留内存管理留作练习,上面的代码假定垃圾收集.

如果要以任意大小渲染图像,可以执行以下操作:

NSSize imageSize = NSMakeSize(1024,768); //or whatever size you want
[yourImage setSize:imageSize];
[yourImage lockFocus];
NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, imageSize.width, imageSize.height)];
[yourImage unlockFocus];
CIImage* image = [CIImage imageWithData:[bitmap TIFFRepresentation]];
Run Code Online (Sandbox Code Playgroud)