从相机拍摄的iphone图像自动旋转-90度
问题描述:
以编程方式,我从我的相机中取得了我的应用程序中的图像。它已被很好地提取,但当我转移到另一个视图,并在当时驳回该视图,我的图像自动旋转-90度。从相机拍摄的iphone图像自动旋转-90度
并且这种变化仅在第一次发生时,当我移动时没有发生变化,意味着图像保持在-90度的状态,这只有当我从相机拍摄图像时才会发生。当我从照片库中获取图像时,没有发现问题。
下图是我的原始图像
这个旋转图像
我不知道为什么这种变化发生。
答
你要使用此功能通过旋转摄像头
- (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;
}
答
拍摄的图像试试这个属性
@property (nonatomic) CGAffineTransform cameraViewTransform
和旋转是-90度,然后捕获图像。如果不起作用,则使用Cocoa Matters给出的代码。
答
克服的最简单的方法的最后2或3条评论这个问题是通过缩放didFinishPickingImage
代表中的图像。您可以使用以下代码通过导入类“UIImage+ImageScaling.h
”进行缩放。
theImage =[UIImage imageWithImage:image scaledToSizeWithSameAspectRatio:CGSizeMake(400, 300)];
// for iphone.
答
这是因为你的形象定位。所以保持原始图像的方向。你会得到的图像定位在你的UIImagePickerController委托方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
示例代码:
- (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];
}
答
这个方法对我的作品,
- (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;
}
此图像保存到库,看看图像是否是是否旋转? – 2012-02-17 07:02:27
@InderKumarRathore:我从存储在库中的设备相机捕获图像,然后我在我的应用程序中拍摄该图像,然后它也旋转 – iPhone 2012-02-17 07:07:49
我有很多研究后,我也有同样的问题,我发现解决方案检查我的答案 – Hiren 2012-02-17 07:10:30