从相机捕获的iphone图像自动旋转Swift

2024-03-04

通过编程方式,我在应用程序中从相机捕获了图像。它已经很好地获取了,但是当我转移到另一个时,查看并忽略那个视图,当时我的图像我想旋转为风景。我用相机拍摄了图像。当我从照片库获取图像时,没有发现问题。

下图是我的原图。 截屏 https://i.stack.imgur.com/hEYY0.png

我想旋转图像。 截屏 https://i.stack.imgur.com/WpTpp.jpg

代码如下:

var captureSesssion : AVCaptureSession!
var cameraOutput : AVCapturePhotoOutput!
var previewLayer : AVCaptureVideoPreviewLayer!
var device:AVCaptureDevice!
var currentViewControl = UIViewController()
var tempImageHolder = UIImage()

func beginCamera(_ targetView: UIView, _ currentVC: UIViewController) 
{ 
    currentViewControl = currentVC
    // Do any additional setup after loading the view, typically from a nib.
    captureSesssion = AVCaptureSession()
    captureSesssion.sessionPreset = AVCaptureSession.Preset.photo
    cameraOutput = AVCapturePhotoOutput()
    
    if #available(iOS 11.1, *) {
        let availableDevices = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera, .builtInTelephotoCamera, .builtInTrueDepthCamera], mediaType: AVMediaType.video, position: .back).devices
        device = availableDevices.first
    } else {
        // Fallback on earlier versions
        device = AVCaptureDevice.default(for: .video)!
    }
    
    if let input = try? AVCaptureDeviceInput(device: device!) {
        if (captureSesssion.canAddInput(input)) {
            captureSesssion.addInput(input)
            if (captureSesssion.canAddOutput(cameraOutput)) {
                captureSesssion.addOutput(cameraOutput)
                let connection = cameraOutput.connection(with: AVFoundation.AVMediaType.video)
                connection?.videoOrientation = .portrait
                previewLayer = AVCaptureVideoPreviewLayer(session: captureSesssion)
                self.previewLayer.frame = targetView.frame
                self.previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                //setOutputOrientation()
                targetView.layer.addSublayer(previewLayer)
                captureSesssion.startRunning()
            }
        } else {
            print("issue here : captureSesssion.canAddInput")
        }
    } else {
        print("some problem here")
    }
    previewLayer?.frame.size = targetView.frame.size
}

   func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
    if let error = error {
        // we got back an error!
        let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default))
        currentViewControl.present(alert, animated: true)
    } else {
    }}


 func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
    let imageData = photo.fileDataRepresentation()
    let imageSize: Int = imageData!.count
    print(imageSize)
    tempImageHolder = UIImage(data: (imageData! as NSData) as Data)!
    //When use this below line works fine when take images from left landscape, but when take images from right landscape image not show properly screen shot below:
    tempImageHolder = UIImage(cgImage: tempImageHolder.cgImage!, scale: tempImageHolder.scale, orientation: .up)
    }
}

当从左侧横向拍摄图像时:

Input: 截屏 https://i.stack.imgur.com/m2dHV.jpg

Output: 截屏 https://i.stack.imgur.com/ROAaw.png

当从右侧风景拍摄图像时

Input: 截屏 https://i.stack.imgur.com/RNpON.jpg

Output: 截屏 https://i.stack.imgur.com/4DJAK.png

UIImage(cgImage: tempImageHolder.cgImage!, scale: tempImageHolder.scale, orientation: .up)

当使用此行时,从左侧横向拍摄图像时效果很好,但从右侧横向拍摄图像时无法正确显示屏幕截图

有人可以向我解释一下如何旋转图像吗?任何帮助将不胜感激。


这是一个非常烦人的问题,我真的不敢相信 AVFoundation 没有为我们提供任何更容易的东西。但在我的应用程序中,我通过保持当前设备方向来做到这一点。当照片输出带有图像时,使用方向旋转图像以确保所有内容都向上拍摄。

class MyViewController: UIViewController {

    var currentOrientation: UIDeviceOrientation = .portrait

