CIKernel 采样器意外值

问题描述

我正在试验 CIKernel 采样器。在下面的示例中,我有一个 5 像素(w: 5,h: 1)的输入图像,灰度颜色递增(0...255)。

当我访问像素 (2,0) 处的值时,它返回一些意想不到的东西:

Expected value: 128
Returned value: 188

对于 (3,0) => (预期: 192,返回: 225) 和 (1,0) => (预期: 64,返回: 137) 相同

服装 CIFilter:

public class TestFilter: CIFilter {
    public var inputimage: CIImage?

    public static var kernel: CIKernel = { () -> CIKernel in
        let url = Bundle.main.url(forResource: "lut",withExtension: "ci.Metallib")!
        let data = try! Data(contentsOf: url)
        return try! CIKernel(functionName: "test",fromMetalLibraryData: data)
    }()


    public override var outputimage: CIImage? {
        guard let inputimage = self.inputimage else {
            return nil
        }
    
        let imageSampler = CISampler(image: inputimage,options: [kCISamplerColorSpace: inputimage.colorSpace as Any,kCISamplerFilterMode: kCISamplerFilterNearest])
    
        let outputimage = TestFilter.kernel.apply(extent: inputimage.extent,roiCallback: { (index,rect) -> CGRect in
            return rect
        },arguments: [imageSampler])
        return outputimage
    }
}

金属 CIKernel:

#include <Metal_stdlib>
using namespace Metal;
#include <CoreImage/CoreImage.h>

extern "C" {
    namespace coreimage {
        float4 test(sampler image) {
            return image.sample(float2(2.0,0.0));
        }
    }
}

测试:

func testFilter() throws {      
    /*
     Prepare input image
     */
    let width = 5
    let height = 1
    let bytesPerPixel = 4
    
    let pixel: [UInt8] = [0,255,64,128,192,255]
    let pixelData = Data(bytes: pixel,count: pixel.count * MemoryLayout<UInt8>.size)
    let image = CIImage(bitmapData: pixelData,bytesPerRow: bytesPerPixel * width,size: CGSize(width: width,height: height),format: .RGBA8,colorSpace: nil)
    
    /*
     Execute filter
     */
    let filter = TestFilter()
    filter.inputimage = image
    
    guard let outputimage = filter.outputimage else {
        XCTFail("No output image!")
        return
    }
    
    /*
     Check output
     */
    let outputBitmapRep = NSBitmapImageRep(ciImage: outputimage)
    guard let outputBitmap = outputBitmapRep.bitmapData else {
        XCTFail("Couldnt generate bitmap from output image!")
        return
    }
    
    let outputData = Data(bytes: outputBitmap,count: outputBitmapRep.bytesPerRow * Int(outputimage.extent.height))
    
    for c in outputData {
        print(c)
    }
}

有人有想法吗?已经尝试使用 kCISamplerFilterNearest 和 kCISamplerFilterLinear,但这没有帮助。

我还发现之前属性 __table 是用于此的,但我没有发现此属性的等效项。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)