【问题标题】:Formatting CIColorCube data格式化 CIColorCube 数据
【发布时间】:2013-03-25 18:28:05
【问题描述】:

最近,我一直在尝试在 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 的 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 需要如何格式化?

【问题讨论】:

    标签: iphone objective-c core-image


    【解决方案1】:

    我找到了问题...如果有人有同样的问题,我已经更新了我的问题!

    输入的浮点数组必须预先除以 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】:

      接受的答案不正确。虽然立方体数据确实应该缩放到[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”,编译器知道如何处理它。)

      【讨论】:

        【解决方案3】:

        您的问题是您使用值 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-24
          • 2015-12-18
          • 2013-06-22
          • 1970-01-01
          • 1970-01-01
          • 2014-07-19
          • 2016-05-19
          • 1970-01-01
          相关资源
          最近更新 更多