    override func viewDidLoad() {
        NotificationCenter.default.addObserver(self, selector: #selector(orientationChanged), name: UIDevice.orientationDidChangeNotification, object: nil)
    }

    @objc func orientationChanged() {
        currentOrientation = UIDevice.current.orientation
    }

    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        guard let img = photo.cgImageRepresentation()?.takeUnretainedValue() else { return }
        let temp = CIImage(cgImage: img)
        var ciImage = temp;
        switch currentOrientation {
            case .portrait:
                ciImage = temp.oriented(forExifOrientation: 6)
            case .landscapeRight:
                ciImage = temp.oriented(forExifOrientation: 3)
            case .landscapeLeft:
                ciImage = temp.oriented(forExifOrientation: 1)
            default:
                break
        }

        guard let cgImage = CIContext(options: nil).createCGImage(ciImage, from: ciImage.extent) else { return }
        let fixedImage = UIImage(cgImage: cgImage)
    }


}

最后,使用固定图像满足您的需求。请注意,我订阅了通知中心以了解方向的变化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从相机捕获的iphone图像自动旋转Swift 的相关文章

  • 使用 Metal 高效计算 UIImage/CIImage 中有多少透明像素

    我们可以计算有多少个透明像素的最快方法是什么CIImage UIImage 例如 如果我们谈论效率 我的第一个想法是使用Metal Kernel使用任一CIColorKernel左右 但我不明白如何使用它来输出 计数 我还有其他想法 使用某
  • 使用 iPhone 控制蓝牙音频设备

    我正在寻找为 iPhone 编写应用程序 它将能够控制汽车中的收音机和 CD 播放器 收音机和播放器具有可用的蓝牙连接 我开始这个问题是为了获得这个地方所需的所有信息 我有几个问题 但如果您发现任何我没有要求的对我开始开发此应用程序不重要的
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • Lemon 解析器作为 Xcode 构建规则

    当在 Xcode 中使用柠檬解析器集成为 使用脚本的 Yacc 源文件 由柠檬生成的警告不会显示在 Xcode 警告部分中 柠檬警告输出与 Xcode 期望的格式不兼容 Lemon 输出的格式如下 filename y NR message
  • 将 Xcode 4.5 新 XIB 文件恢复到 iOS<6

    我已经安装了Xcode 4 5 with iOS6 SDK以及其他用于测试目的的旧 SDK 从 4 3 到 6 0 很美 但是有一个BIG问题 生成一个新的 XIB 文件以兼容 iOS6 这是一个问题 因为我的应用程序需要运行在旧设备 不只
  • swift 中闭包和函数作为参数的区别

    我有将近 4 年的 Objective C 经验 并且是 swift 的新手 我试图从 Objective C 的角度理解 swift 的概念 所以如果我错了 请指导我 在目标 c 中 我们有块 可以稍后异步执行的代码块 这绝对是完全合理的
  • Cordova - 启动后出现白屏,控制台中没有例外

    我已经离开我的 Cordova 应用程序一段时间了 但昨天刚刚进行了一次新的克隆 发现它出现了 死机白屏 症状 启动画面显示 程序加载 然后我就得到一个空白屏幕 更多细节 CLI 科尔多瓦 6 1 1 安卓 5 1 1 ios 4 1 1
  • Cordova Phonegap“导出失败”错误代码 70 构建 ios 时

    我目前正在使用 Cordova Phonegap 构建 iOS 应用程序 本来工作正常 但现在运行时出现错误cordova build ios在终端中 我收到以下错误 导出失败 错误 命令的错误代码 70 带有参数的 xcodebuild
  • Swift 3 中数组的 indexOf(_:) 方法的替换

    在我的项目 用 Swift 3 编写 中 我想使用从数组中检索元素的索引indexOf 方法 存在于 Swift 2 2 中 但我找不到任何替代方法 Swift 3 中是否有任何好的替代方法或类似的方法 Update 我忘记提及我想在自定义
  • 如何将数据从一个视图传递到下一个视图?

    我正在制作一个下载排队系统来下载视频 处理下载的排队代码位于另一个视图控制器中 现在我的问题是如何将下载的 URL 传递到另一个视图而不推送到另一个视图控制器 如下所示 ViewConntroller View ViewConntrolle
  • 如何将 CIFilter 输出到相机视图?

    我刚刚开始使用 Objective C 我正在尝试创建一个简单的应用程序 它显示带有模糊效果的相机视图 我得到了与 AVFoundation 框架一起使用的相机输出 现在 我正在尝试连接 Core 图像框架 但不知道如何连接 Apple 文
  • ExpandableLabel iOS 中的“少看”

    我正在使用第三方库可扩展标签 https github com apploft ExpandableLabel实施一个see more特征 我正在寻找仅快速的解决方案 其中包含标签中的文本而不是按钮中的文本 因此这可以完美地工作 添加库并更
  • 无法识别的选择器调用静态 iOS 库中的类别方法

    我正在使用一些第三方软件来帮助使用 Xcode 4 3 2 编写 iPad 应用程序 该软件是开源的 通常经过设置 因此其代码将与开发人员为应用程序编写的任何代码一起编译 因为我在很多地方使用该软件 所以我决定将其构建为 iOS 模拟器的静
  • iOS JPEG 图像旋转 90 度

    我正在使用选择器视图从相册中选择图像 我使用上面的代码 void imagePickerController UIImagePickerController picker didFinishPickingMediaWithInfo NSDi
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • 调用了 numberOfRowsInSection 但未调用 cellForRowAtIndexPath

    在我的表视图中节中的行数被调用两次但是cellForRowAtIndexPath不叫 我想在 tableView 中显示 Facebook 好友列表 如果 cellForRowAtIndexPath 调用我的问题就解决了 我在这里的数组中得
  • 在completionHandlers中存储值 - Swift

    我正在创建一个completionHandler它返回一个字典 但是当我在另一个类中调用这个方法时 它的值是零 func fetchLatestPosts completionHandler responseDict NSDictionar
  • ArraySlice 中的 Swift [重复]

    这个问题在这里已经有答案了 在数组上使用 prefix 方法后 我得到了所谓的 arraySlice 我怎样才能将其转换为数组 我试图从 FacebookGraphApi 获取 Ints 然后请求前 3 个 前缀 3 并尝试将它们添加到新数
  • 防止点击 MKAnnotation 时检测到 MKMapView 上的触摸事件

    我有一个 UITapGestureRecognizer 当用户点击地图时 它将在我的 MKMap 上隐藏和显示工具栏 简单 但是 当用户点击 MKMapAnnotation 时 我不希望地图以正常方式响应点击 如上所述 此外 当用户点击地图
  • 未捕获的 Kotlin 异常:kotlin.native.In CorrectDereferenceException:非法尝试访问非共享

    我尝试使用 Kotlin MPP Multiplatform 开发 Android 和 iOS 之间的共享库 但我面临着 iOS 中线程的问题 对于我在 iOS 中的应用程序 我在主线程中建立了对象 但它可能调用其他线程中的函数并抛出此异常

