我有一个从UIImagePickerController获取的UIImage,当我从- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
方法接收到图像时,我直接将其放入UIImageView进行预览,并为用户提供保存或丢弃图像的选项。
当用户选择保存选项时,应用程序会获取图像的png数据并将其保存到文档目录中。但在两种可能的设备方向之一(仅横向)下,图像会颠倒保存(更具体地说,从它应该的位置旋转180度)。因此,当我在图库中加载图像时,它会颠倒显示。
(See图库中左下角的图像)
我已经解决了这个问题,UIImagePickerController中的UIImage中的原始图像数据没有旋转,相反,方向被存储为对象上的一个属性,只有在显示时才应用。因此,我尝试使用我在网上找到的一些代码旋转与UIImage关联的CGImage。但它似乎对图像完全没有影响。我使用的代码如下:
- (void)rotateImage:(UIImage*)image byRadians:(CGFloat)rads
{
// calculate the size of the rotated view's containing box for our drawing space
UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,image.size.width, image.size.height)];
CGAffineTransform t = CGAffineTransformMakeRotation(rads);
rotatedViewBox.transform = t;
CGSize rotatedSize = rotatedViewBox.frame.size;
// Create the bitmap context
UIGraphicsBeginImageContext(rotatedSize);
CGContextRef bitmap = UIGraphicsGetCurrentContext();
// Move the origin to the middle of the image you want to rotate and scale around the center.
CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);
// Rotate the image context
CGContextRotateCTM(bitmap, rads);
// Now, draw the rotated/scaled image into the context
CGContextScaleCTM(bitmap, 1.0, -1.0);
CGContextDrawImage(bitmap, CGRectMake(image.size.width / 2, image.size.height / 2, image.size.width, image.size.height), [image CGImage]);
image = UIGraphicsGetImageFromCurrentImageContext();
image = [UIImage imageWithCGImage:image.CGImage scale:1.0 orientation:UIImageOrientationDown];
UIGraphicsEndImageContext();
}
我想知道为什么这段代码不工作,因为我在网上找到的每一段代码做这个图像旋转似乎不工作。
6条答案
按热度按时间yv5phkfx1#
使用这个..它工作得很完美!只要确保你在从UIImagePicker中拾取图像时使用这个函数:
示例:
确保在从文档目录中拾取照片的地方使用此功能。
hpcdzsge2#
旋转和镜像UIImage CGImage支持数据- Swift
我最近想更正由
CGImage
支持的UIImage
,以匹配所需的方向,而不是依赖API来遵守UIImageOrientation参数。ljo96ir53#
适用于Cameron Lowell Palmer answer的Swift 3版本:
用法:
js81xvg64#
我知道你的问题了。你必须用
CGContextTranslateCTM(context, -rotatedSize.width/2, -rotatedSize.height/2);
把上下文翻译回来,同时把rect的原点设置为rotatedViewBox.frame.origin.x,rotatedViewBox.frame.origin.y。使用下面的代码。lrl1mhuk5#
所有这些答案的问题在于它们都依赖于UIKit。我正在开发一款面向iOS和macOS的SwiftUI Universal应用。卡梅隆·洛厄尔·帕尔默的答案需要做一些修改:
1.将UIImageOrientation更改为CGImagePropertyOrientation,并交换左右旋转符号
以下是我的版本,适用于iOS和macOS:
}
70gysomp6#
这只是对前面答案的重构。