gpt4 book ai didi

objective-c - 使用 CIImage 使所有黑色像素透明

转载 作者:太空狗 更新时间:2023-10-30 03:51:13 27 4
gpt4 key购买 nike

我正在尝试使用专门的 CIImage 过滤器来获得类似于颜色蒙版的东西。

基本上,我希望使所有黑色像素都透明。我不介意所有非黑色像素最终具有什么颜色,只要它们具有最大 alpha。

我在 Core Graphics 中熟悉的实现此目的的代码如下所示:

// Convert black sections to transparent using a color mask
const CGFloat maskingColors[6] = { 0, 0, 0, 0, 0, 0 };
CGImageRef result = CGImageCreateWithMaskingColors(image, maskingColors);

我已经在 Core Image 中使用颜色矩阵滤镜给了它一个镜头,但它只是将 result 设置为 nil 因为 CIVector 值大于 1.0 f.

// Create color matrix filter
CIFilter *matrix = [CIFilter filterWithName:@"CIColorMatrix"];

// Set filter properties
[matrix setValue:image forKey:kCIInputImageKey];
[matrix setValue:[CIVector vectorWithX:1.0f Y:0.0f Z:0.0f W:0.0f] forKey:@"inputRVector"];
[matrix setValue:[CIVector vectorWithX:0.0f Y:1.0f Z:0.0f W:0.0f] forKey:@"inputGVector"];
[matrix setValue:[CIVector vectorWithX:0.0f Y:0.0f Z:1.0f W:0.0f] forKey:@"inputBVector"];
[matrix setValue:[CIVector vectorWithX:255.0f Y:255.0f Z:255.0f W:0.0f] forKey:@"inputAVector"];

// Get the mapped image
CIImage *result = [matrix valueForKey:kCIOutputImageKey];

注意:就其值(value)而言,这是一款 OSX 应用。

最佳答案

编辑

使用(简单的)自定义 CIFilter 的解决方案。此方法仅适用于 OSX,因为 iOS 不支持自定义过滤器:

CIFilter 子类(或多或少是 Apple's How-To 的副本):

#import <QuartzCore/QuartzCore.h>

@interface MaskFilter : CIFilter {
CIImage *inputImage;
}

@end

@implementation MaskFilter

static CIKernel *maskFilterKernel = nil;

+ (void)initialize {
[CIFilter registerFilterName: @"MaskFilter"
constructor: (id)self
classAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
@"Mask Filter", kCIAttributeFilterDisplayName,
[NSArray arrayWithObjects:
kCICategoryColorAdjustment,
kCICategoryStillImage, kCICategoryInterlaced,
kCICategoryNonSquarePixels,nil], kCIAttributeFilterCategories,
nil]
];
}

+ (CIFilter *)filterWithName:(NSString *)name {
CIFilter *filter;
filter = [[self alloc] init];
return filter;
}

- (id)init {
if(maskFilterKernel == nil) {
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSString *code = [NSString stringWithContentsOfFile:[bundle pathForResource:@"MaskFilter" ofType: @"cikernel"] encoding:NSUTF8StringEncoding error:nil];
NSArray *kernels = [CIKernel kernelsWithString:code];
maskFilterKernel = [kernels objectAtIndex:0];
}
return [super init];
}

- (CIImage *)outputImage {
CISampler *src = [CISampler samplerWithImage: inputImage];
return [self apply:maskFilterKernel, src, kCIApplyOptionDefinition, [src definition], nil];
}

@end

完成所有工作的自定义内核(文件名:MaskFilter.cikernel)

kernel vec4 maskFilterKernel(sampler src) 
{
vec4 t = sample(src, destCoord());
t.w = (t.x == 0.0 ? (t.y == 0.0 ? (t.z == 0.0 ? 0.0 : 1.0) : 1.0) : 1.0);
return t;
}

使用过滤器就像内置过滤器一样工作:

CIFilter *filter = [MaskFilter filterWithName:@"MaskFilter"];
[filter setValue:ciImage forKey:@"inputImage"];
CIImage *mask = [filter valueForKey: @"outputImage"];

添加一个参数来选择用作 mask 颜色的颜色应该没问题。

旧答案

使用内置方法和类,我只能想出这个相当不优雅的解决方案(仅使用 Core Image 过滤器):

// convert all colors so they are brighter or equal to 0.5, except black
CIFilter *binary = [CIFilter filterWithName:@"CIColorMatrix"];
[binary setValue:inputImage forKey:@"inputImage"];
[binary setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputRVector"];
[binary setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputGVector"];
[binary setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputBVector"];
[binary setValue:[CIVector vectorWithX:0.49999 Y:0.49999 Z:0.49999 W:0] forKey:@"inputBiasVector"];
inputImage = [binary valueForKey:@"outputImage"];

// convert to black/white only colors
binary = [CIFilter filterWithName:@"CIColorPosterize"];
[binary setDefaults];
[binary setValue:inputImage forKey:@"inputImage"];
[binary setValue:@2 forKey:@"inputLevels"];
inputImage = [binary valueForKey:@"outputImage"];

// get mask
CIFilter *mask = [CIFilter filterWithName:@"CIMaskToAlpha"];
[mask setDefaults];
[mask setValue: inputImage forKey:@"inputImage"];

关于objective-c - 使用 CIImage 使所有黑色像素透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17921067/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com