有人知道如何告诉核心图像使用CPU而不是GPU处理CIImage通过CIFilter进行处理吗?我需要处理一些非常大的图像,并且在使用GPU时会出现奇怪的结果。我不关心花费多长时间,只要CPU可以就行。
有人知道如何告诉核心图像使用CPU而不是GPU处理CIImage通过CIFilter进行处理吗?我需要处理一些非常大的图像,并且在使用GPU时会出现奇怪的结果。我不关心花费多长时间,只要CPU可以就行。
kCIContextUseSoftwareRenderer is key here:
+ (CIContext*)coreContextFor:(NSGraphicsContext *)context forceSoftware:(BOOL)forceSoftware
{
//CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSDictionary *contextOptions = [NSDictionary dictionaryWithObjectsAndKeys:
(id)colorSpace, kCIContextWorkingColorSpace,
(id)colorSpace, kCIContextOutputColorSpace,
[NSNumber numberWithBool:forceSoftware], kCIContextUseSoftwareRenderer,
nil];
CIContext* result = [CIContext contextWithCGContext:(CGContext *)[context graphicsPort] options:contextOptions];
CGColorSpaceRelease(colorSpace);
return result;
}
在软件中进行渲染(使用CPU)可以解决一些问题,但是……在现代计算机上的性能惩罚非常严重,因此我不能说这是一个解决方案。我在我的应用程序中使用CoreImage,并始终使用GPU进行屏幕渲染,而强制使用CPU仅用于保存。我注意到在我的测试硬件上,CPU渲染更加准确,而保存过滤后的图像则需要很长时间,我可以在这里牺牲速度。
func coreContextFor(context : CGContext,forceSoftware force : Bool) -> CIContext {
let colorSpace = CGColorSpaceCreateDeviceRGB()
let options : [String:AnyObject] = [
kCIContextWorkingColorSpace: colorSpace!,
kCIContextOutputColorSpace : colorSpace!,
kCIContextUseSoftwareRenderer : NSNumber(bool: force)
]
return CIContext(CGContext: context, options: options)
}
这不是一个答案,但你总可以将CIkernel重写为一个操作像素RGB值的函数,然后在图像的unsigned char []
数据上循环应用该函数,并将结果转换为CIImage。