如何使用CPU而不是GPU处理CIFilter?

时间:2010-10-09 23:33:05

标签: image-processing cpu gpu core-image

有没有人知道怎么告诉核心图像使用CPU而不是GPU通过CIFilter处理CIImage?我需要处理一些非常大的图像,并且使用GPU会得到奇怪的结果。我不在乎CPU需要多长时间。

3 个答案:

答案 0 :(得分:3)

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渲染在我的测试硬件上更准确一些,保存过滤后的图像是一个漫长的过程,我可以在这里牺牲速度。

答案 1 :(得分:0)

不是答案,但您总是可以重新编写CIkernel作为对像素RGB值进行操作的函数,之后将该函数应用于unsigned char []图像数据的循环中并将结果转换为CIImage。

答案 2 :(得分:0)

这是一个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)
}