有没有比CGContextDrawImage更好的方法将许多大UII图像绘制到CGContext上?

时间:2015-05-21 13:54:53

标签: ios objective-c cgcontext

我正在逐帧绘制视频。 该视频是FullHD,我得到了像这样的上下文

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

// Lock the image buffer
CVPixelBufferLockBaseAddress(imageBuffer,0);



CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(CVPixelBufferGetBaseAddress(imageBuffer),
                                                 CVPixelBufferGetWidth(imageBuffer),
                                                 CVPixelBufferGetHeight(imageBuffer),
                                                 8,
                                                 CVPixelBufferGetBytesPerRow(imageBuffer),
                                                 colorSpace,
                                                 kCGBitmapByteOrder32Little |
                                                 kCGImageAlphaPremultipliedFirst);

现在我画的字符串非常快。 但是我有一个FullHD尺寸覆盖位图和几个需要旋转和移动等的小位图。

现在,CGContextDrawImage每个花费30至100毫秒,具体取决于尺寸。这会使我的视频处理速度降低到每秒3帧,这是不可接受的。

不幸的是,我对整个绘图与客观事物有点缺乏经验。我通常依赖于UIImageView和UILabel,只需将它们添加到superview中,让操作系统处理它,但在这种情况下我需要绘制到视频帧上。

以上方式是唯一适合我的方式,但也许有更好的方式?我找不到任何。

我读到CIImage更快但仅用于处理和过滤图像,我不需要做任何这些。 另外我读到使用OpenGL可能会更快,但我从未对openGL做过任何事情,这会花费我大量的时间,我没有。

最大的图像是叠加层,只需将其复制到视频帧上即可。我知道alpha值花费了一些时间,但所有这些都发生在RAM中,没有显示出来。必须有一些更快的方法来做这一切吗?

任何帮助将不胜感激

编辑,这就是我绘制它的方式,非常明显

CGImageRef cg_mask是一个UIImage,转换为视频帧分辨率,视频帧字节顺序为alpha(kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst)

我目前正在与720合作,但之后将是全高清

CGRect rect_mask = CGRectMake(0, 0, 1280, 780);

CGContextDrawImage(context, rect_mask , cg_mask);

iPhone4S上绘图操作的时间约为80ms

0 个答案:

没有答案