xcode 从相机捕获的iphone图像自动旋转-90度
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9324130/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
iphone image captured from camera rotate -90 degree automatically
提问by iPhone
Programatically I have fetched image from my camera in my app. It has been fetched nicely but when I shift to another view and dismiss that view at that time my image automatically rotate -90 degree.
我以编程方式从我的应用程序中的相机中获取了图像。它已被很好地获取,但是当我切换到另一个视图并在那时关闭该视图时,我的图像会自动旋转 -90 度。
and this change occurs only first time after that when I shift no change occurs means image stays in -90 degree state and this happens only when I captued image from camera. when I fetch image from photo library no issue has been found.
并且这种变化仅发生在第一次之后,当我移动时没有变化发生意味着图像保持在 -90 度状态,这仅在我从相机捕获图像时发生。当我从照片库中获取图像时,没有发现任何问题。
following image is my original image
下图是我的原图
and this is rotated image
这是旋转的图像
I don't know why this change happen.
我不知道为什么会发生这种变化。
回答by Hiren
you have to use this function to rotate image captured by camera
您必须使用此功能来旋转相机拍摄的图像
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingImage:(UIImage *)image
editingInfo:(NSDictionary *)editingInfo
{
image = [self scaleAndRotateImage:image];
[self useImage:image];
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
}
- (void)scaleAndRotateImage:(UIImage *)image
{
int kMaxResolution = 320; // Or whatever
CGImageRef imgRef = image.CGImage;
CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);
CGAffineTransform transform = CGAffineTransformIdentity;
CGRect bounds = CGRectMake(0, 0, width, height);
if (width > kMaxResolution || height > kMaxResolution) {
CGFloat ratio = width/height;
if (ratio > 1) {
bounds.size.width = kMaxResolution;
bounds.size.height = bounds.size.width / ratio;
}
else {
bounds.size.height = kMaxResolution;
bounds.size.width = bounds.size.height * ratio;
}
}
CGFloat scaleRatio = bounds.size.width / width;
CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
CGFloat boundHeight;
UIImageOrientation orient = image.imageOrientation;
switch(orient) {
case UIImageOrientationUp: //EXIF = 1
transform = CGAffineTransformIdentity;
break;
case UIImageOrientationUpMirrored: //EXIF = 2
transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
transform = CGAffineTransformScale(transform, -1.0, 1.0);
break;
case UIImageOrientationDown: //EXIF = 3
transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
transform = CGAffineTransformRotate(transform, M_PI);
break;
case UIImageOrientationDownMirrored: //EXIF = 4
transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
transform = CGAffineTransformScale(transform, 1.0, -1.0);
break;
case UIImageOrientationLeftMirrored: //EXIF = 5
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
transform = CGAffineTransformScale(transform, -1.0, 1.0);
transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
break;
case UIImageOrientationLeft: //EXIF = 6
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
break;
case UIImageOrientationRightMirrored: //EXIF = 7
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeScale(-1.0, 1.0);
transform = CGAffineTransformRotate(transform, M_PI / 2.0);
break;
case UIImageOrientationRight: //EXIF = 8
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
transform = CGAffineTransformRotate(transform, M_PI / 2.0);
break;
default:
[NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];
}
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {
CGContextScaleCTM(context, -scaleRatio, scaleRatio);
CGContextTranslateCTM(context, -height, 0);
}
else {
CGContextScaleCTM(context, scaleRatio, -scaleRatio);
CGContextTranslateCTM(context, 0, -height);
}
CGContextConcatCTM(context, transform);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self setRotatedImage:imageCopy];
//return imageCopy;
}
回答by Vishnu Kumar. S
The most simplest way to overcome this problem is by scaling the image inside didFinishPickingImage
delegate. You can use the following code to scale by importing a class "UIImage+ImageScaling.h
".
解决这个问题最简单的方法是在didFinishPickingImage
委托内部缩放图像。您可以使用以下代码通过导入类“ UIImage+ImageScaling.h
”来进行缩放。
theImage =[UIImage imageWithImage:image scaledToSizeWithSameAspectRatio:CGSizeMake(400, 300)];
// for iphone.
theImage =[UIImage imageWithImage:image scaledToSizeWithSameAspectRatio:CGSizeMake(400, 300)];
// for iphone.
回答by cjd
This method works for me,
这个方法对我有用
- (UIImage*) rotateImageAppropriately:(UIImage*)imageToRotate
{
UIImage* properlyRotatedImage;
CGImageRef imageRef = [imageToRotate CGImage];
if (imageToRotate.imageOrientation == 0)
{
properlyRotatedImage = imageToRotate;
}
else if (imageToRotate.imageOrientation == 3)
{
CGSize imgsize = imageToRotate.size;
UIGraphicsBeginImageContext(imgsize);
[imageToRotate drawInRect:CGRectMake(0.0, 0.0, imgsize.width, imgsize.height)];
properlyRotatedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
else if (imageToRotate.imageOrientation == 1)
{
properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:1];
}
return properlyRotatedImage;
}
回答by noopmk
The badbehavior has now changed with 13.4. Images are now captured with accurate orientation.
在恶劣现在行为已更改13.4。现在以准确的方向捕获图像。
回答by Inder Kumar Rathore
Try this property
试试这个属性
@property (nonatomic) CGAffineTransform cameraViewTransform
@property (nonatomic) CGAffineTransform cameraViewTransform
and rotate is with -90 degree and then capture the image. If doesn't work the use the code given by Cocoa Matters.
并以-90度旋转,然后捕获图像。如果不起作用,请使用 Cocoa Matters 提供的代码。
回答by The iOSDev
回答by sateesh
It is due to your image orientation. so keep original image orientation. you will get the image orientation in your UIImagePickerController delegate method
这是由于您的图像方向。所以保持原始图像方向。您将在 UIImagePickerController 委托方法中获得图像方向
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
sample code:
示例代码:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *sourceImage = [info valueForKey:UIImagePickerControllerOriginalImage];
NSData *data = UIImagePNGRepresentation(sourceImage);
UIImage *tmp = [UIImage imageWithData:data];
UIImage *afterFixingOrientation = [UIImage imageWithCGImage:tmp.CGImage
scale:sourceImage.scale
orientation:sourceImage.imageOrientation];
[self.imagePickerController dismissViewControllerAnimated:YES completion:nil];
}