Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 如何使用CPU而不是GPU处理CIFilter?_Image Processing_Cpu_Gpu_Core Image - Fatal编程技术网

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

Image processing 如何使用CPU而不是GPU处理CIFilter?,image-processing,cpu,gpu,core-image,Image Processing,Cpu,Gpu,Core Image,有人知道如何告诉core image使用CPU而不是GPU通过CIFilter处理CIImage吗?我需要处理一些非常大的图像,我用GPU得到奇怪的结果。我不在乎CPU需要多长时间就可以了。不是答案,但您始终可以将CIkernel重新编写为对像素RGB值进行操作的函数,然后在图像的无符号字符[]数据上循环应用该函数,并将结果转换为CIImage。KCIContextureSoftwareRenderer是关键: + (CIContext*)coreContextFor:(NSGraphicsCo

有人知道如何告诉core image使用CPU而不是GPU通过CIFilter处理CIImage吗?我需要处理一些非常大的图像,我用GPU得到奇怪的结果。我不在乎CPU需要多长时间就可以了。

不是答案,但您始终可以将CIkernel重新编写为对像素RGB值进行操作的函数,然后在图像的
无符号字符[]
数据上循环应用该函数,并将结果转换为CIImage。

KCIContextureSoftwareRenderer是关键:

+ (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)
}

谢谢我来试一试。我所尝试的非常类似,但似乎从未正常工作(它总是在GPU上运行)。//创建一个CIContext,允许用户指定使用CPU-(CIContext*)CpuonlyContextFromCgContext:(CGContextRef)cgContext withFlag:(BOOL)flag{NSDictionary*contextOptions=[NSDictionary Dictionary WithObjects和Keys:[NSNumber numberWithBool:flag],KCIContextsSoftwareRenderer,nil];返回[CIContext contextWithCGContext:CGContextOptions:contextOptions];]抱歉…我不知道如何将注释指定为代码段。如何使用它?它工作正常。获取NSGraphicsContext*用于渲染CIImage的位置,使用上面的函数获取适当的CIContext,然后调用CIContext方法来绘制图像。这是使用CoreImage在CPU上进行渲染的常规方法,它包含在Apple中它应该可以正常工作