我有一个用C语言编写的视频解码器应用程序的源代码,我现在正在移植到iphone上。
我的问题如下:
我有一个缓冲区中的帧的RGBA像素数据,我需要在屏幕上显示。我的缓冲区是unsigned char类型。 (我无法将其更改为任何其他数据类型,因为源代码太大而且不是由我编写的。)
我在网上发现的大多数链接都说明了如何在屏幕上“绘制和显示像素”或者如何“显示数组中存在的像素”,但是没有人说如何“显示像素数据”缓冲区“。
我打算使用石英2D。我需要做的只是在屏幕上显示缓冲区内容。没有修改!虽然我的问题听起来很简单,但我找不到任何可以做同样的API。我找不到任何足够有用的链接或文档。
请帮忙! 提前谢谢。
答案 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);
}