Iphone 旋转和裁剪图像

Iphone 旋转和裁剪图像,iphone,objective-c,ios,xcode,Iphone,Objective C,Ios,Xcode,我正在UIImageView上执行旋转,然后尝试裁剪其中的一部分并将其保存为UIImage。UIImageView会旋转,但始终会修剪照片的同一部分。因此,裁剪不考虑图像旋转。我做错了什么 //rotate image CGRect new = CGRectMake(0, 0, 100, 50); CGAffineTransform rotation = CGAffineTransformMakeRotation(5); [photo setTransform:rotation]; // c

我正在UIImageView上执行旋转,然后尝试裁剪其中的一部分并将其保存为UIImage。UIImageView会旋转,但始终会修剪照片的同一部分。因此,裁剪不考虑图像旋转。我做错了什么

//rotate image 
CGRect new = CGRectMake(0, 0, 100, 50);
CGAffineTransform rotation = CGAffineTransformMakeRotation(5);
[photo setTransform:rotation];

// crop image 
CGImageRef imageRef = CGImageCreateWithImageInRect([photo.image CGImage], new);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef);

// display crop bounds 
UIView* faceBounds = [[UIView alloc] initWithFrame:new];
faceBounds.layer.borderWidth = 2;
faceBounds.layer.borderColor = [[UIColor redColor] CGColor];

使用以下代码段旋转图像数据

输入数据为角度(弧度)和图像UIImage实例

这将创建一个图像上下文,对其应用转换,并将原始图像绘制到该上下文中。生成的图像数据现在将存储在resultImage中

前三行处理边界结果图像帧的计算

UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, inImage.size.width, inImage.size.height)];
rotatedViewBox.transform = CGAffineTransformMakeRotation(inAngle);
CGSize rotatedSize = rotatedViewBox.frame.size;

UIGraphicsBeginImageContext(rotatedSize);
CGContextRef bitmap = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(bitmap, rotatedSize.width / 2.0f, rotatedSize.height / 2.0f);
CGContextRotateCTM(bitmap, inAngle);
CGContextScaleCTM(bitmap, 1.0f, -1.0f);
CGContextDrawImage(bitmap, CGRectMake(-inImage.size.width / 2.0f,
                                      -inImage.size.height / 2.0f,
                                      inImage.size.width,
                                      inImage.size.height),
                                      inImage.CGImage);
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

使用以下代码段旋转图像数据

输入数据为角度(弧度)和图像UIImage实例

这将创建一个图像上下文,对其应用转换,并将原始图像绘制到该上下文中。生成的图像数据现在将存储在resultImage中

前三行处理边界结果图像帧的计算

UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, inImage.size.width, inImage.size.height)];
rotatedViewBox.transform = CGAffineTransformMakeRotation(inAngle);
CGSize rotatedSize = rotatedViewBox.frame.size;

UIGraphicsBeginImageContext(rotatedSize);
CGContextRef bitmap = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(bitmap, rotatedSize.width / 2.0f, rotatedSize.height / 2.0f);
CGContextRotateCTM(bitmap, inAngle);
CGContextScaleCTM(bitmap, 1.0f, -1.0f);
CGContextDrawImage(bitmap, CGRectMake(-inImage.size.width / 2.0f,
                                      -inImage.size.height / 2.0f,
                                      inImage.size.width,
                                      inImage.size.height),
                                      inImage.CGImage);
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();


这对现在来说太晚了,但是现在有人可以尝试这对现在来说太晚了,但是现在有人可以尝试,因为转换是在将图像视图渲染到屏幕时应用的,而不是在图像数据本身上。我明白了。。我该怎么解决这个问题呢?看起来你的旋转角度用错了单位。我猜你的意思是旋转5度。为此,必须将该角度转换为弧度。一个简单的转换是angleInRadians=angleInDegrees*M_PI/180I刚才举了一个例子,我意识到我需要将度转换成弧度。在这方面花了这么多时间,但再次感谢您的帮助。我很高兴-希望从现在开始一切顺利。因为转换是在将图像视图渲染到屏幕时应用的,而不是在图像数据本身上。我明白了。。我该怎么解决这个问题呢?看起来你的旋转角度用错了单位。我猜你的意思是旋转5度。为此,必须将该角度转换为弧度。一个简单的转换是angleInRadians=angleInDegrees*M_PI/180I刚才举了一个例子,我意识到我需要将度转换成弧度。在这上面花了这么多时间,但再次感谢您的帮助。我很高兴-希望从现在开始一切顺利。嘿,谢谢您的代码片段。我想问,图像从何而来?0,0? 如果是这样,我怎样才能使它从图像中心旋转?。此外,如果图像是jpeg格式,我是否需要修改“位图”部分?这段代码的工作原理和jpeg一样,只是好奇而已。它围绕图像的中心旋转。只要UIImage正确理解源格式,源格式就无关紧要。该位图有点误导。这是一个用于在内存中而不是在屏幕上绘图的图形上下文。@直到我尝试您的代码,但它不起作用。我不明白CGRectMake是如何定位x和y的?@Odelya这段代码工作得很好,请放心。你到底有什么问题?我不明白CGRectMake是如何定位x和y的。嘿,谢谢你的代码片段。我想问,图像从何而来?0,0? 如果是这样,我怎样才能使它从图像中心旋转?。此外,如果图像是jpeg格式,我是否需要修改“位图”部分?这段代码的工作原理和jpeg一样,只是好奇而已。它围绕图像的中心旋转。只要UIImage正确理解源格式,源格式就无关紧要。该位图有点误导。这是一个用于在内存中而不是在屏幕上绘图的图形上下文。@直到我尝试您的代码,但它不起作用。我不明白CGRectMake是如何定位x和y的?@Odelya这段代码工作得很好,请放心。你到底有什么问题?我不明白你的意思,我不明白CGRectMake是如何定位x和y的。这个答案更像是一个评论。我们强烈反对这种链接式的回答。我认为这应该被视为评论。我已经开发了这个库,并在链接中解释了代码,所以我认为没有必要在这里重复这个步骤@这个答案更像是一个评论。我们强烈反对这种链接式的回答。我认为这应该被视为评论。我已经开发了这个库,并在链接中解释了代码,所以我认为没有必要在这里重复这个步骤@直到