裁剪和缩放CGContext - iOS

时间:2011-12-14 08:03:59

标签: iphone objective-c ios image-processing cgcontext

根据我之前关于Crop and Scale CMSampleBufferRef的问题,我找到了一种方法来修改CMSampleBufferRef中的CGContext,并且我能够使用以下代码绘制CGContext的矩形,路径,圆和清除矩形: / p>

- (void)modifyImage:(CMSampleBufferRef) sampleBuffer {
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

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

    // Get information about the image
    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); 
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 

    // Create a CGImageRef from the CVImageBufferRef
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 

    CGContextSaveGState(context);

    CGContextSetFillColorWithColor(context, [[UIColor blackColor] CGColor]);
    CGContextFillRect(context, CGRectMake(0, 0, 400, 400));

    //restore the context and remove the clipping area.
    CGContextRestoreGState(context);


    // We unlock the image buffer
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);

    // We release some components
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace);
    return;
}

现在,我想要做的是裁剪然后缩放这个CGContext,我尝试使用CGContextClipToRect(context, CGRectMake(0, 0, 360, 640));CGContextScaleCTM(context, 2, 2);,但没有成功。

任何人都可以在这里给我一些建议吗

1 个答案:

答案 0 :(得分:0)

创建后无法更改CVImageBuffer的尺寸。如果需要更改尺寸,则必须创建新缓冲区。

如果要裁剪图像,然后将裁剪部分缩放到原始图像的大小,则需要将缩放操作执行到第二个缓冲区,然后从第二个缓冲区复制回第一个缓冲区。