2016-11-17 1 views
11

Есть несколько вопросов о StackOverflow, которые касаются переворота изображения, такого как этот here. По умолчанию iOS инвертирует горизонтальное изображение передней камеры при съемке. Я стараюсь, чтобы изображение передней камеры не было перевернуто или перевернуло его обратно на правильную ориентацию. Я взаимодействую с WKWebview.IOS Swift 3: Flip Front Camera Image Горизонтально после снятия камеры Изображение

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

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

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

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

ответ

5

Вы правильно рисуете свое изображение, но почему вы назначаете обратно перевернутое изображение на переменную 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

+0

Это проблема. Я использую тег ввода файла html, чтобы сделать снимок с помощью камеры. Я понятия не имею, как отправить это перевернутое изображение обратно для загрузки файлов сразу после съемки фотоаппарата. – applecrusher

+0

@applecrusher Закончив ли вы установить изображение на входной тег? Я думаю, что не обязательно устанавливать изображение на входной тег. Просто намек, что изображение загружается на сервер в WKWebView, достаточно. Например, миниатюра. –

+0

Думаю, я понимаю. Поэтому скажите wkwebview, что передняя камера сделала снимок, возможно, даже сделает это через метаданные. Это может сработать, но я не уверен, как получить, какая камера сделала фотографию с помощью этого метода. – applecrusher

0

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

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 
     } 
    } 

} 

You назовите это так:

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) 
} 

Надеются, что это помогает.

2

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

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

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

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

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

Это может быть хорошим местом для начала

Зачистка EXIF:

https://stackoverflow.com/a/34161629/4102858,

https://stackoverflow.com/a/25595495/4102858

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

https://stackoverflow.com/a/29753437/4102858

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

1

Попробуйте:

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) 
    } 
}