-?(UIImage*)fixOrientation:(UIImage*)aImage?{
//?No-op?if?the?orientation?is?already?correct
if(aImage.imageOrientation==?UIImageOrientationUp)
returnaImage;
//?We?need?to?calculate?the?proper?transformation?to?make?the?image?upright.
//?We?do?it?in?2?steps:?Rotate?if?Left/Right/Down,?and?then?flip?if?Mirrored.
CGAffineTransform?transform?=?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;
}
//?Now?we?draw?the?underlying?CGImage?into?a?new?context,?applying?the?transform
//?calculated?above.
CGContextRef?ctx?=?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;
}
//?And?now?we?just?create?a?new?UIImage?from?the?drawing?context
CGImageRef?cgimg?=?CGBitmapContextCreateImage(ctx);
UIImage*img?=?[UIImageimageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
returnimg;
}