随机推荐

  • 升级到 Angular 13 后的 Mixins / Webpack 问题

    将我的项目升级到 Angular 13 后 我在运行时收到以下错误ng serve 我也包括两者package json and webpack config js以下文件 我已经尝试删除node modules文件夹并运行npm inst
  • 从使用 JavaScript 的网站将数据抓取到 Google 表格

    我正在尝试将数据从以下网站导入到 Google 表格 我想导入当天的所有比赛 https www tournamentsoftware com tournament b731fdcd a0c8 4558 9344 2a14c267ee8b
  • 枚举可以保存大于 INT_MAX 的无符号整数吗?

    enum Some Flag SOME FLAG A 0x00000000u SOME FLAG B 0x00000001u SOME FLAG C 0x00000002u SOME FLAG Z 0x80000000u uint32 t
  • 从 asyncio StreamReader 读取

    我正在尝试扩展使用流式读取器 写入器的 python asyncio HTTP 服务器示例 code https docs python org 3 4 library asyncio stream html tcp echo server
  • 从java中删除文件夹[重复]

    这个问题在这里已经有答案了 在Java中 我想删除包含文件和文件夹的文件夹中存在的所有内容 public void startDeleting String path List
  • VS2012 ProjectTypeGuids 安装 ASP.NET 和 Web Tools 2013.1 后打开时丢失

    我已经在 Visual Studio 2012 中安装了 ASP NET 和 Web Tools 2013 1 我有一个解决方案 其中有一个 ASP NET MVC 4 项目 具有以下项目类型指南
  • Spark:如何通过mapInPandas正确转换数据帧

    我正在尝试通过最新的 Spark 3 0 1 函数转换具有 10k 行的 Spark 数据框地图熊猫 https spark apache org docs latest sql pyspark pandas with arrow html
  • 如何在 Rust 中连接静态字符串

    我正在尝试连接静态字符串和字符串文字来构建另一个静态字符串 以下是我能想到的最好的方法 但它不起作用 const DESCRIPTION static str my program const VERSION static str env
  • 将两个 div 粘贴到另一个 div 上

    这就是我想要实现的目标 我有3个div 我们称它们为左中和右 中心 div 的宽度是动态的 它可以是 100px 200px 等 具体取决于中心 div 所保存的图像 如何做到无论中心 div 大小如何 左侧和右侧 div 都粘在中心 di
  • 使用 Javascript/JQuery/Rails 3 动态添加新行

    我正在构建一个时间表表单 其中包含一个日历 使用户能够选择指定的日期并搜索项目 我有这个功能 我基本上拥有的是这样的 一旦用户搜索他们的项目并按加号按钮 即指定的项目 在本例中是 Asda 用户然后单击加号图标 这将创建一个新行并将其放入
  • Android 上的多选 ListPreference

    关于在 Android 上实现多选 复选框 ListPreference 有什么想法吗 我必须扩展 ListPreference 吗 是否已经记录了任何类来执行此操作 Thanks 多选 ListPreference 现在从 API 级别
  • 在 Rails 中实现“无尽页面”的最佳方法?

    分页太烂了 用户应该能够永远向下滚动 在适当的时候自动拉入新内容 有一个体面的导轨铸造 http railscasts com episodes 114 endless page关于这一点 但 Ryan 承认他的解决方案在 IE 中不起作用
  • 无法访问 xamarin 表单项目中的已处置对象异常

    我正在开发 Xamarin Forms 表单版本 2 3 4 231 项目 该应用程序在 iOS 中运行良好 而在 Android 中则随机崩溃 从崩溃日志来看 这似乎是内部崩溃 但我不知道从哪里开始 我知道应用程序中没有足够的信息 但有人
  • 我可以获取视图中当前控制器的名称吗?

    有没有办法从视图中找出当前控制器是什么 举个例子说明为什么我想知道这一点 如果多个控制器共享相同的布局 我可能在布局 ERB 文件中包含一部分 我想在其中突出显示基于控制器的当前页面的菜单项 也许这是一个糟糕的方法 如果是这样 更优选的方法
  • Cloud Firestore Swift:如何删除文档查询

    我想删除我的用户名集合中包含 UID 字段作为当前用户 ID 的所有文档 到目前为止 这是我的代码 let uid Auth auth currentUser uid db collection Usernames whereField U
  • 如何在 Sphinx 文档中将成员注释为抽象?

    以下两个属性定义在 Sphinx 中显示完全相同autodocHTML 输出 property def concrete self This is the concrete docstring pass abstractproperty d
  • cURL NTLM 代理授权

    我已经使用curl有一段时间了 它工作正常 但是使用用户 域 用户名 来验证curl的代理无法请求授权 授权方式为NTLM 该代码位于批处理文件中 Code curl proxy ntlm proxy user proxy PROXY UR
  • 在定义函数之前调用函数(前向引用扩展了变量的定义)

    考虑这个基本的 Scala 示例代码 object Test def main args Array String inner var x Int 5 def inner println x x 尝试编译它会产生以下错误消息 test sc
  • Access 中的 ConcatRelated(),使用两个键

    我找到了 ConcatRelated 函数 http allenbrowne com func concat html 它似乎做了我想要的事情 但我需要输入两个键而不是一个 我的数据如下所示 Chain Store Warehouse Wa
  • 从相机捕获的iphone图像自动旋转Swift

    通过编程方式 我在应用程序中从相机捕获了图像 它已经很好地获取了 但是当我转移到另一个时 查看并忽略那个视图 当时我的图像我想旋转为风景 我用相机拍摄了图像 当我从照片库获取图像时 没有发现问题 下图是我的原图 截屏 https i sta