0

だから私は画像からアルファチャンネルを削除しようとしています。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)ます。実際の画像が正しいかどうかを確認するために再配置しようとはしていません。

なぜこれが起こるのか、そしてそれを修正する方法を知っている人はいますか?

4

2 に答える 2

0

アルファ チャネルを削除するための正しいフィルタは、アルファ値の範囲を 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 に答える
0

わかりました、私はそれを理解したと思います。extent一部のフィルターが を無限に拡張することは珍しいことではないようです。そのための解決策は、

CGRect origExtent = ciImage.extent;

元のciImageに、フィルターを実行し(ciImage毎回結果になるように設定)、呼び出します

ciImage = [ciImage imageByCroppingToRect:origExtent];

最終的なものを取得する直前にUIImage

于 2013-11-17T03:39:55.483 に答える