我建立一个使用应用程序CIAreaHistogram
核心图像过滤器。 我使用inputCount
10用于测试值(桶的数目),以及inputScale
值1。
我得到的CIImage
的直方图本身,然后我通过一个定制的内核(看帖子的结尾)运行的alpha值设置为1(否则从直方图计算alpha值预乘),然后将其转换为NSBitmapImageRep
。
然后我通过图像rep的缓冲器扫描和打印的RGB值(跳过α值)。 然而,当我做到这一点,在整个10的R,G,B值的总和不一定加入最多255个。
例如,与全黑图像,我采用直方图,然后将自定义内核,并得到下面的输出:
RGB: 255 255 255
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
这是我期待的,因为所有的像素都是黑色的,一切都在第一桶。 但是,如果我运行的彩色图像相同的算法,我得到如下:
RGB: 98 76 81
RGB: 164 97 87
RGB: 136 161 69
RGB: 100 156 135
RGB: 80 85 185
RGB: 43 34 45
RGB: 31 19 8
RGB: 19 7 3
RGB: 12 5 2
RGB: 16 11 11
加起来值R,G,B的 - 他们加起来还不到255,因为我需要比较两个这些直方图的这会导致问题,而我的算法预计总和为0和255之间我能明显扩展这些值,但我想,以避免性能的原因,额外的步骤。
我注意到别的有趣的是,可能会给一些线索,为什么发生这种情况。 在我定制的内核,我只是设置alpha值设为1。我尝试了第二核心(看帖子的结尾),设置的所有像素为红色。 显然,绿色和蓝色值均为零。 不过,我检查从位图代表的值时,得到这样的结果:
RGB: 255 43 25
但我只设置G和B为零! 这似乎是这个问题,这表明颜色管理的一部分。 但自从我明确地设置在内核中的值,还有的代码,其中这可以发生仅一个街区 - 从过滤器的CIImage转换到NSBitmapImageRep:
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput];
unsigned char *buf = [bitmapRep bitmapData];
一旦予置的像素以RGB 255 0 0,然后执行这些行,然后读取缓冲器中,RGB值均为255 43 25.我已经进一步尝试设置在其上整个工作流程是基于对原始CGImageRef的颜色空间kCGColorSpaceGenericRGB
,以为颜色配置文件可以是携带通过,但无济于事。
谁能告诉我为什么CIFilter
内核会表现得这样,我怎么能解决呢?
正如前面提到的,这里是我使用CIFilter内核函数的副本。 首先,其设定的α1的一个:
kernel vec4 adjustHistogram(sampler src)
{
vec4 pix = sample(src, destCoord());
pix.a = 1.0;
return pix;
}
而接下来,设置所有的像素之一RGB 255 0 0但最终255 43 25,一旦将其转换为NSBitmapImageRep
:
kernel vec4 adjustHistogram(sampler src)
{
vec4 pix = sample(src, destCoord());
pix.r = 1.0; pix.g = 0.0; pix.b = 0.0;
pix.a = 1.0;
return pix;
}
在此先感谢您的帮助。