我的应用中唯一允许的方向是横向。我在目标>下的项目属性中强制执行此操作夏季,只允许shouldAutorotateToInterfaceOrientation
问题是当我在水平握住手机(横向)的同时拍照时,照片将以横向拍摄,而UI仍处于纵向模式。
这意味着在横向模式下,我得到的是3264 x 2448的宽图像,而不是我在纵向模式下的高图像(2448 x 3264)。
接下来,用户可以裁剪图像,但如果以横向模式拍摄图像,我会得到非常难看的拉伸图像。添加边框或将UI切换为横向不是一种选择。
即使手机水平放置(横向模式),有没有办法强制UIImagePickerController
以纵向尺寸拍摄照片?
我使用以下设置初始化UIImagePickerController
:
imagePicker =[[UIImagePickerController alloc] init];
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
imagePicker.showsCameraControls = NO;
imagePicker.modalPresentationStyle = UIModalPresentationFullScreen;
imagePicker.wantsFullScreenLayout = YES;
imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform,CAMERA_TRANSFORM, CAMERA_TRANSFORM);
imagePicker.navigationBarHidden = YES;
imagePicker.toolbarHidden = YES;
[self presentModalViewController:imagePicker animated:NO];
imagePicker.cameraOverlayView = self.cameraOverlay;
imagePicker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
答案 0 :(得分:17)
在UIImage上设置imageOrientation标志,具体取决于拍摄照片时相机的保持方向。这是一个只读标志,用于确定iOS在将视图放入视图时尝试显示图像的方向。
您可以在显示图像之前检查方向,并相应地操作imageView。假设你有一个封装在相同大小的视图中的imageView ......
- (void) imagePickerImage:(UIImage*)image
{
if (image.imageOrientation == UIImageOrientationUp ) {
self.imageView.bounds = CGRectMake
(0, 0, self.view.bounds.size.height, self.view.bounds.size.width);
self.imageView.transform = CGAffineTransformMakeRotation(M_PI/2);
} else if (image.imageOrientation == UIImageOrientationDown) {
self.imageView.bounds = CGRectMake
(0, 0, self.view.bounds.size.height, self.view.bounds.size.width);
self.imageView.transform = CGAffineTransformMakeRotation(-M_PI/2);
}
else {
self.imageView.bounds = self.view.bounds;
self.imageView.transform = CGAffineTransformIdentity;
}
self.imageView.image = image;
}
另一种选择可能是从imageRep创建一个新图像:这应该去掉方向信息。
更新
iPhone照片的原生像素尺寸是横向的,无论手机拍摄时的方式如何。只有方向 EXIF 标志设置不同。您无法更改 EXIF 标志,但可以通过将图像位图数据复制到新的位图图像来将其删除。另请参阅我的答案here。
这是一种去除 EXIF 数据并添加纵向 EXIF 标记的方法。您正在创建新的UIImage并在创建时设置 EXIF 标志。您可以使用它将您的风景图像标记为纵向(UIImageOrientationRight
)。
- (UIImage*)stripExif:(UIImage*)image
{
CGImageRef cgImage = image.CGImage;
UIImage* result = [UIImage imageWithCGImage:cgImage scale:1
orientation:UIImageOrientationRight];
return result;
}
更新2
将UIImage的imageOrientation属性称为EXIF标志是误导性的,原因有两个:
(1)图像元数据存储在字典式结构中,其中可以是多个子字典,其中一个是EXIF。其他包括TIFF,IPTC,PNG等。顶级字典中还有一组通用标记。 orientation 键不在EXIF部分,可以在TIFF和IPTC子句中找到(如果存在),也可以作为顶级键。我们倾向于在将图像元数据作为一个整体引用时使用术语EXIF,但这是误导性的。
(2)图像文件中的方向元数据使用与Apple在其UIImage.imageOrientation属性中使用的标志约定不同的一组标志约定。因此,如果要读取此属性以正确显示图像,则必须小心。 Apple显然使用图像文件的方向元数据来设置UIImage的属性,但还是有一些翻译。
Orientation
Apple/UIImage.imageOrientation Jpeg/File kCGImagePropertyOrientation
UIImageOrientationUp = 0 = Landscape left = 1
UIImageOrientationDown = 1 = Landscape right = 3
UIImageOrientationLeft = 2 = Portrait down = 8
UIImageOrientationRight = 3 = Portrait up = 6
Here is a page显示'exif'旋转标记。与Apple's UIImage documentation(常量部分)比较。另请参阅Apple的CGImageProperties_Reference,尤其是kCGImagePropertyOrientation
我已将一个小项目加载到github logging various UIImage metadata issues
上