3

最近,我一直在尝试在 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 Core Image 会话,但我仍然无法正常工作。我还检查了网络,关于这个问题的可用资源很少。我上面的代码只返回一个黑色图像。

在 Apple 的开发者库中,它说:

此过滤器将 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需要如何格式化?

4

3 回答 3

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”,编译器知道如何处理它。)

于 2014-05-04T05:22:08.530 回答
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
};
于 2013-04-07T02:48:07.073 回答
1

您的问题是您对 alpha 通道使用值 1(接近于零), 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

于 2015-09-12T13:38:22.680 回答