如何在iOS5中使用CIColorMatrix?

时间:2012-02-27 21:41:46

标签: iphone objective-c ios5 core-image

我正在尝试找出如何更改UIImage的颜色/色调。我发现iOS5有很多图像过滤器,但我很难找到正确使用CIColorMatrix过滤器的文档。

-(void)doCIColorMatrixFilter
{

    //does not work, returns nil image
    CIImage* inputImage = [CIImage imageWithCGImage:[[UIImage imageNamed:@"button.jpg"]CGImage]];

    CIFilter *myFilter;
    NSDictionary *myFilterAttributes;
    myFilter = [CIFilter filterWithName:@"CIColorMatrix"];
    [myFilter setDefaults];

    myFilterAttributes = [myFilter attributes];

    [myFilterAttributes setValue:inputImage forKey:@"inputImage"];
    //How to set up attributes?

    CIContext *context = [CIContext contextWithOptions:nil];
    CIImage *ciimage = [myFilter outputImage];
    CGImageRef cgimg = [context createCGImage:ciimage fromRect:[ciimage extent]];
    UIImage *uimage = [UIImage imageWithCGImage:cgimg scale:1.0f orientation:UIImageOrientationUp];
    [imageView setImage:uimage];
    CGImageRelease(cgimg);

}

此过滤器的字典中包含哪些代码?

2 个答案:

答案 0 :(得分:21)

一个月后......

这是CIColorMatrix设置其所有参数的示例:)

-(void)doCIColorMatrixFilter
{
    // Make the input image recipe
    CIImage *inputImage = [CIImage imageWithCGImage:[UIImage imageNamed:@"facedetectionpic.jpg"].CGImage]; // 1

    // Make the filter
    CIFilter *colorMatrixFilter = [CIFilter filterWithName:@"CIColorMatrix"]; // 2
    [colorMatrixFilter setDefaults]; // 3
    [colorMatrixFilter setValue:inputImage forKey:kCIInputImageKey]; // 4
    [colorMatrixFilter setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputRVector"]; // 5
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:1 Z:0 W:0] forKey:@"inputGVector"]; // 6
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:1 W:0] forKey:@"inputBVector"]; // 7
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:1] forKey:@"inputAVector"]; // 8

    // Get the output image recipe
    CIImage *outputImage = [colorMatrixFilter outputImage];  // 9

    // Create the context and instruct CoreImage to draw the output image recipe into a CGImage
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; // 10

    // Draw the image in screen
    UIImageView *imageView2 = [[UIImageView alloc] initWithImage:[UIImage imageWithCGImage:cgimg]];
    CGRect f = imageView2.frame;
    f.origin.y = CGRectGetMaxY(imageView.frame);
    imageView2.frame = f;

    [self.view addSubview:imageView2];
}

这就是样本的作用:

1我们创建ciimage,如果你在那里得到nil,那么确保你传递正确的UIImage / CGImage或路径。

2创建过滤器,您知道:)

3中将过滤器参数设置为默认值,CoreImage编程指南建议我们应该这样做(如果避免的话,我还没有尝试过任何奇怪/不好的事情。)

4中设置输入ciimage

58我们设置参数。例如,我制作了红色矢量{1,1,1,0},因此图像看起来偏红678这里没有必要,因为它们的值与默认值相同(记得我们称之为-setDefaults?)但是出于教育目的,我猜他们没问题:)

9中设置输出图像,但尚未绘制。

最后在10中,您告诉CoreImage将输出图像绘制到CGImage中,然后将CGImage放入UIImage中,并将其放在UIImageView中。

这是结果(我使用与this教程相同的图像):

Reddish

希望它有所帮助。

答案 1 :(得分:5)

只是一个带有链的Swift示例,可以通过nacho4d

添加到上面的答案中
var output = CIFilter(name: "CIColorControls")
output.setValue(ciImage, forKey: kCIInputImageKey)
output.setValue(1.8, forKey: "inputSaturation")
output.setValue(0.01, forKey: "inputBrightness")

filter = CIFilter(name: "CIColorMatrix")
filter.setDefaults()
filter.setValue(output.outputImage, forKey: kCIInputImageKey)
filter.setValue(CIVector(x: 1, y: 0.1, z: 0.1, w: 0), forKey: "inputRVector")
filter.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputGVector")
filter.setValue(CIVector(x: 0, y: 0, z: 1, w: 0), forKey: "inputBVector")

请注意,对于RGB,默认值分别为1,0,0 0,1,0和0,0,1,如果要使其更红,则将inputRVector设置为1,1,1并保留其他相同(因为这会将蓝色和绿色成分乘以红色值)