1

我正在设计一个界面,用户可以使用手势缩放和旋转图像,然后在完成后将图像与背景图像合并。我在将旋转后的图像与背景合并时遇到问题。

- (void) donePlacingPicture
{
    UIImage * scaledTopImg = [self.photoImage.image imageByScalingProportionallyToSize:self.photoImage.frame.size];

    UIGraphicsBeginImageContext(scaledTopImg.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(ctx, scaledTopImg.size.width * 0.5f, scaledTopImg.size.height  * 0.5f);
    CGFloat angle = atan2(self.photoImage.transform.b, self.photoImage.transform.a);
    CGContextRotateCTM(ctx, angle);
    [scaledTopImg drawInRect:CGRectMake(- scaledTopImg.size.width * 0.5f, -(scaledTopImg.size.height  * 0.5f), scaledTopImg.size.width, scaledTopImg.size.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIGraphicsBeginImageContext(self.MainImage.image.size);
    [self.MainImage.image drawInRect:CGRectMake(0, 0, self.MainImage.image.size.width, self.MainImage.image.size.height)];
    [newImage drawInRect:CGRectMake(self.photoImage.frame.origin.x, self.photoImage.frame.origin.y, newImage.size.width, newImage.size.height)];
    self.MainImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext(); 

    self.photoImage.hidden = TRUE;
    self.photoImage = nil;
}

这给了我以下错误

CGContextSaveGState: invalid context 0x0
CGContextSetBlendMode: invalid context 0x0
CGContextSetAlpha: invalid context 0x0
CGContextTranslateCTM: invalid context 0x0
CGContextScaleCTM: invalid context 0x0
CGContextDrawImage: invalid context 0x0
CGContextRestoreGState: invalid context 0x0

有时此功能有效并且图像以旋转形式添加,但比例会稍微偏离,角落会被裁剪,其他时候什么都不会出现,我会收到这些错误。我相信错误来自

[newImage drawInRect:CGRectMake(self.photoImage.frame.origin.x, self.photoImage.frame.origin.y, newImage.size.width, newImage.size.height)];

导致图像上下文设置为 nil ,这会引发错误

self.MainImage.image = UIGraphicsGetImageFromCurrentImageContext();

到达了。注释掉这些行中的任何一行时,我都没有收到错误消息。

有谁知道错误的含义,知道旋转时查看的更好方法,或者可以指向完成此操作的示例项目?

在此先感谢,这是我在 stackoverflow 上的第一篇文章。我意识到有多个与此类似的问题,但没有一个对我的情况很有帮助。

4

0 回答 0