-1

私は、C で書かれたビデオ デコーダ アプリケーションのソース コードを持っています。これを現在 iPhone に移植しています。

私の問題は次のとおりです。

画面に表示する必要があるフレームの RGBA ピクセル データがバッファ内にあります。私のバッファは unsigned char 型です。(ソースコードが大きすぎて私が書いたものではないため、他のデータ型に変更することはできません。)

私がネット上で見つけたリンクのほとんどは、画面上に「ピクセルを描画して表示する」方法または「配列に存在するピクセルを表示する」方法について述べていますが、「バッファに存在するピクセルデータを表示する」方法については述べていません。 .

Quartz 2Dを使用する予定です。バッファの内容を画面に表示するだけです。改造なし!私の問題は非常に単純に思えますが、同じことを行う API を見つけることができませんでした。十分に役立つ適切なリンクやドキュメントが見つかりませんでした。

助けてください!前もって感謝します。

4

1 に答える 1

2

CGContextデータ構造を使用して、生のピクセル データから を作成できますCGImage。私はすぐに基本的な例を書きました:

- (CGImageRef)drawBufferWidth:(size_t)width height:(size_t)height pixels:(void *)pixels
{
    unsigned char (*buf)[width][4] = pixels;


    static CGColorSpaceRef csp = NULL;
    if (!csp) {
        csp = CGColorSpaceCreateDeviceRGB();
    }

    CGContextRef ctx = CGBitmapContextCreate(
        buf,
        width,
        height,
        8, // 8 bits per pixel component
        width * 4, // 4 bytes per row
        csp,
        kCGImageAlphaPremultipliedLast
    );

    CGImageRef img = CGBitmapContextCreateImage(ctx);
    CGContextRelease(ctx);
    return img;
}

このメソッドは次のように呼び出すことができます (私はビュー コントローラーを使用しました)。

- (void)viewDidLoad
{
    [super viewDidLoad];

    const size_t width = 320;
    const size_t height = 460;

    unsigned char (*buf)[width][4] = malloc(sizeof(*buf) * height);

    // fill up `buf` here
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            buf[y][x][0] = x * 255 / width;
            buf[y][x][1] = y * 255 / height;
            buf[y][x][2] =   0;
            buf[y][x][3] = 255;
        }
    }

    CGImageRef img = [self drawBufferWidth:320 height:460 pixels:buf];
    self.imageView.image = [UIImage imageWithCGImage:img];
    CGImageRelease(img);
}
于 2013-03-17T17:43:16.350 に答える