IOS Swift 3: изображение передней панели флип Горизонтально после съемки снимка камеры

В StackOverflow есть несколько вопросов, связанных с переводом изображения, например, здесь. По умолчанию iOS инвертирует горизонтальное изображение передней камеры при съемке. Я стараюсь, чтобы изображение передней камеры не было перевернуто или перевернуло его обратно на правильную ориентацию. Я взаимодействую с WKWebview.

Проблема в том, что я не знаю, какой метод позвонить или положить в мой ViewController, чтобы получить камеру, а затем установить ее на правильную ориентацию или правильную настройку, чтобы предотвратить это поведение. Я также не знаю, как получить информацию о камере, которая взяла изображение.

Вот одно из решений, которое я попытался на основе перевода некоторого кода Objective-C, чтобы изменить изображение после того, как камера была сделана с фотографией. Однако переменная изображения является константой и не может быть изменена:

func didTakePicture(_ picture: UIImage) {
    var flippedImage = UIImage(cgImage: picture.cgImage!, scale: picture.scale, orientation: .leftMirrored)
    picture = flippedImage
}

Любая помощь будет принята с благодарностью. Спасибо!

Ответ 1

Вы правильно рисуете свое изображение, но почему вы назначаете обратно перевернутое изображение переменной picture, вы можете использовать переменную flippedImage и передавать ее там, где это необходимо.

func didTakePicture(_ picture: UIImage) {
    var flippedImage = UIImage(CGImage: picture.CGImage!, scale: picture.scale, orientation: .leftMirrored)
    // Here you have got flipped image you can pass it wherever you are using image
}

То, что я пытаюсь сделать, - это предотвратить изображение передней камеры только с переворачивается

Если вы используете камеру по умолчанию, то невозможно предотвратить фотокамеру. Для этого вам нужно создать свою собственную камеру с помощью AVFoundation и вам необходимо применить свои логики.

Если вы готовы использовать любую стороннюю библиотеку, вы можете проверить LEMirroredImagePicker

Ответ 2

Я столкнулся с этой проблемой раньше. Я, честно говоря, не понимаю этого полностью, но это то, что было моей проблемой, и это, вероятно, имеет какое-то отношение к вашей проблеме:

Что происходит, камера iPhone (вероятно, из-за какой-то аппаратной причины) не всегда сохраняет данные изображения в правильной ориентации. В зависимости от модели iPhone и какой камеры она может быть сохранена с ног на голову, сбоку и/или даже перевернута на одну или обе оси. Всякий раз, когда вы делаете снимок на iPhone, иногда "исправлять" это, применяя метаданные преобразования EXIF, чтобы отменить его.

В случае преобразований метаданные EXIF ​​рассказывают, как вращать и переворачивать данные после их открытия. Мое предположение, почему это существует, заключается в том, что дешевле применять метаданные преобразования EXIF ​​к изображению, а не преобразовывать фактические данные изображения в память.

Это иногда проблематично, потому что не все, что отображает изображение в iOS, относится к метаданным преобразования. Это может произойти с WKWebview. Он может отображать изображение без проверки данных EXIF ​​для преобразований.

Я столкнулся с этой проблемой при создании нескольких приложений для обработки изображений в прошлом. В то время как у меня нет каких-либо простых исправлений для вас, вот как я это решил: 1) Сначала разделите все данные преобразования EXIF ​​с вашего UIImage. Это более дорого стоит вычислить, но IMO это стоит того, потому что он значительно упрощает обработку изображений, и вам не нужно беспокоиться о вещах, не обрабатывающих данные EXIF. 2) Затем правильно преобразуйте изображение правильно, если камера iPhone сохранила его в нежелательной ориентации.

Это может быть хорошим местом для запуска

Удаление EXIF:

fooobar.com/questions/504037/...,

fooobar.com/questions/504039/...

Преобразования UIImage:

fooobar.com/questions/219652/...

Это могут быть не идеальные исправления для вас, но, надеюсь, они помогут вам понять вашу проблему немного лучше.

Ответ 3

Попробуйте следующее:

if captureDevice.position == AVCaptureDevicePosition.back {
  if let image = context.createCGImage(ciImage, from: imageRect) {
    return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .right)
  }
}

if captureDevice.position == AVCaptureDevicePosition.front {
  if let image = context.createCGImage(ciImage, from: imageRect) {
    return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .leftMirrored)
  }
}

Ответ 4

Сначала получите модель устройства Расширение для проверки модели устройства для UIDevice ссылка

import UIKit

public extension UIDevice {

    var modelName: String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8 where value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }

        switch identifier {
        case "iPod5,1":                                 return "iPod Touch 5"
        case "iPod7,1":                                 return "iPod Touch 6"
        case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
        case "iPhone4,1":                               return "iPhone 4s"
        case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
        case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
        case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
        case "iPhone7,2":                               return "iPhone 6"
        case "iPhone7,1":                               return "iPhone 6 Plus"
        case "iPhone8,1":                               return "iPhone 6s"
        case "iPhone8,2":                               return "iPhone 6s Plus"
        case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
        case "iPhone9,2", "iPhone9,4":                  return "iPhone 7 Plus"
        case "iPhone8,4":                               return "iPhone SE"
        case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
        case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
        case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
        case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
        case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
        case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
        case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
        case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
        case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
        case "iPad6,3", "iPad6,4", "iPad6,7", "iPad6,8":return "iPad Pro"
        case "AppleTV5,3":                              return "Apple TV"
        case "i386", "x86_64":                          return "Simulator"
        default:                                        return identifier
        }
    }

}

Вы называете это следующим образом:

let modelName = UIDevice.currentDevice().modelName

Логика состоит в проверке на Разрешение изображения. Мы можем получить height и width изображения в пикселях по следующему коду и проверить разрешение камеры FaceTime (Front):

Блок главного кода

//Getting model Name
let modelName = UIDevice.currentDevice().modelName
//Getting the height and the width of the image captured. The apple devices either have a 7 MP,5 MP front camera or a 1.2 MP front camera. 
let heightInPoints = image.size.height
let heightInPixels = heightInPoint * image.scale

let widthInPoints = image.size.width
let widthInPixels = widthInPoints * image.scale

//Checking for 7 megapixel
//3,072 x 2304 or 3180x2375 (Sorry I am not sure about the exact resolution)
if (heightInPixels == 2304 && widthInPixels== 3,072)
{
 var flippedImage = UIImage(cgImage: picture.cgImage!, scale: picture.scale, orientation: .leftMirrored)
}
//Checking for 5 megapixel 
//2592 x 1936 resolution 
if (heightInPixels == 1944 && widthInPixels== 2592)
{
 if (modelName == "iPad Mini 2" || modelName == "iPad Mini 3" || modelName == "iPad Air" || modelName == "iPad 4")
{
print ("iPad models with 5mp back camera")
}
else
{
 var flippedImage = UIImage(cgImage: picture.cgImage!, scale: picture.scale, orientation: .leftMirrored)
}
     }
//Checking for 1.2 MP camera
//1200 x 780 pixels 2MP resolution for iPhone 6/6+/someipad Models they have a 1.2MP camera 

//No apple iDevice has a main camera below this resolution
else if (heightInPixels == 780 && widthInPixel == 1200)
{
 var flippedImage = UIImage(cgImage: picture.cgImage!, scale: picture.scale, orientation: .leftMirrored)
}

Надеюсь, что это поможет.