2015-08-29 2 views
1

У меня есть пользователь, который выбирает картинку для обрезки с помощью своего рулона камеры. Я показываю все эти изображения в виде эскизов для нажатия на кнопку.Съемка с камерой вращает asset.fullScreenImage 90 градусов?

Я использую UIImage(CGImage: asset.fullScreenImage!.CGImage!, scale: scale, orientation: UIImageOrientation.Up), чтобы мое изображение оставалось таким же, как и в миниатюре. С asset.fullResolutionImage! это не работает.

Теперь наступает странная часть. Когда я делаю снимок с iPhone-камерой, а затем направляйтесь к моему кадрированию ViewController, изображение поворачивается на 90 градусов! Понятия не имею почему.

Если я покину свое приложение, сделайте снимок с камерой в обычном режиме, сохраните ее в рулоне камеры, а затем выберите ее из списка миниатюр, как, например, я делаю другие снимки, он отлично работает.

В чем причина этого? Как это исправить?

Редактировать: Ниже размещены два решения. Один в Objective-C, а другой - переведенная копия этого в Swift.

ответ

1

Вы можете попробовать использовать эту категорию:

UIImage+FixOrientation.h

UIImage+FixOrientation.m

Он построен в Objective-C, то вы можете использовать bridging header использовать ObjC в сочетании с Swift, или вы можете просто посмотреть, как это исправить.

Пример использования:

UIImage *image = <image from camera image> 
image = [image fixOrientation]; 
+0

Ну, что установил его, но почему это происходит? Это ошибка iOS 8? Будет ли это решение работать для iOS 4-7 и т. Д.? Также, возможно, это просто мои глаза, но похоже, что изображение, которое я получаю в конце, имея правильную ориентацию, имеет очень небольшое низкое качество. – David

+1

Нет, это не проблема. Когда вы делаете снимок, он принимает ориентацию устройства (так я думаю, а не на 100% уверен, что это правильно), поэтому было решение исправить то, что я использую с iOS 6. Хм, качество не должно быть ниже, так как они не масштабируются, только вращаются. – gontovnik

+0

Да, я сделал еще несколько фото, и я уверен, что мои глаза обманывают меня: P. Хорошо. Благодаря тонну! Так это происходит с iOS 6? – David

0

Этот ответ является дополнением ответа 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! 
} 
+0

Единственное, что я рекомендовал бы, это сделать ** UIImage ** * extension * вместо функции. – gontovnik

+0

Да, согласен. Написал, что над фрагментом кода :) – David

0

Swift 3 версия

func fixOrientation(image: UIImage) -> UIImage { 
    // No-op if the orientation is already correct 
    if (image.imageOrientation == UIImageOrientation.up) { return image; } 

    print(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 = CGAffineTransform.identity 

    switch (image.imageOrientation) { 
    case .down, .downMirrored: 
     transform = transform.translatedBy(x: image.size.width, y: image.size.height) 
     transform = transform.rotated(by: CGFloat(M_PI)) 
     break 
    case .left, .leftMirrored: 
     transform = transform.translatedBy(x: image.size.width, y: 0) 
     transform = transform.rotated(by: CGFloat(M_PI_2)) 
     break 
    case .right, .rightMirrored: 
     transform = transform.translatedBy(x: 0, y: image.size.height) 
     transform = transform.rotated(by: CGFloat(-M_PI_2)) 
     break 
    case .up, .upMirrored: 
     break 
    } 

    switch (image.imageOrientation) { 
    case .upMirrored, .downMirrored: 
     transform = transform.translatedBy(x: image.size.width, y: 0) 
     transform = transform.scaledBy(x: -1, y: 1) 
     break 
    case .leftMirrored, .rightMirrored: 
     transform = transform.translatedBy(x: image.size.height, y: 0) 
     transform = transform.scaledBy(x: -1, y: 1) 
     break 
    case .up, .down, .left, .right: 
     break 
    } 

    // Now we draw the underlying CGImage into a new context, applying the transform 
    // calculated above. 

    let ctx = CGContext(data: nil, width: Int(image.size.width), height: Int(image.size.height), bitsPerComponent: image.cgImage!.bitsPerComponent, bytesPerRow: 0, space: image.cgImage!.colorSpace!, bitmapInfo: image.cgImage!.bitmapInfo.rawValue) 

    ctx!.concatenate(transform); 

    switch (image.imageOrientation) { 
    case .left, .leftMirrored, .right, .rightMirrored: 
     // Grr... 
     ctx?.draw(image.cgImage!, in: CGRect(origin: .zero, size: CGSize(width: image.size.height, height: image.size.width))) 

     break 

    default: 
     ctx?.draw(image.cgImage!, in: CGRect(origin: .zero, size: CGSize(width: image.size.width, height: image.size.height))) 
     break 
    } 

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

    return img 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^