在颜色 colorMatrix:bias 的讨论中,它写道:
该过滤器执行矩阵乘法,如下所示,以变换颜色向量:
sr = dot(s, redVector) sg = dot(s, greenVector) sb = dot(s, blueVector) sa = dot(s, alphaVector) s = s + bias
有什么方法可以访问各种颜色向量的数据值?
在颜色 colorMatrix:bias 的讨论中,它写道:
该过滤器执行矩阵乘法,如下所示,以变换颜色向量:
sr = dot(s, redVector) sg = dot(s, greenVector) sb = dot(s, blueVector) sa = dot(s, alphaVector) s = s + bias
有什么方法可以访问各种颜色向量的数据值?
您在 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)];
}
这就是我将如何应用我提到的另一篇文章中的技术。