iPad绘图:将图像绘制到CGContext中

时间:2012-08-22 14:55:50

标签: objective-c ios core-graphics cgcontext

在我的iPad绘图应用程序中,我创建了一个768 x 1024的缓冲区上下文,用于加快绘图速度。

这是我在调用drawRect时正在执行的代码,它只是将我已经存在的绘图复制到屏幕上:

CGContextRef context = UIGraphicsGetCurrentContext();

CGImageRef image = CGBitmapContextCreateImage([DrawingState sharedState].context);
CGContextDrawImage(context, CGRectMake(0, 0, 768, 1024), image);
CGImageRelease(image);

此代码的工作方式与预期一致:它从我的背景上下文中收集和成像,并将其绘制到我当前的上下文中,然后释放图像。有用!

但是,我正在进行一些性能调整以加快我的绘图,而我正在尝试使用此代码,其中“rect”是drawRect传入的矩形

CGContextRef context = UIGraphicsGetCurrentContext();

CGImageRef image = CGBitmapContextCreateImage([DrawingState sharedState].context);
CGImageRef subImage = CGImageCreateWithImageInRect(image, rect);
CGContextDrawImage(context, rect, subImage);
CGImageRelease(subImage);
CGImageRelease(image);

这不起作用;图像没有出现在正确的位置,甚至可能不是正确的图像(无法分辨,因为图像是否出现在错误的位置,图像的一部分甚至不会绘制,因为它将在drawRect的外面矩形。)知道发生了什么吗?

以下是我初始化[DrawingState sharedState] .context的方法。这部分应该没问题,但我想我会把它包括在内以便完整。

if(context != NULL)
{
    CGContextRelease(context);
    context = NULL;
}
if(bitmapData != NULL)
{
    free(bitmapData);
    bitmapData = NULL;
}
if(colorSpace != NULL)
{
    CGColorSpaceRelease(colorSpace);
    colorSpace = NULL;
}

CGSize canvasSize = CGSizeMake(screenWidth, screenHeight);

int bitmapByteCount;
int bitmapBytesPerRow;

bitmapBytesPerRow   = (canvasSize.width * 4);
bitmapByteCount     = (bitmapBytesPerRow * canvasSize.height);

colorSpace = CGColorSpaceCreateDeviceRGB();

bitmapData = malloc( bitmapByteCount );

if( bitmapData == NULL ){
    NSLog(@"Buffer could not be alloc'd");
}

//Create the context
context = CGBitmapContextCreate(bitmapData, canvasSize.width, canvasSize.height, 8, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst);

根据要求,我尝试执行的实际优化如下。我正在将缓冲区图像(在进行额外绘制之前)绘制到我的缓冲区上下文中,然后将我的缓冲区上下文复制到当前上下文中。

原始代码:

CGContextClearRect([DrawingState sharedState].context, CGRectMake(0, 0, 768, 1024));
if(bufferImage != NULL)
{
    CGContextDrawImage([DrawingState sharedState].context, CGRectMake(0, 0, 768, 1024), bufferImage);
}

优化代码:

CGContextClearRect([DrawingState sharedState].context, rect);
if(bufferImage != NULL)
{
    CGImageRef subImage = CGImageCreateWithImageInRect(bufferImage, rect);
    CGContextDrawImage([DrawingState sharedState].context, rect, bufferImage);
    CGImageRelease(subImage);
}

2 个答案:

答案 0 :(得分:0)

我怀疑你想使用相同的rect值来创建子图像和绘图。

如果您阅读the docsCGImageCreateWithImageInRect将获取图像和rect参数的交集,而CGContextDrawImage会将图像绘制为rect。

我不知道您打算如何将其用作优化,但您的结果听起来就像我对您的代码所期望的那样。

答案 1 :(得分:0)

这个问题答案的简短版本是我想使用CGContextClipToRect而不是尝试获取子图像。 CGContextClipToRect(CGContextRef,CGRect)用于自动将任何绘图剪辑到提供的矩形之外的上下文。