gpt4 book ai didi

objective-c - 绘制标准的 NSImage 倒置(白色而不是黑色)

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:03 26 4
gpt4 key购买 nike

我正在尝试用白色而不是黑色绘制标准 NSImage。下面的代码在当前 NSGraphicsContext 中以黑色绘制图像时效果很好:

NSImage* image = [NSImage imageNamed:NSImageNameEnterFullScreenTemplate];
[image drawInRect:r fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];

我希望 NSCompositeXOR 能够解决问题,但没有。我需要走复杂的 [CIFilter filterWithName:@"CIColorInvert"] 路径吗?我觉得我一定错过了一些简单的东西。

最佳答案

Core Image 路由是最可靠的。其实并不复杂,我在下面贴了一个例子。如果您知道您的图像都不会被翻转,那么您可以删除转换代码。主要要注意的是,从 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];

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

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

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]];

关于objective-c - 绘制标准的 NSImage 倒置(白色而不是黑色),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2137744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com