iPhone App - Отображение данных пикселей, присутствующих в буфере, на экране

У меня есть исходный код приложения для декодирования видео, написанный на C, который я сейчас портирую на iphone.

Моя проблема заключается в следующем:

У меня есть данные пикселей RGBA для кадра в буфере, который мне нужно отобразить на экране. Мой буфер имеет тип unsigned char. (Я не могу изменить его на любой другой тип данных, так как исходный код слишком велик и не написан мной.)

Большинство ссылок, которые я нашел в сети, говорят о том, как "рисовать и отображать пиксели" на экране или как "отображать пиксели, присутствующие в массиве", но ни одна из них не говорит, как "отображать пиксельные данные, присутствующие в буфере".,

Я планирую использовать кварц 2D. Все, что мне нужно сделать, это просто отобразить содержимое буфера на экране. Без изменений! Хотя моя проблема звучит очень просто, нет ни одного API, который я мог бы найти, чтобы сделать то же самое. Я не мог найти подходящую ссылку или документ, который был бы достаточно полезным.

Пожалуйста, помогите! Заранее спасибо.

1 ответ

Решение

Вы можете использовать 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);
}
Другие вопросы по тегам