0

所以我试图从图像中删除 alpha 通道。我想我会尝试 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]];

它将 alpha 乘以 0.75。但是,如果我将 alpha 偏差更改为 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)。我没有尝试重新定位它以查看实际图像是否正确。

任何人都知道为什么会发生这种情况,以及如何解决它?

4

2 回答 2

0

好吧,我想我明白了。显然,某些过滤器extent无限扩展的情况并不少见。解决方案是这样做

CGRect origExtent = ciImage.extent;

到你原来的ciImage,做过滤器(ciImage每次设置为结果),然后调用

ciImage = [ciImage imageByCroppingToRect:origExtent];

在获得你的最终UIImage或其他任何东西之前。

于 2013-11-17T03:39:55.483 回答
0

要删除 alpha 通道,正确的过滤器是将 alpha 值范围设置为 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];
于 2016-10-04T18:14:19.687 回答