IOS Swift 3:拍摄相机图片后水平翻转前置摄像头图像
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS Swift 3:拍摄相机图片后水平翻转前置摄像头图像相关的知识,希望对你有一定的参考价值。
StackOverflow上有几个问题涉及图像翻转,例如这个here。默认情况下,ios会在拍摄照片时反转前置摄像头水平图像。我试图防止前置摄像头图像被翻转或将其翻转回正确的方向。我正在与WKWebview
互动。
问题是我不知道在我的ViewController
中调用或放入什么方法来获取相机,然后将其设置为正确的方向或正确的设置以防止此行为。我也不知道如何获取拍摄图像的相机信息。
这是我尝试的一种解决方案,它基于翻译一些Objective-C代码,在相机完成照片后更改图像。但是图片变量是常量,无法更改:
func didTakePicture(_ picture: UIImage) {
var flippedImage = UIImage(cgImage: picture.cgImage!, scale: picture.scale, orientation: .leftMirrored)
picture = flippedImage
}
任何帮助将不胜感激。谢谢!
您正在正确地翻转图像,但为什么要将翻转的图像分配回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创建自己的相机,并需要在那里应用您的逻辑。
如果您准备使用任何第三方库,那么您可以检查qazxsw poi
我之前遇到过这个问题。老实说,我不完全理解它,但这就是我的问题,它可能与你的问题有关:
发生的事情是iPhone相机(可能由于某些硬件原因)并不总是以正确的方向保存图像数据。根据iPhone型号和相机的不同,它们可以上下颠倒,侧面保存,和/或甚至可以在一个或两个轴上翻转。每当你在iPhone上拍照时,它有时会通过应用EXIF转换元数据来反转它来“纠正”这一点。
在转换的情况下,EXIF元数据告诉如何在打开数据后旋转和翻转数据。我猜这存在的原因是因为将EXIF转换元数据应用于图像而不是将实际图像数据转换为内存会更便宜。
这有时会出现问题,因为在iOS中显示图像的所有内容都不会影响转换元数据。这可能发生在WKWebview上。它可能是在不检查EXIF数据进行转换的情况下显示图像。
我在过去构建了几个图像处理应用程序时遇到了这个问题。虽然我没有为您提供任何简单的修复,但我的解决方法如下:1)首先从UIImage中删除所有EXIF转换数据。这在计算上更加昂贵,但IMO值得,因为它使图像更容易处理,您不必担心不处理EXIF数据的事情。 2)如果iPhone相机以不合需要的方向保存图像,则以正确的方式正确转换图像。
这些可能是一个很好的起点
剥离EXIF:
https://stackoverflow.com/a/34161629/4102858
UIImage转换:
https://stackoverflow.com/a/25595495/4102858
这些可能不是您的完美修复,但希望它们能帮助您更好地理解您的问题。
试试这个:
https://stackoverflow.com/a/29753437/4102858
首先获取设备模型扩展,以检查UIDevice 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)
}
}
的设备模型
link
你这样称呼它:
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
,并检查FaceTime(前置)摄像头的分辨率:
主代码块
width
希望这可以帮助。
以上是关于IOS Swift 3:拍摄相机图片后水平翻转前置摄像头图像的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 实现图片(UIImage)的水平翻转(镜像),垂直翻转
如何仅在 Swift 中访问从相机拍摄的图像,就像 iOS 中的画廊一样?