-1

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

我的问题如下:

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

我在网上找到的大多数链接都说如何在屏幕上“绘制和显示像素”或如何“显示数组中的像素”,但没有一个说如何“显示缓冲区中的像素数据” .

我打算使用石英 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 回答