【问题标题】:How to process CIFilter using CPU instead of GPU?如何使用 CPU 而不是 GPU 处理 CIFilter?
【发布时间】:2011-04-23 08:05:11
【问题描述】:

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

【问题讨论】:

    标签: image-processing cpu gpu core-image


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢。我会试一试。我尝试过的非常相似,但它似乎从未正常工作(它总是在 GPU 上运行)。
      • // 创建一个 CIContext 允许用户指定使用 CPU 渲染图像 - (CIContext *)CPUonlyCIContextFromCGContext:(CGContextRef)cgContext withFlag:(BOOL)flag { NSDictionary * contextOptions = [ NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool: flag],kCIContextUseSoftwareRenderer,nil];返回 [CIContext contextWithCGContext:cgContext options: contextOptions]; }
      • 对不起...我不知道如何指定注释是代码 sn-p。
      • 你如何使用它?它工作得很好。获取一个 NSGraphicsContext*,您将在其中渲染一个 CIImage,使用上面的函数获取一个适当的 CIContext,并调用 CIContext 方法来绘制图像。这是使用 CoreImage 在 CPU 上渲染的常规方式,它在 Apple 文档中有介绍,应该可以正常工作
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2021-03-23
        • 2015-02-24
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多