4

CGContextDrawImage 関数を使用して 2 つの画像を結合するアプリがあります。これが私の問題です。iPhone 5のiOSシミュレーターには1つの画像しか表示されませんが、iPhone 3のiPhoneシミュレーターではこれらの画像の表示に問題はなく、問題はありません。ところで、ここに Xcode が私に与えているエラーのリストがあります。

//エラー

: 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;
4

2 に答える 2

0

drawRectUIImageView サブクラスの : メソッド内にコンテキストを作成し、そのコンテキストをメソッドに渡す必要があります。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. setNeedsDisplaydrawRect: を直接呼び出すのではなく、強制的に reDraw を呼び出すか、図面を更新することを忘れないでください。これが役立つことを願っています
于 2014-03-05T11:11:43.120 に答える