可变大小的CGContext

时间:2013-03-25 10:15:52

标签: ios cgcontext cgimage memory-optimization

我目前正在使用UIGraphicsBeginImageContext(resultingImageSize);来制作图片。

但是当我调用此函数时,我并不确切知道resultingImageSize的宽度 实际上,我开发了一些消耗大量内存的视频处理,我无法先处理然后绘制:我必须在视频处理期间绘制

如果我设置,例如UIGraphicsBeginImageContext(CGSizeMake(300, 400));,则超过400的绘制部分将丢失。

那么是否有设置CGContext的可变大小的解决方案,或者使用极少的内存消耗来调整CGContext 的大小

1 个答案:

答案 0 :(得分:0)

每次必须调整大小时,我都会通过创建一个新的更大的Context来找到解决方案。这是神奇的功能:

void MPResizeContextWithNewSize(CGContextRef *c, CGSize s) {
    size_t bitsPerComponents = CGBitmapContextGetBitsPerComponent(*c);
    size_t numberOfComponents = CGBitmapContextGetBitsPerPixel(*c) / bitsPerComponents;
    CGContextRef newContext = CGBitmapContextCreate(NULL, s.width, s.height, bitsPerComponents, sizeof(UInt8)*s.width*numberOfComponents,
                                                    CGBitmapContextGetColorSpace(*c), CGBitmapContextGetBitmapInfo(*c));
    // Copying context content
    CGImageRef im = CGBitmapContextCreateImage(*c);
    CGContextDrawImage(newContext, CGRectMake(0, 0, CGBitmapContextGetWidth(*c), CGBitmapContextGetHeight(*c)), im);
    CGImageRelease(im);

    CGContextRelease(*c);
    *c = newContext;
}

我想知道它是否可以优化,例如使用memcpyas suggested here。我试过了,但它让我的代码崩溃了。