首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGImage录制失真

CGImage录制失真
EN

Stack Overflow用户
提问于 2013-02-04 19:36:48
回答 1查看 436关注 0票数 3

我已经编写了一个助手类来记录NSView并将其保存到QuickTime文件中。视图可以很好地录制为QuickTime电影,但由于某种原因,输出会出现偏差。我的类的核心如下,输出如下:

代码语言:javascript
复制
- (void) captureImage
{
    [self getCGImageFromView];
    pixelBuffer = [self getPixelBufferFromCGImage:viewCGImage size:CGRectMake(0, 0, mViewRect.size.width, mViewRect.size.height).size];

    if(pixelBuffer) {
        if(![adapter appendPixelBuffer:pixelBuffer withPresentationTime:CMTimeMake(mCurrentFrame, 20)])
            NSLog(@"AVAssetWriterInputPixelBufferAdaptor: Failed to append pixel buffer.");

        CFRelease(pixelBuffer);
        mCurrentFrame++;
    }
}

- (void) getCGImageFromView
{
    viewBitmapImageRep = [currentView bitmapImageRepForCachingDisplayInRect:mViewRect];
    [currentView cacheDisplayInRect:mViewRect toBitmapImageRep:viewBitmapImageRep];

    viewBitmapFormat = [viewBitmapImageRep bitmapFormat];
    viewCGImage = [viewBitmapImageRep CGImage];
}

- (CVPixelBufferRef)getPixelBufferFromCGImage:(CGImageRef)image size:(CGSize)size
{
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                        [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
                        [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
                        [NSNumber numberWithBool:YES], kCVPixelBufferOpenGLCompatibilityKey,
                        [NSNumber numberWithInt:size.width], kCVPixelBufferWidthKey,
                        [NSNumber numberWithInt:size.height], kCVPixelBufferHeightKey,
                         nil];

    CVPixelBufferRef pxbuffer = NULL;
    CVReturn status = CVPixelBufferCreate(NULL, size.width, size.height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options, &pxbuffer);

    NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);

    CVPixelBufferLockBaseAddress(pxbuffer, 0);
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
    NSParameterAssert(pxdata != NULL);

    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pxdata, size.width, size.height, 8, 4*size.width, rgbColorSpace, kCGImageAlphaPremultipliedFirst);
    NSParameterAssert(context);

    [[currentView layer] renderInContext:context];

    //CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),    CGImageGetHeight(image)), image);
    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);
    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);

    return pxbuffer;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-28 19:58:35

问题出在这一行。

代码语言:javascript
复制
 4*size.width, 

size.width是奇数,而不是4的倍数。传递给CGBitmapContextCreate的值必须是4的倍数。

代码语言:javascript
复制
4*ceil(size.width / 4) * 4

这就解决了问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14685963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档