iOS UIImagePickerController上载后结果图像方向

我正在iOS 3.1.3 iPhone上测试我的iPhone应用程序。 我正在使用UIImagePickerController选择/捕获图像:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setDelegate:self];
[self.navigationController presentModalViewController:imagePicker animated:YES];
[imagePicker release];

  • (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    self.image = [info objectForKey:UIImagePickerControllerOriginalImage];
    imageView.image = self.image;
    [self.navigationController dismissModalViewControllerAnimated:YES];
    submitButton.enabled = YES;
    }
    然后,我会使用ASI类将其发送到我的Web服务器:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@“http://example.com/myscript.php”]];
[request setDelegate:self];
[request setStringEncoding:NSUTF8StringEncoding];
[request setShouldContinueWhenAppEntersBackground:YES];
//other post keys/values
[request setFile:UIImageJPEGRepresentation(self.image, 100.0f) withFileName:[NSString stringWithFormat:@"%d.jpg", [[NSDate date] timeIntervalSinceNow]] andContentType:@“image/jpg” forKey:@“imageFile”];
[request startAsynchronous];
问题:当我用iphone保持横向拍摄照片时,图像被上传到服务器,并且图像看起来像您期望的那样。 手持肖像拍摄手机时,图像会被旋转90度上传并查看。

我的应用程序设置为仅在纵向模式下工作(上下和常规)。

上传后如何使图像始终显示正确的方向?

该图像似乎是正确的,如在UIImageView中显示的(在拍摄照片后直接显示),但是在服务器上查看则相反。

#1楼
我想出了一个简单得多的方法:

  • (UIImage *)normalizedImage {
    if (self.imageOrientation == UIImageOrientationUp) return self;

    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    [self drawInRect:(CGRect){0, 0, self.size}];
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return normalizedImage;
    }
    顺便说一句:@Anomie的代码未考虑scale ,因此不适用于2x图像。

#2楼
这是我发现的解决定向问题的方法

UIImage *initialImage = [info objectForKey:@“UIImagePickerControllerOriginalImage”];
NSData *data = UIImagePNGRepresentation(self.initialImage);

UIImage *tempImage = [UIImage imageWithData:data];
UIImage *fixedOrientationImage = [UIImage imageWithCGImage:tempImage.CGImage
scale:initialImage.scale
orientation:self.initialImage.imageOrientation];
initialImage = fixedOrientationImage;
编辑:

UIImage *initialImage = [info objectForKey:@“UIImagePickerControllerOriginalImage”];
NSData *data = UIImagePNGRepresentation(self.initialImage);

initialImage = [UIImage imageWithCGImage:[UIImage imageWithData:data].CGImage
scale:initialImage.scale
orientation:self.initialImage.imageOrientation];
#3楼
在设计用于拍照的应用程序时,我使用了此页面,发现与以前的答案相比,以下方法将纠正方向并使用更少的内存和处理器:

CGImageRef cgRef = image.CGImage;
image = [[UIImage alloc] initWithCGImage:cgRef scale:1.0 orientation:UIImageOrientationUp];
基本上,这只是将实际图像数据重新包装为新的方向。 我使用的是@ an0的代码,但它会在内存中生成一个新图像,这可能会增加您可能从相机获得的3264x2448图像的负担。

#4楼
如果启用编辑,则编辑后的图像(相对于原始图像)将按预期的方向放置:

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.allowsEditing = YES;
// set delegate and present controller

  • (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *photo = [info valueForKey:UIImagePickerControllerEditedImage];
    // do whatever
    }
    启用编辑后,用户可以在点击“使用照片”之前调整图像大小并移动图像

#5楼
迅速地;)

更新SWIFT 3.0:D

func sFunc_imageFixOrientation(img:UIImage) -> UIImage {

// No-op if the orientation is already correct
if (img.imageOrientation == UIImageOrientation.up) {
    return img;
}
// 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.
var transform:CGAffineTransform = CGAffineTransform.identity

if (img.imageOrientation == UIImageOrientation.down
    || img.imageOrientation == UIImageOrientation.downMirrored) {

    transform = transform.translatedBy(x: img.size.width, y: img.size.height)
    transform = transform.rotated(by: CGFloat(M_PI))
}

if (img.imageOrientation == UIImageOrientation.left
    || img.imageOrientation == UIImageOrientation.leftMirrored) {

    transform = transform.translatedBy(x: img.size.width, y: 0)
    transform = transform.rotated(by: CGFloat(M_PI_2))
}

if (img.imageOrientation == UIImageOrientation.right
    || img.imageOrientation == UIImageOrientation.rightMirrored) {

    transform = transform.translatedBy(x: 0, y: img.size.height);
    transform = transform.rotated(by: CGFloat(-M_PI_2));
}

if (img.imageOrientation == UIImageOrientation.upMirrored
    || img.imageOrientation == UIImageOrientation.downMirrored) {

    transform = transform.translatedBy(x: img.size.width, y: 0)
    transform = transform.scaledBy(x: -1, y: 1)
}

if (img.imageOrientation == UIImageOrientation.leftMirrored
    || img.imageOrientation == UIImageOrientation.rightMirrored) {

    transform = transform.translatedBy(x: img.size.height, y: 0);
    transform = transform.scaledBy(x: -1, y: 1);
}


// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
let ctx:CGContext = CGContext(data: nil, width: Int(img.size.width), height: Int(img.size.height),
                              bitsPerComponent: img.cgImage!.bitsPerComponent, bytesPerRow: 0,
                              space: img.cgImage!.colorSpace!,
                              bitmapInfo: img.cgImage!.bitmapInfo.rawValue)!

ctx.concatenate(transform)


if (img.imageOrientation == UIImageOrientation.left
    || img.imageOrientation == UIImageOrientation.leftMirrored
    || img.imageOrientation == UIImageOrientation.right
    || img.imageOrientation == UIImageOrientation.rightMirrored
    ) {


    ctx.draw(img.cgImage!, in: CGRect(x:0,y:0,width:img.size.height,height:img.size.width))

} else {
    ctx.draw(img.cgImage!, in: CGRect(x:0,y:0,width:img.size.width,height:img.size.height))
}


// And now we just create a new UIImage from the drawing context
let cgimg:CGImage = ctx.makeImage()!
let imgEnd:UIImage = UIImage(cgImage: cgimg)

return imgEnd

}

发布了124 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/a59612/article/details/104858031
ios