iOS拍照后图片自动旋转90度的完美解决方法
今天开发一个拍照获取照片的功能的时候,发现上传之后图片会自动旋转90.
测试发现,只要是图片大于2M,系统就会自动翻转照片
相机拍照后直接取出来的UIimage(用UIImagePickerControllerOriginalImage取出),它本身的imageOrientation属性是3,即UIImageOrientationRight。如果这个图片直接使用则没事,但是如果对它进行裁剪、缩放等操作后,它的这个imageOrientation属性会变成0。此时这张图片用在别的地方就会发生旋转。imageOrientation是只读的,不能直接修改其值。
解决方法如下:
1.设置相机的一个属性allowsEditing为YES,设了这个值,你拍完照片后会在照片上出现一个框框,这就是对照片的裁剪编辑。在相机的代理方法中取照片的时候就别用UIImagePickerControllerOriginalImage来取了,要用UIImagePickerControllerEditedImage。用这个key取出来的照片,它的imageOrientation是0,所以之后的任何裁剪、缩放操作都不会造成旋转。这是第一种方法。
2.第一种解决方法基本没用,开发中基本都会对图片进行裁剪和压缩.这里有一个专门针对这个事的很好的category
+(UIImage*)fixOrientation:(UIImage*)aImage{ //No-opiftheorientationisalreadycorrect if(aImage.imageOrientation==UIImageOrientationUp) returnaImage; //Weneedtocalculatethepropertransformationtomaketheimageupright. //Wedoitin2steps:RotateifLeft/Right/Down,andthenflipifMirrored. CGAffineTransformtransform=CGAffineTransformIdentity; switch(aImage.imageOrientation){ caseUIImageOrientationDown: caseUIImageOrientationDownMirrored: transform=CGAffineTransformTranslate(transform,aImage.size.width,aImage.size.height); transform=CGAffineTransformRotate(transform,M_PI); break; caseUIImageOrientationLeft: caseUIImageOrientationLeftMirrored: transform=CGAffineTransformTranslate(transform,aImage.size.width,0); transform=CGAffineTransformRotate(transform,M_PI_2); break; caseUIImageOrientationRight: caseUIImageOrientationRightMirrored: transform=CGAffineTransformTranslate(transform,0,aImage.size.height); transform=CGAffineTransformRotate(transform,-M_PI_2); break; default: break; } switch(aImage.imageOrientation){ caseUIImageOrientationUpMirrored: caseUIImageOrientationDownMirrored: transform=CGAffineTransformTranslate(transform,aImage.size.width,0); transform=CGAffineTransformScale(transform,-1,1); break; caseUIImageOrientationLeftMirrored: caseUIImageOrientationRightMirrored: transform=CGAffineTransformTranslate(transform,aImage.size.height,0); transform=CGAffineTransformScale(transform,-1,1); break; default: break; } //NowwedrawtheunderlyingCGImageintoanewcontext,applyingthetransform //calculatedabove. CGContextRefctx=CGBitmapContextCreate(NULL,aImage.size.width,aImage.size.height, CGImageGetBitsPerComponent(aImage.CGImage),0, CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage)); CGContextConcatCTM(ctx,transform); switch(aImage.imageOrientation){ caseUIImageOrientationLeft: caseUIImageOrientationLeftMirrored: caseUIImageOrientationRight: caseUIImageOrientationRightMirrored: //Grr... CGContextDrawImage(ctx,CGRectMake(0,0,aImage.size.height,aImage.size.width),aImage.CGImage); break; default: CGContextDrawImage(ctx,CGRectMake(0,0,aImage.size.width,aImage.size.height),aImage.CGImage); break; } //AndnowwejustcreateanewUIImagefromthedrawingcontext CGImageRefcgimg=CGBitmapContextCreateImage(ctx); UIImage*img=[UIImageimageWithCGImage:cgimg]; CGContextRelease(ctx); CGImageRelease(cgimg); returnimg; }
以上所述是小编给大家介绍的iOS拍照后图片自动旋转90度的完美解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!