xcode 保存方向错误的图像
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12667964/
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
saving image with wrong orientation
提问by Bazinga
I'm using the AGImagepickerContollerwhich could save multiple images from the camera roll, I am saving this way in the successBlock:
我正在使用AGImagepickerContoller它可以从相机胶卷中保存多个图像,我以这种方式保存在successBlock:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask ,YES );
NSString *documentsDir = [paths objectAtIndex:0];
NSString *savedImagePath = [documentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"oneSlotImages%u.png", i]];
ALAssetRepresentation *rep = [[info objectAtIndex: i] defaultRepresentation];
UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage]];
//----resize the images
image = [self imageByScalingAndCroppingForSize:image toSize:CGSizeMake(256,256*image.size.height/image.size.width)];
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:savedImagePath atomically:YES];
My problem is when saving, and is used loaded in my preview. it looks like this:

我的问题是保存时,并在我的预览中加载使用。它看起来像这样:

What I wanted is to have it like this in the preview:
我想要的是在预览中像这样:


I have read this iOS UIImagePickerController result image orientation after upload.
我已经阅读了这个iOS UIImagePickerController result imageorientation after upload。
But I dont quite understand where I should put it in my code. Hope someone could guide in my problem. Thankyou.
但我不太明白我应该把它放在我的代码中的什么地方。希望有人能指导我的问题。谢谢你。
回答by Haider
Here's the method, pass UIImage of whatever orientation it will return portrait image
这是方法,传递任何方向的 UIImage 它将返回纵向图像
-(UIImage*)rotateUIImage:(UIImage*)src {
// No-op if the orientation is already correct
if (src.imageOrientation == UIImageOrientationUp) return src ;
// 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 (src.imageOrientation) {
case UIImageOrientationDown:
case UIImageOrientationDownMirrored:
transform = CGAffineTransformTranslate(transform, src.size.width, src.size.height);
transform = CGAffineTransformRotate(transform, M_PI);
break;
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
transform = CGAffineTransformTranslate(transform, src.size.width, 0);
transform = CGAffineTransformRotate(transform, M_PI_2);
break;
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
transform = CGAffineTransformTranslate(transform, 0, src.size.height);
transform = CGAffineTransformRotate(transform, -M_PI_2);
break;
case UIImageOrientationUp:
case UIImageOrientationUpMirrored:
break;
}
switch (src.imageOrientation) {
case UIImageOrientationUpMirrored:
case UIImageOrientationDownMirrored:
transform = CGAffineTransformTranslate(transform, src.size.width, 0);
transform = CGAffineTransformScale(transform, -1, 1);
break;
case UIImageOrientationLeftMirrored:
case UIImageOrientationRightMirrored:
transform = CGAffineTransformTranslate(transform, src.size.height, 0);
transform = CGAffineTransformScale(transform, -1, 1);
break;
case UIImageOrientationUp:
case UIImageOrientationDown:
case UIImageOrientationLeft:
case UIImageOrientationRight:
break;
}
// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
CGContextRef ctx = CGBitmapContextCreate(NULL, src.size.width, src.size.height,
CGImageGetBitsPerComponent(src.CGImage), 0,
CGImageGetColorSpace(src.CGImage),
CGImageGetBitmapInfo(src.CGImage));
CGContextConcatCTM(ctx, transform);
switch (src.imageOrientation) {
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
// Grr...
CGContextDrawImage(ctx, CGRectMake(0,0,src.size.height,src.size.width), src.CGImage);
break;
default:
CGContextDrawImage(ctx, CGRectMake(0,0,src.size.width,src.size.height), src.CGImage);
break;
}
// And now we just create a new UIImage from the drawing context
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
UIImage *img = [UIImage imageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img;
}
回答by Janak Nirmal
Import that category method and put it before resizing like this .
导入该类别方法并将其放在像这样调整大小之前。
image = [self fixOrientation]; //Put it like this.
image = [self imageByScalingAndCroppingForSize:image toSize:CGSizeMake(256,256*image.size.height/image.size.width)];
//resize the images
//调整图片大小
Or you can put it after resizing too like,
或者你也可以在调整大小后把它放得太像,
//----resize the images
image = [self imageByScalingAndCroppingForSize:image toSize:CGSizeMake(256,256*image.size.height/image.size.width)];
image = [image fixOrientation]; //Put it like this.
回答by J.SwiftNewbie
Completely fixed my problem!
完全解决了我的问题!
I was so frustrated with image orientation also unexpectedly rotating 90degrees in my ImageViews until i changed one line in my code from PNG to JPEG (seems to preserve original orientation data):
我对图像方向在我的 ImageViews 中意外旋转 90 度感到非常沮丧,直到我将代码中的一行从 PNG 更改为 JPEG(似乎保留了原始方向数据):
I replaced:
我替换了:
let data = UIImagePNGRepresentation(imageView.image!)
With:
和:
let data = UIImageJPEGRepresentation(imageView.image!, 100)
Thanx a million to this related answer by Tomasz Nguyen MFMailComposeViewController image orientation
Tomasz Nguyen MFMailComposeViewController 图像方向对这个相关答案的感谢一百万
Hope this helps someone out there :)
希望这可以帮助那里的人:)
回答by v_1
UIImage *temp = [UIImage imageWithCGImage:imgref scale:1.0f orientation:UIImageOrientationUp];

