【发布时间】:2011-04-23 08:05:11
【问题描述】:
有谁知道如何告诉核心图像通过 CIFilter 使用 CPU 而不是 GPU 来处理 CIImage?我需要处理一些非常大的图像,使用 GPU 会得到奇怪的结果。我不在乎 CPU 需要多长时间就可以了。
【问题讨论】:
标签: image-processing cpu gpu core-image
有谁知道如何告诉核心图像通过 CIFilter 使用 CPU 而不是 GPU 来处理 CIImage?我需要处理一些非常大的图像,使用 GPU 会得到奇怪的结果。我不在乎 CPU 需要多长时间就可以了。
【问题讨论】:
标签: image-processing cpu gpu core-image
不是答案,但您始终可以将 CIkernel 重写为对像素 RGB 值进行操作的函数,然后将该函数循环应用于图像的 unsigned char [] 数据并将结果转换为 CIImage。
【讨论】:
kCIContextUseSoftwareRenderer 是这里的关键:
+ (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 渲染在我的测试硬件上更准确一些,保存过滤后的图像是一个漫长的过程,我可以在这里牺牲速度。
【讨论】:
这是一个 Swift 版本:
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)
}
【讨论】: