CIFilter / CIContext在模拟器和设备上给出不同的结果

时间:2019-04-18 11:02:55

标签: ios swift xcode core-image cifilter

我正在使用上使用(相对)简单的过滤器。

但是,在模拟器上我得到了预期的结果,但是设备给出的输出却略有不同。

引起问题的过滤器为CIEdgeWork。但是它与其他一些过滤器结合在一起。

CIEdgeWork, simulator and device

该代码仅将一组CIFilter添加到CIImage(通过加载PNG数据创建)。

过滤器是; CIColorClamp-> CIColorInvert->在CIConstantColorGenerator(白色)上合成-> CIEdgeWork

生成的CIImage使用CIContext.pngRepresentation(…)渲染并显示在UIImageView中。

输出CIImage的调试描述仅显示一个(较小?)差异。

模拟器

<CIImage: 0x600000ae4d20 extent [0 0 240 240]>
  crop [0 0 240 240] extent=[0 0 240 240]
    colorkernel _edgeWorkContrast(src,contrast=15.3272) extent=[infinite]
      kernel _cubicUpsample10(src,scale=[0.25 0.25 0 0]) extent=[infinite]
        kernel _gaussianBlur3(src,offset0=[0 0 0 0]) extent=[infinite]
          kernel _gaussianBlur3(src,offset0=[0 0 0 0]) extent=[infinite]
            kernel _gaussianReduce4(src,scale=[1 4 0 1]) extent=[infinite]
              kernel _gaussianReduce4(src,scale=[4 1 1 0]) extent=[infinite]
                colorkernel _edgeWork(src,blurred) extent=[infinite]
                  colorkernel _srcOver(src,dst) extent=[infinite] <0>
                    premultiply extent=[0 0 240 240]
                      colorkernel _colorClampAP(c,lo=[0 0 0 0],hi=[0 0 0 1]) extent=[0 0 240 240]
                        unpremultiply extent=[0 0 240 240]
                          affine [1 0 0 -1 0 240] extent=[0 0 240 240]
                            colormatch "sRGB IEC61966-2.1"_to_workingspace extent=[0 0 240 240]
                              IOSurface 0x6000033ec410(1) seed:0 RGBA8 alpha_unpremul extent=[0 0 240 240]
                    fill [1 1 1 1 devicergb] extent=[infinite][0 0 1 1] opaque
                  kernel _cubicUpsample10(src,scale=[0.25 0.25 0 0]) extent=[infinite]
                    kernel _gaussianBlur3(src,offset0=[0 0 0 0]) extent=[infinite]
                      kernel _gaussianBlur3(src,offset0=[0 0 0 0]) extent=[infinite]
                        kernel _gaussianReduce4(src,scale=[1 4 0 1]) extent=[infinite]
                          kernel _gaussianReduce4(src,scale=[4 1 1 0]) extent=[infinite]
                            <0>

设备

<CIImage: 0x280743ba0 extent [0 0 240 240]>
  crop [0 0 240 240] extent=[0 0 240 240]
    colorkernel _edgeWorkContrast(src,contrast=15.3272) extent=[infinite]
      kernel _cubicUpsample10(src,scale=[0.25 0.25 0 0]) extent=[infinite]
        kernel _gaussianBlur3(src,offset0=[0 0 0 0]) extent=[infinite]
          kernel _gaussianBlur3(src,offset0=[0 0 0 0]) extent=[infinite]
            kernel _gaussianReduce4(src,scale=[1 4 0 1]) extent=[infinite]
              kernel _gaussianReduce4(src,scale=[4 1 1 0]) extent=[infinite]
                colorkernel _edgeWork(src,blurred) extent=[infinite]
                  colorkernel _srcOver(src,dst) extent=[infinite] <0>
                    premultiply extent=[0 0 240 240]
                      colorkernel _colorClampAP(c,lo=[0 0 0 0],hi=[0 0 0 1]) extent=[0 0 240 240]
                        unpremultiply extent=[0 0 240 240]
                          affine [1 0 0 -1 0 240] extent=[0 0 240 240]
                            colormatch "sRGB IEC61966-2.1"_to_workingspace extent=[0 0 240 240]
                              IOSurface 0x28074d5c0(70) seed:1 RGBA8 extent=[0 0 240 240]
                    fill [1 1 1 1 devicergb] extent=[infinite][0 0 1 1] opaque
                  kernel _cubicUpsample10(src,scale=[0.25 0.25 0 0]) extent=[infinite]
                    kernel _gaussianBlur3(src,offset0=[0 0 0 0]) extent=[infinite]
                      kernel _gaussianBlur3(src,offset0=[0 0 0 0]) extent=[infinite]
                        kernel _gaussianReduce4(src,scale=[1 4 0 1]) extent=[infinite]
                          kernel _gaussianReduce4(src,scale=[4 1 1 0]) extent=[infinite]
                            <0>

不同的行是:

模拟器

IOSurface 0x6000033ec410(1) seed:0 RGBA8 alpha_unpremul extent=[0 0 240 240]

设备

IOSurface 0x28074d5c0(70) seed:1 RGBA8 extent=[0 0 240 240]

我对图形的了解还不足以说明这是否会产生效果。

我尝试了什么?

  1. 我的第一个(未经教育的)猜测是模拟器使用CPU,设备使用GPU。因此,使用此代码尝试强制设备使用CPU(无效):
// ... Create CIImage with filters, set to `outputCIImage`

guard let colourSpace = CGColorSpace(name: CGColorSpace.sRGB) else { throw RenderError.failedToCreateColourSpace }

let context = CIContext(options: [CIContextOption.useSoftwareRenderer : true])

guard let png = context.pngRepresentation(of: outputCIImage, format: .RGBA8, colorSpace: colourSpace, options: [:]) else { throw RenderError.failedToCreatePNGData }

// ... return `png` as Data, then used in `UIImage(data: ...)`

0 个答案:

没有答案