2011-06-22 9 views
0

iphoneの生データからCGImageRefを作成するとかなり奇妙な問題に遭遇しています。 x、y、z、tをとり、-1と1の間の値を返すperlinノイズ生成関数からCGImageRefを作成しようとしています。各ピクセルについて、-1と1の間のノイズ値を取得し、変換します0〜255の文字に、この、および以下の方法でデータのうち、CGImageRefを作成...奇妙なCGImage作成の問題

int width = (int)frame.size.width; 
int height = (int)frame.size.height; 
char* rgba = (char*)malloc(width * height * 4); 

//set pixel data 
int i = 0; 
for(float x = 0.0; x < width; x+=1.0) { 
    for (float y = 0.0; y < height; y+=1.0) { 
     float perlinF = ABS([perlinGenerator perlinNoiseX:x y:y z:0.0 t:0.0]); 
     char perlin = (char)(perlinF * 255.0); 

     rgba[4*i] = perlin; 
     rgba[4*i+1] = perlin; 
     rgba[4*i+2] = perlin; 
     rgba[4*i+3] = 255; 
     i++; 
    } 
} 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef bitmapContext = CGBitmapContextCreate(
                rgba, 
                width, 
                height, 
                8, // bitsPerComponent 
                4*width, // bytesPerRow 
                colorSpace, 
                kCGImageAlphaNoneSkipLast); 

CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext); 

私は、その後のCALayerにこのCGImageRefを描く場合は、私は次のような結果を得る...

CGImageRef created from data

水平アーチファクトは私の画面キャプチャ(ない実際の画像で)、分割しかしながら、これら2本の縦線によって作成されました3つの同じセクションにイメージが問題です!何が画像を3回繰り返して、それらの2つの垂直の不連続性を持たせることができますか?でも、見知らぬ人、私が注意

for (CGFloat x = 0.0; x<size.width; x+=1.0) { 
    for (CGFloat y=0.0; y< size.height; y+=1.0) { 
     float perlinF = ABS([perlinGenerator perlinNoiseX:x y:y z:0.0 t:0.0]); 
     char perlin = (char)(perlinF * 255.0); 

     CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, (float)perlin/255.0); 
     CGContextFillRect(context, CGRectMake(x, y, 1.0, 1.0)); 
    } 
} 

...このように、CGImageRefを作成せずに手動でパーリンノイズをレンダリングする場合、私はわざわざ「charにキャストして、キャストがwasn charにいることを確認するために、255.0で割ったということです問題を引き起こしていません。とにかく、私は、だから、私は上記のアプローチの両方で正確に同じノイズを作成していて、私も各メソッド側からの値を印刷してきたようだ...

Drawing noise manually

を次の結果を得ますそれらが同一であることを確認するために横に!ですから、何らかの形でデータからCGImageRefを作成してコンテキストに直接描画するのではなく、画像を破壊する奇妙な視覚的な問題が生じます。私は、アプリケーションの開始時に一連の画像を生成する必要があり、手動で描画して良い結果を得ることはできません。誰もそのような問題を引き起こす可能性がある任意のアイデアを持っている???

答えて

0

CGBitmapContextCreateはイメージバッファが列ではなく行によってインデックス付けされていることを前提としているため、ループのxとyをスワップする必要があります。

int i = 0; 
for (float y = 0.0; y < height; y+=1.0) { 
    for(float x = 0.0; x < width; x+=1.0) { 
     float perlinF = ABS([perlinGenerator perlinNoiseX:x y:y z:0.0 t:0.0]); 
     char perlin = (char)(perlinF * 255.0); 

     rgba[4*i] = perlin; 
     rgba[4*i+1] = perlin; 
     rgba[4*i+2] = perlin; 
     rgba[4*i+3] = 255; 
     i++; 
    } 
} 
+0

あなたの権利!簡単な間違い...気づいてくれてありがとう!また、他のレンダリングはピクセル単位で行われていたため、forループの順序は関係ありませんでした。驚くばかり – Nitrex88