4

在颜色 colorMatrix:bias 的讨论中,它写道:

该过滤器执行矩阵乘法,如下所示,以变换颜色向量:

sr = dot(s, redVector) sg = dot(s, greenVector) sb = dot(s, blueVector) sa = dot(s, alphaVector) s = s + bias

有什么方法可以访问各种颜色向量的数据值?

4

1 回答 1

1

您在 C4 文档中所指的讨论是指过滤器用于计算矩阵乘法的过程。这实际上只是对过滤器在应用时对图像中的颜色所做的操作的描述。

实际上,幕后发生的事情是该colorMatrix:方法设置了一个CIFilter被调用CIColorMatrix并将其应用于C4Image. CIColorMatrix不幸的是,Apple 没有提供过滤器的源代码。

因此,对您的问题的冗长回答是:

您无法C4Image通过CIColorMatrix过滤器访问 a 中像素的颜色分量。但是,C4Image该类有一个名为CGImage(eg yourC4Image.CGImage) 的属性,您可以使用它来获取像素数据。

可以在这里找到一个好的、简单的技术

编辑:我昨晚对这个问题很着迷,并将这两种方法添加到 C4Image 类中:

加载像素数据的方法:

-(void)loadPixelData {
    NSUInteger width = CGImageGetWidth(self.CGImage);
    NSUInteger height = CGImageGetHeight(self.CGImage);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    bytesPerPixel = 4;
    bytesPerRow = bytesPerPixel * width;
    rawData = malloc(height * bytesPerRow);

    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), self.CGImage);
    CGContextRelease(context);
}

还有一种访问像素颜色的方法:

-(UIColor *)colorAt:(CGPoint)point {
    if(rawData == nil) {
        [self loadPixelData];
    }
    NSUInteger byteIndex = bytesPerPixel * point.x + bytesPerRow * point.y;
    CGFloat r, g, b, a;
    r = rawData[byteIndex];
    g = rawData[byteIndex + 1];
    b = rawData[byteIndex + 2];
    a = rawData[byteIndex + 3];

    return [UIColor colorWithRed:RGBToFloat(r) green:RGBToFloat(g) blue:RGBToFloat(b) alpha:RGBToFloat(a)];
}

这就是我将如何应用我提到的另一篇文章中的技术。

于 2012-05-08T20:05:22.310 回答