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)
}
Надеюсь, что это поможет.