Этот ответ является дополнением ответа gontovnik в.
Я принял решение Objective-C и написал его в Swift. Поместите эту функцию там, где это необходимо. Просто перейдите в UIImage, о котором идет речь.
Это, скорее всего, просто сделает это функцией класса UIImage. Было бы неплохо просто позвонить UIImage.fixOrientation(image: imageInQuestion)
.
func fixOrientation(image: UIImage) -> UIImage {
// No-op if the orientation is already correct
if (image.imageOrientation == UIImageOrientation.Up) { return image; }
println(image.imageOrientation)
// 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 = CGAffineTransformIdentity
switch (image.imageOrientation) {
case .Down, .DownMirrored:
transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height)
transform = CGAffineTransformRotate(transform, CGFloat(M_PI))
break
case .Left, .LeftMirrored:
transform = CGAffineTransformTranslate(transform, image.size.width, 0)
transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))
break
case .Right, .RightMirrored:
transform = CGAffineTransformTranslate(transform, 0, image.size.height)
transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2))
break
case .Up, .UpMirrored:
break
}
switch (image.imageOrientation) {
case .UpMirrored, .DownMirrored:
transform = CGAffineTransformTranslate(transform, image.size.width, 0)
transform = CGAffineTransformScale(transform, -1, 1)
break
case .LeftMirrored, .RightMirrored:
transform = CGAffineTransformTranslate(transform, image.size.height, 0)
transform = CGAffineTransformScale(transform, -1, 1)
break
case .Up, .Down, .Left, .Right:
break
}
// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
var ctx = CGBitmapContextCreate(nil, Int(image.size.width), Int(image.size.height), CGImageGetBitsPerComponent(image.CGImage), 0, CGImageGetColorSpace(image.CGImage), CGImageGetBitmapInfo(image.CGImage))
CGContextConcatCTM(ctx, transform);
switch (image.imageOrientation) {
case .Left, .LeftMirrored, .Right, .RightMirrored:
// Grr...
CGContextDrawImage(ctx, CGRectMake(0, 0, image.size.height, image.size.width), image.CGImage)
break
default:
CGContextDrawImage(ctx, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage)
break
}
// And now we just create a new UIImage from the drawing context
var cgimg = CGBitmapContextCreateImage(ctx)
var img = UIImage(CGImage: cgimg)
return img!
}
Ну, что установил его, но почему это происходит? Это ошибка iOS 8? Будет ли это решение работать для iOS 4-7 и т. Д.? Также, возможно, это просто мои глаза, но похоже, что изображение, которое я получаю в конце, имея правильную ориентацию, имеет очень небольшое низкое качество. – David
Нет, это не проблема. Когда вы делаете снимок, он принимает ориентацию устройства (так я думаю, а не на 100% уверен, что это правильно), поэтому было решение исправить то, что я использую с iOS 6. Хм, качество не должно быть ниже, так как они не масштабируются, только вращаются. – gontovnik
Да, я сделал еще несколько фото, и я уверен, что мои глаза обманывают меня: P. Хорошо. Благодаря тонну! Так это происходит с iOS 6? – David