Objective c 图像记录失真

Objective c 图像记录失真,objective-c,macos,nsview,quartz-graphics,cgcontext,Objective C,Macos,Nsview,Quartz Graphics,Cgcontext,我编写了一个助手类来记录NSView并将其保存到QuickTime文件中。视图可以很好地录制为QuickTime电影,但由于某些原因,输出会发生倾斜。我的类的核心如下,输出如下: - (void) captureImage { [self getCGImageFromView]; pixelBuffer = [self getPixelBufferFromCGImage:viewCGImage size:CGRectMake(0, 0, mViewRect.size.width,

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

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


这条线有问题

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

4*ceil(size.width / 4) * 4

这就解决了问题

在花了整整两天的时间调试一个视频生成函数之后,我不可能表达我对这一点的欣慰。