Cicolormatrix Pias с альфа
-
21-12-2019 - |
Вопрос
Так что я пытаюсь удалить альфа-канал с изображения.Я подумал, что попробую циколорматрикс.Теперь вот дело.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 имеет нелепы генеракодицетагкод, например, приблизительно генеракодицетагкод.Я не пытался переместить его, чтобы посмотреть, правильно ли фактическое изображение.
Никто знает, почему это происходит, и как это исправить?
Решение
Хорошо, я думаю, что я понял это.Видимо, для некоторых фильтров не редкость бесконечно продлить генеракодицетагкод.Решение для этого должно делать
CGRect origExtent = ciImage.extent;
.
к вашему оригинальному генеракодичению, выполните фильтры (установка extent
, чтобы быть результатом каждый раз), а затем вызовите
ciImage = [ciImage imageByCroppingToRect:origExtent];
.
непосредственно перед получением вашего конечного генеракодицетагкода или что-то еще.
Другие советы
Для удаления альфа-канала правильный фильтр - это цветной зажим, устанавливающий диапазон альфа-значений до 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];
.