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 セッションを確認しましたが、まだ機能しません。Web もチェックしましたが、この問題に関して利用できるリソースはほとんどありません。上記の私のコードは、黒い画像を返すだけです。

Apple の開発者ライブラリには、次のように書かれています。

このフィルターは、R​​GB 空間から inputCubeData で定義された新しい色の値にマッピングを適用します。inputImage の各 RGBA ピクセルに対して、フィルタは R、G、および B の値を使用して、inputCubeData によって表される 3 次元テクスチャにインデックスを付けます。inputCubeData には、事前乗算された線形値を含む浮動小数点 RGBA セルが含まれます。データは、inputCubeDimension の数の xy 平面に編成され、各平面のサイズは inputCubeDimension によって異なります。入力ピクセル コンポーネント R と G は、それぞれ x と y のデータのインデックスに使用され、B は z のインデックスに使用されます。inputCubeData では、R コンポーネントが最も速く変化し、次に G、B と続きます。

しかし、これは私には意味がありません。どのようinputCubeDataにフォーマットする必要がありますか?

4

3 に答える 3

4

受け入れられた答えは正しくありません。キューブ データは実際には にスケーリングされるはずですが、 ではなく[0 .. 1]になるはずです。floatint

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

問題が見つかりました...誰かが同じ問題を抱えている場合は、質問を更新しました!

入力 float 配列は、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

あなたの問題は、アルファチャンネルに値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 に答える