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);
}