<error>:CGBitmapContextCreateImage:无效的上下文0x0 </error>

时间:2013-10-27 14:35:53

标签: ios iphone objective-c ios5 cgcontext

我有一个使用CGContextDrawImage函数组合两个图像的应用程序。这是我的问题。只有一个图像出现而另一个没有出现在iphone 5的ios模拟器中,而在iphone 3的iphone模拟器上,显示这些图像没有问题,我没有任何问题。顺便说一下,这里是Xcode给我的错误列表。

// ERRORS

:CGContextRotateCTM:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。在即将到来的更新中,它将成为一个致命的错误。

:CGContextDrawImage:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。在即将到来的更新中,它将成为一个致命的错误。

:CGBitmapContextCreateImage:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体降低。此通知是礼貌的:请解决此问题。它将成为即将到来的更新中的致命错误。

有人能帮帮我吗?提前谢谢。

这是我的示例代码:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGRect xFirstFrame = m_pUserImgView.frame;
int nWidth = xFirstFrame.size.width;
int nHeight = xFirstFrame.size.height;
CGFloat rScaleX;
CGPoint xOrgCenter;
UIImage* pJustinImage = m_pJustinImgView.image;
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    xOrgCenter = CGPointMake(384, 512);
}
else
    if ([self appDelegate].isiPhone5 == YES)
    {
        xOrgCenter = CGPointMake(160, 284);
    }
    else
    {
        xOrgCenter = CGPointMake(160, 240);
    }
CGContextRef buf_context = CGBitmapContextCreate(nil, nWidth, nHeight, 8, nWidth * 4, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGRect rect = CGRectMake(0,0, nWidth, nHeight);
CGRect xSecRect = m_pJustinImgView.bounds;
UIGraphicsPushContext(buf_context);
CGContextClearRect(buf_context, rect);
CGContextDrawImage(buf_context, rect, m_pUserImgView.image.CGImage);
//Transform Context
CGAffineTransform pTransform = m_pJustinImgView.transform;
CGAffineTransform xRealTrans = CGAffineTransformMake(pTransform.a, pTransform.b, pTransform.c, pTransform.d, pTransform.tx, -pTransform.ty);

CGPoint xOrgPoint = CGPointMake(xOrgCenter.x + pTransform.tx, xOrgCenter.y - pTransform.ty);
CGFloat rDegree = [self CalcRotateAngle:xRealTrans];
CGContextTranslateCTM(buf_context, xOrgPoint.x, xOrgPoint.y);
CGContextRotateCTM(buf_context, -rDegree);
rScaleX = sqrtf(pTransform.a * pTransform.a + pTransform.c * pTransform.c);
CGContextDrawImage(buf_context, CGRectMake(- xSecRect.size.width * rScaleX/2, - xSecRect.size.height * rScaleX/2, xSecRect.size.width * rScaleX , xSecRect.size.height * rScaleX), pJustinImage.CGImage);
UIGraphicsPopContext();

CGImageRef image = CGBitmapContextCreateImage(buf_context);
CGContextRelease(buf_context);

UIImage* pCombImage = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);

return pCombImage;

}

//加载图片的代码

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGRect xFirstFrame = m_pBackImageView.frame;



int nWidth = xFirstFrame.size.width;
int nHeight = xFirstFrame.size.height;
CGFloat rScaleX;
CGPoint xOrgCenter;

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    xOrgCenter = CGPointMake(384, 512);
}
else
{
    if ([self appDelegate].isiPhone5 == YES)
    {
        xOrgCenter = CGPointMake(160, 284);
    }
    else
    {
        xOrgCenter = CGPointMake(160, 240);
    }
}

CGContextRef buf_context = CGBitmapContextCreate(nil, nWidth, nHeight, 8, nWidth * 4, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGRect rect = CGRectMake(0,0, nWidth, nHeight);
CGRect xSecRect = m_pUserImgView.bounds;
UIGraphicsPushContext(buf_context);
CGContextClearRect(buf_context, rect);
CGContextDrawImage(buf_context, rect, m_pBackImageView.image.CGImage);
//Transform Context
CGAffineTransform pTransform = m_pUserImgView.transform;
CGAffineTransform xRealTrans = CGAffineTransformMake(pTransform.a, pTransform.b, pTransform.c, pTransform.d, pTransform.tx, -pTransform.ty);

CGPoint xOrgPoint = CGPointMake(xOrgCenter.x + pTransform.tx, xOrgCenter.y - pTransform.ty);
CGFloat rDegree = [self CalcRotateAngle:xRealTrans];
CGContextTranslateCTM(buf_context, xOrgPoint.x, xOrgPoint.y);
CGContextRotateCTM(buf_context, -rDegree);
rScaleX = sqrtf(pTransform.a * pTransform.a + pTransform.c * pTransform.c);
CGContextDrawImage(buf_context, CGRectMake(- xSecRect.size.width * rScaleX/2, - xSecRect.size.height * rScaleX/2, xSecRect.size.width * rScaleX , xSecRect.size.height * rScaleX), m_pUserImgView.m_pViewImage.CGImage);
UIGraphicsPopContext();

CGImageRef image = CGBitmapContextCreateImage(buf_context);
CGContextRelease(buf_context);

UIImage* pCombImage = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);

return pCombImage;

2 个答案:

答案 0 :(得分:10)

试试这个:在xcode中添加符号断点到 CGPostError 。 (添加符号断点,并添加到符号字段类型 CGPostError

发生错误时,调试器将停止代码执行,您可以检查方法调用堆栈并检查参数。寻找0大小的表面。有些参数的大小为0。

答案 1 :(得分:0)

您应该在drawRect:UIImageView子类的方法中创建上下文,然后将该上下文传递给您的方法。 由于您返回的UIImage实例并在其中创建了ContextRef,因此很明显您在不使用drawRect的情况下进行绘制:

你能做什么 1.创建UIView或UIImageView的子类, 2.获取drawRect中的上下文: 3.通过在drawRect中调用绘图方法将上下文传递给绘图方法: 喜欢这个

   - (void)drawRect:(CGRect)rect
    {
        CGContextRef buf_context = UIGraphicsGetCurrentContext();

    //    CGContextRef buf_context = CGBitmapContextCreate(nil, nWidth, nHeight, 8, nWidth * 4, colorSpace, kCGImageAlphaPremultipliedLast);

      UIImage  *pCombImage =  [self drawMyBeutifulImagesInRect:rect inContext: buf_context];


    }
  1. 使用您的方法绘制您的绘图,并使用buf_context ...
  2. 不要忘记,不要直接调用drawRect:而是调用setNeedsDisplay来强制重新绘制或刷新绘图 。我希望这有帮助