4

現在、RGBAデータを含むC配列にいくつかの画像データがあります。

float array[length][4]

これをUIImageに取得しようとしています。これは、ファイル、NSData、およびURLで初期化されているように見えます。他の2つの方法は遅いので、私はNSDataアプローチに最も興味があります。

次のように、これらすべての値をNSArrayに取り込むことができます。

for (i=0; i<image.size.width * image.size.height; i++){
    replace = [UIColor colorWithRed:array[i][0] green:array[i][1] blue:array[i][2] alpha:array[i][3]];
    [output replaceObjectAtIndex:i withObject:replace];
}

だから、私はUIColorであるオブジェクトでいっぱいのNSArrayを持っています。多くの方法を試しましたが、これをUIImageに変換するにはどうすればよいですか?

簡単だと思います。ちょっとしたような関数imageWithData:data R:0 B:1 G:2 A:3 length:length width:width length:lengthがいいのですが、私が知る限り関数はありません。

4

1 に答える 1

6

imageWithData:標準の画像ファイル形式の画像データを対象としています。たとえば、メモリ内にあるPNGまたはJPEGファイルです。生データから画像を作成するのには適していません。

そのためには、通常、ビットマップグラフィックスコンテキストを作成し、配列、ピクセル形式、サイズなどをCGBitmapContextCreate関数に渡します。ビットマップコンテキストを作成したら、を使用してそこから画像を作成できますCGBitmapContextCreateImage。これにより、メソッドCGImageRefに渡すことができる画像が得られます。UIImageimageWithCGImage:

これは、1つの赤いピクセルと1つの緑のピクセルを持つ小さな1×2ピクセルの画像を作成する基本的な例です。これは、色成分の順序を示すことを目的としたハードコードされたピクセル値を使用するだけです。通常、このデータはもちろん別の場所から取得します。

size_t width = 2;
size_t height = 1;
size_t bytesPerPixel = 4;
//4 bytes per pixel (R, G, B, A) = 8 bytes for a 1x2 pixel image:
unsigned char rawData[8] = {255, 0, 0, 255,  //red
                            0, 255, 0, 255}; //green

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
size_t bytesPerRow = bytesPerPixel * width;
size_t bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);

CGImageRef cgImage = CGBitmapContextCreateImage(context);
//This is your image:
UIImage *image = [UIImage imageWithCGImage:cgImage];
//Don't forget to clean up:
CGImageRelease(cgImage);
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
于 2012-10-13T00:32:43.663 に答える