2015-01-29 2 views
2

Я написал этот код, чтобы захватить изображение с использованием библиотеки AVFoundation в Swift:UIImage Ориентация Swift

@IBAction func cameraButtonWasPressed(sender: AnyObject) { 

    if let videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo){ 
     stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection){ 
      (imageSampleBuffer : CMSampleBuffer!, _) in 

      let imageDataJpeg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageSampleBuffer) 

      var pickedImage: UIImage = UIImage(data: imageDataJpeg)! 

      let library = ALAssetsLibrary() 
      library.writeImageToSavedPhotosAlbum(pickedImage.CGImage, 
       metadata:nil, 
       completionBlock:nil) 

     } 


    } 

} 

Он отлично работает, но когда я иду в библиотеку фото изображение показывает повернуты на 90 градусов против часовой стрелки.

Может кто-нибудь дать мне подсказку о том, где копать, чтобы исправить это?

+0

Подсказка: http://stackoverflow.com/questions/6976213/why-does-capturing-images-with-avfoundation-give-me-480x640-images-when-the-pres –

+0

Настройка ориентации видеосвязи и создание новый UIImage, похоже, не работает. Не уверен, что я делаю что-то неправильно. –

ответ

2

Вы должны использовать несколько иной writeImage метод:

(1) получают ориентацию от UIImage imageOrientation имущества (перечисление), и привести его к ALAssetOrientation (перечисление с теми же Int значений как UIImageOrientation)

var orientation : ALAssetOrientation = ALAssetOrientation(rawValue:   
             pickedImage.imageOrientation.rawValue)! 

(2) используют подобный но-метод отличается от ALAssetLibrary

library.writeImageToSavedPhotosAlbum(
       pickedImage.CGImage, 
       orientation: orientation, 
       completionBlock:nil) 

Это работает для меня в Objective-C ... Я быстро перешел к переводу на Swift (как указано выше), но я получаю предупреждения компилятора.

не может ссылаться на 'writeImageToSavedPhotosAlbum' со списком аргументов типа '(CGImage !, ориентация: ALAssetOrientation, completionBlock: NilLiteralConvertible)'

Может быть, вы могли бы попробовать (у меня нет времени на построить полный AVFoundation конвейер в Swift, чтобы проверить это окончательно)

Если вы не можете заставить это работать, другое решение - извлечь метаданные exif из sampleBuffer и передать его методу, с которым вы уже пользуетесь

library.writeImageToSavedPhotosAlbum(pickedImage.CGImage, metadata:nil, completionBlock:nil

+0

Спасибо @foundry за ваш хороший ответ! Вы решили мой вопрос http://stackoverflow.com/questions/28843045/save-image-with-the-correct-orientation-swift-core-image/28845429#28845429 Ответьте там, если хотите, и я проверю его как правильное , – benLIVE

+0

@benLIVE - который работал на вас - с использованием «ориентации» или с извлечением метаданных и с использованием версии «metadata»? – foundry

+0

Использование ориентации. Я использовал метод writeImageToSavedPhotosAlbum с метаданными и изменил ориентацию, точно так же, как ваш пример. Было бы неплохо узнать способ редактирования метаданных, потому что есть не только ориентация, но и GeoLocation и т. Д. @foundry – benLIVE

1

Возможно, этот Swift-код может вам помочь.

//correctlyOrientedImage.swift 

import UIKit 

extension UIImage { 

    public func correctlyOrientedImage() -> UIImage { 
     if self.imageOrientation == UIImageOrientation.Up { 
      return self 
     } 

     UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) 
     self.drawInRect(CGRectMake(0, 0, self.size.width, self.size.height)) 
     var normalizedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     return normalizedImage; 
    } 
} 

Я видел его somewhere in stack overflow и включил в моем проекте.

+0

Я хочу пережить тысячу раз! – pulp

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