Iphone 格式化CIColorCube数据

Iphone 格式化CIColorCube数据,iphone,objective-c,core-image,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 * cub

最近,我一直在尝试在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核心映像会话,但我所拥有的仍然不起作用。我还查看了网络,关于这个问题的资源非常少。我上面的代码只返回一个黑色图像

在苹果的声明中,它说:

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


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

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

输入浮点数组必须从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
};

公认的答案是错误的。虽然多维数据集数据确实应该缩放为
[0..1]
,但它应该是
浮点
,而不是
int

float color\u cube\u数据[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”,编译器知道如何处理它。)

您的问题是,您对alpha通道使用了值1(接近零),uint8的最大值是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"];
这是完整项目的链接