gpt4 book ai didi

iphone - 强制 UIImagePickerController 以纵向/尺寸 iOS 拍照

转载 作者:行者123 更新时间:2023-12-03 18:30:20 25 4
gpt4 key购买 nike

我的应用程序中唯一允许的方向是横向。我在目标 > Summery 下的项目属性中强制执行此操作,并且仅允许在 shouldAutorotateToInterfaceOrientation

中使用纵向

问题是,当我水平握住手机(横向)拍照时,照片将以横向方向拍摄,而 UI 仍保持纵向模式。

这意味着在横向模式下我会得到 3264 x 2448 的宽图像,而不是在纵向模式下得到的高图像 (2448 x 3264)。

接下来,用户可以裁剪图像,但如果图像是在横向模式下拍摄的,我会得到非常丑陋的拉伸(stretch)图像。无法添加边框或将 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;

最佳答案

在 UIImage 上设置 imageOrientation 标志,具体取决于拍照时相机的向上方向。这是一个只读标志,决定了当您将图像放入 View 中时 iOS 将尝试显示图像的方向。

您可以在显示图像之前检查方向,并相应地操作 imageView。假设您有一个包含在相同大小的 View 内的 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 日志记录 various UIImage metadata issues

关于iphone - 强制 UIImagePickerController 以纵向/尺寸 iOS 拍照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14484816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com