问题描述
我正在试验 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 (将#修改为@)