CIColorMatrix 바이어스(알파 포함)
-
21-12-2019 - |
문제
그래서 이미지에서 알파 채널을 제거하려고 합니다.나는 CIColorMatrix를 시도해 볼 것이라고 생각했습니다.자, 여기에 문제가 있습니다. filter
이전에 (성공적으로) 적용된 필터입니다.다음 코드는 생각한 대로 작동합니다.
ciImage = [filter valueForKey:kCIOutputImageKey];
filter = [CIFilter filterWithName:@"CIColorMatrix"];
[filter setValue:ciImage forKey:kCIInputImageKey];
[filter setValue:[CIVector vectorWithX:1 Y:0 Z:0 W:0] forKey:@"inputRVector"];
[filter setValue:[CIVector vectorWithX:0 Y:1 Z:0 W:0] forKey:@"inputGVector"];
[filter setValue:[CIVector vectorWithX:0 Y:0 Z:1 W:0] forKey:@"inputBVector"];
[filter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:0.75] forKey:@"inputAVector"];
[filter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:0.0] forKey:@"inputBiasVector"];
image = [UIImage imageWithCIImage:[filter valueForKey:kCIOutputImageKey]];
알파에 0.75를 곱합니다.그러나 알파 바이어스를 0.01만큼 변경하면 다음과 같습니다.
[filter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:0.01] forKey:@"inputBiasVector"];
결과 CIImage는 터무니없다. extent
, 대략적으로 (-1.7e38, -1.7e38), (3.4e38 x 3.4e38)
.실제 이미지가 맞는지 확인하기 위해 위치를 옮겨보진 않았습니다.
왜 이런 일이 발생하는지, 해결 방법을 아는 사람이 있나요?
해결책
알았어, 알아낸 것 같아.분명히 일부 필터가 extent
무한히.그에 대한 해결책은 다음과 같습니다
CGRect origExtent = ciImage.extent;
당신의 원본에 ciImage
, 필터를 수행합니다(설정 ciImage
매번 결과가 되도록) 그런 다음 전화를 겁니다.
ciImage = [ciImage imageByCroppingToRect:origExtent];
최종 합격 직전 UIImage
또는 무엇이든.
다른 팁
알파 채널을 제거하려면 올바른 필터는 알파 값 범위를 1..1로 설정하고 다른 색의 채널을 0..1 :
로 설정하는 색상 클램프입니다. CIFilter *clamp = [CIFilter filterWithName:@"CIColorClamp"];
[clamp setValue:ciImage forKey:kCIInputImageKey];
[clamp setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:1] forKey:@"inputMinComponents"];
[clamp setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:1] forKey:@"inputMaxComponents"];
image = [clamp valueForKey:kCIOutputImageKey];
. 제휴하지 않습니다 StackOverflow