iPhone App - 显示屏幕上缓冲区中的像素数据

时间:2013-03-17 17:18:37

标签: iphone quartz-2d pixels rgba

我有一个用C语言编写的视频解码器应用程序的源代码,我现在正在移植到iphone上。

我的问题如下:

我有一个缓冲区中的帧的RGBA像素数据,我需要在屏幕上显示。我的缓冲区是unsigned char类型。 (我无法将其更改为任何其他数据类型,因为源代码太大而且不是由我编写的。)

我在网上发现的大多数链接都说明了如何在屏幕上“绘制和显示像素”或者如何“显示数组中存在的像素”,但是没有人说如何“显示像素数据”缓冲区“。

我打算使用石英2D。我需要做的只是在屏幕上显示缓冲区内容。没有修改!虽然我的问题听起来很简单,但我找不到任何可以做同样的API。我找不到任何足够有用的链接或文档。

请帮忙! 提前谢谢。

1 个答案:

答案 0 :(得分: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);
}