2017-10-19 1 views
0

나는 코어 이미지에서 사용자 정의 커널을 작성했습니다 :알파 채널이없는 출력 이미지를 생성하도록 CIKernel에 지시하려면 어떻게해야합니까?

outputImage = kernel.apply(extent: extent, 
          roiCallback: roiCallback, 
          arguments: [inputImage])! 

static let kernel = CIKernel(source:""" 
kernel vec4 process(sampler src) { 
    vec4 pixel = sample(src, samplerTransform(destCoord())); 
    return pixel; 
} 
""")! 

(이 그림에 대한 간단한 무 조작 커널이 아닌 실제 하나입니다.)

입력이 BGRA,하지만 내가 원하는 출력 CIImage는 BGR (또는 RGB 또는 다른 순서)이됩니다. 이것이 가능한가?

내가 이것을하고 싶은 이유는 입력 이미지의 모든 알파 값이 1이므로 출력 이미지에 수백만 개의 1을 저장하는 메모리 (및 처리 시간)를 낭비하고 싶지 않습니다. 그것을 건너 뛸 수 있습니다. 내 코드는 성능에 민감하며 충분히 빠르게 작동하지 않으므로 최적화 할 방법을 찾고 있습니다.

중요한 점은 iOS 11 이상을 타겟팅하고 있습니다. ,

II는 대답에 지적
invalid kernel return type; valid types are 'vec2' and 'vec4' 

, VEC3 유효한 반환 형식되지 않습니다 :


나는에 코드를 변경 시도 :

kernel vec3 process(sampler src) { 
    vec3 pixel = sample(src, samplerTransform(destCoord())).xyz; 
    return pixel; 
} 

하지만 오류가있어 그래서이 아이디어는 효과가 없습니다. 그럼 뭐야?

답변

0

애플 문서에 따르면, 반환 형식은 VEC 4해야하지만 그것은 BGRA 픽셀 또는 픽셀 될 필요가 없습니다 : Writing Kernels

+0

감사합니다 :에서

A kernel routine gets called once for each pixel for the destination image. The routine must return a vec4 data type. Although this four-element vector typically contains pixel data, the vector is not required to represent a pixel

합니다. 나는 다시 그걸 보았고, 이미지는 항상 RGB 색상 공간에 있다고 했으므로 YCbCr은 옵션이 아니지만 알파 채널이 없어도 RGB를 사용할 수 있는지 여부는 알 수 없습니다. –

관련 문제