格式化CIColorCube数据

时间:2013-04-03 21:20:54

标签: iphone objective-c core-image

最近,我一直在尝试在CIImage上设置CIColorCube以创建自定义效果。这就是我现在所拥有的:

uint8_t color_cube_data[8*4] = {
    0, 0, 0, 1,
    255, 0, 0, 1,
    0, 255, 0, 1,
    255, 255, 0, 1,
    0, 0, 255, 1,
    255, 0, 255, 1,
    0, 255, 255, 1,
    255, 255, 255, 1
};
NSData * cube_data =[NSData dataWithBytes:color_cube_data length:8*4*sizeof(uint8_t)];
CIFilter *filter = [CIFilter filterWithName:@"CIColorCube"];
[filter setValue:beginImage forKey:kCIInputImageKey];
[filter setValue:@2 forKey:@"inputCubeDimension"];
[filter setValue:cube_data forKey:@"inputCubeData"];
outputImage = [filter outputImage];

我已经查看了WWDC 2012核心图像会话,但我仍然无法正常工作。我也检查了网络,在这个问题上可用的资源非常少。我上面的代码只返回一个黑色图像。

在Apple的developer library中,它说:

  

此过滤器应用从RGB空间到inputCubeData中定义的新颜色值的映射。对于inputImage中的每个RGBA像素,过滤器使用R,G和B值来索引由inputCubeData表示的维度纹理。 inputCubeData包含包含线性预乘值的浮点RGBA单元格。数据被组织成inputCubeDimension数量的xy平面,每个平面的大小为inputCubeDimension,由inputCubeDimension提供。输入像素分量R和G分别用于索引x和y中的数据,B用于索引z。在inputCubeData中,R分量变化最快,其次是G,然后是B.

然而,这对我来说毫无意义。我的inputCubeData如何格式化?

3 个答案:

答案 0 :(得分:4)

接受的答案不正确。虽然立方体数据确实应该缩放到[0 .. 1],但它应该是float,而不是int

float color_cube_data[8*4] = { 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };

(从技术上讲,你不会 在每个数字上放置" .0"编译器知道如何处理它。)

答案 1 :(得分:2)

我发现了这个问题......如果有人遇到同样的问题,我已经更新了我的问题!

输入浮点数组必须预先划分为255。

原文使用255:

uint8_t color_cube_data[8*4] = {
    0, 0, 0, 1,
    255, 0, 0, 1,
    0, 255, 0, 1,
    255, 255, 0, 1,
    0, 0, 255, 1,
    255, 0, 255, 1,
    0, 255, 255, 1,
    255, 255, 255, 1
};

它应该是这样的:

uint8_t color_cube_data[8*4] = {
    0, 0, 0, 1,
    1, 0, 0, 1,
    0, 1, 0, 1,
    1, 1, 0, 1,
    0, 0, 1, 1,
    1, 0, 1, 1,
    0, 1, 1, 1,
    1, 1, 1, 1
};

答案 2 :(得分:1)

您的问题是您使用的值为1(接近零)对于Alpha通道,uint8_t的最大值为255

见下面的例子:

CIFilter *cubeHeatmapLookupFilter = [CIFilter filterWithName:@"CIColorCube"];

int dimension = 4;  // Must be power of 2, max of 128
int cubeDataSize = 4 * dimension * dimension * dimension;

unsigned char cubeDataBytes[cubeDataSize];

//cubeDataBytes[cubeDataSize]
unsigned char cubeDataBytes[4*4*4*4] = {
    0,      0,      0,      0,
    255,    0,      0,      170,
    255,    250,    0,      200,
    255,    255,    255,    255
};

NSData *cube_data = [NSData dataWithBytes:cubeDataBytes length:(cubeDataSize*sizeof(char))];

//applying
[cubeHeatmapLookupFilter setValue:myImage forKey:@"inputImage"];
[cubeHeatmapLookupFilter setValue:cube_data forKey:@"inputCubeData"];
[cubeHeatmapLookupFilter setValue:@(dimension) forKey:@"inputCubeDimension"];

这是指向完整项目https://github.com/knerush/heatMap

的链接