ipad使用AVFoundation捕捉StillImage,图片比率问题

AVCaptureSession设置的是

AVCaptureSessionPresetPhoto,也就是New iPad摄像头最大分辨率2592*1936.但是capture得到的比率确实1936*2592.

这里描述了相同的问题:

http://stackoverflow.com/questions/6976213/why-does-capturing-images-with-avfoundation-give-me-480x640-images-when-the-pres

我参照http://blog.logichigh.com/2008/06/05/uiimage-fix/得到了解决

转换代码如下:

  1 UIImage *scaleAndRotateImage(UIImage *image)  

  2 {  

  3     int kMaxResolution = 2592; // Or whatever  

  4     

  5     CGImageRef imgRef = image.CGImage;  

  6     

  7     CGFloat width = CGImageGetWidth(imgRef);  

  8     CGFloat height = CGImageGetHeight(imgRef);  

  9     

 10     CGAffineTransform transform = CGAffineTransformIdentity;  

 11     CGRect bounds = CGRectMake(0, 0, width, height);  

 12     if (width > kMaxResolution || height > kMaxResolution) {  

 13         CGFloat ratio = width/height;  

 14         if (ratio > 1) {  

 15             bounds.size.width = kMaxResolution;  

 16             bounds.size.height = bounds.size.width / ratio;  

 17         }  

 18         else {  

 19             bounds.size.height = kMaxResolution;  

 20             bounds.size.width = bounds.size.height * ratio;  

 21         }  

 22     }  

 23     

 24     CGFloat scaleRatio = bounds.size.width / width;  

 25     CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));  

 26     CGFloat boundHeight;  

 27     UIImageOrientation orient = image.imageOrientation;  

 28     switch(orient) {  

 29             

 30         case UIImageOrientationUp: //EXIF = 1  

 31             transform = CGAffineTransformIdentity;  

 32             break;  

 33             

 34         case UIImageOrientationUpMirrored: //EXIF = 2  

 35             transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);  

 36             transform = CGAffineTransformScale(transform, -1.0, 1.0);  

 37             break;  

 38             

 39         case UIImageOrientationDown: //EXIF = 3  

 40             transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);  

 41             transform = CGAffineTransformRotate(transform, M_PI);  

 42             break;  

 43             

 44         case UIImageOrientationDownMirrored: //EXIF = 4  

 45             transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);  

 46             transform = CGAffineTransformScale(transform, 1.0, -1.0);  

 47             break;  

 48             

 49         case UIImageOrientationLeftMirrored: //EXIF = 5  

 50             boundHeight = bounds.size.height;  

 51             bounds.size.height = bounds.size.width;  

 52             bounds.size.width = boundHeight;  

 53             transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);  

 54             transform = CGAffineTransformScale(transform, -1.0, 1.0);  

 55             transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);  

 56             break;  

 57             

 58         case UIImageOrientationLeft: //EXIF = 6  

 59             boundHeight = bounds.size.height;  

 60             bounds.size.height = bounds.size.width;  

 61             bounds.size.width = boundHeight;  

 62             transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);  

 63             transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);  

 64             break;  

 65             

 66         case UIImageOrientationRightMirrored: //EXIF = 7  

 67             boundHeight = bounds.size.height;  

 68             bounds.size.height = bounds.size.width;  

 69             bounds.size.width = boundHeight;  

 70             transform = CGAffineTransformMakeScale(-1.0, 1.0);  

 71             transform = CGAffineTransformRotate(transform, M_PI / 2.0);  

 72             break;  

 73             

 74         case UIImageOrientationRight: //EXIF = 8  

 75             boundHeight = bounds.size.height;  

 76             bounds.size.height = bounds.size.width;  

 77             bounds.size.width = boundHeight;  

 78             transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);  

 79             transform = CGAffineTransformRotate(transform, M_PI / 2.0);  

 80             break;  

 81             

 82         default:  

 83             [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];  

 84             

 85     }  

 86     

 87     UIGraphicsBeginImageContext(bounds.size);  

 88     

 89     CGContextRef context = UIGraphicsGetCurrentContext();  

 90     

 91     if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {  

 92         CGContextScaleCTM(context, -scaleRatio, scaleRatio);  

 93         CGContextTranslateCTM(context, -height, 0);  

 94     }  

 95     else {  

 96         CGContextScaleCTM(context, scaleRatio, -scaleRatio);  

 97         CGContextTranslateCTM(context, 0, -height);  

 98     }  

 99     

100     CGContextConcatCTM(context, transform);  

101     

102     CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);  

103     UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();  

104     UIGraphicsEndImageContext();  

105     

106     return imageCopy;  

107 }  

你可能感兴趣的:(image)