最近,我一直在尝试在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
如何格式化?
答案 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"];
的链接