- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 AVFoundation
在 iOS 上拍摄方形照片的应用程序。当我在 photoOutput(_:, didFinishProcessingPhoto:, error:)
中使用以下语句保存图像时,保存在我的相册中的图像方向正确。
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
PHPhotoLibrary.requestAuthorization { status in
guard status == .authorized else { return }
PHPhotoLibrary.shared().performChanges({
let creationRequest = PHAssetCreationRequest.forAsset()
creationRequest.addResource(with: .photo, data: photo.fileDataRepresentation()!, options: nil)
}, completionHandler: nil)
}
}
但是,当我将代码替换为以下代码以保存CGImage
对象时,我发现我相册中保存的图像逆时针旋转了90。
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
let image = photo.cgImageRepresentation()!.takeUnretainedValue()
UIImageWriteToSavedPhotosAlbum(UIImage(cgImage: image), nil, nil, nil)
}
这是我的照片捕获管道配置。
private func initializeCapturePipeline() {
captureSession = AVCaptureSession()
captureSession?.sessionPreset = .photo
captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
videoInput = try! AVCaptureDeviceInput(device: captureDevice!)
imageOutput = AVCapturePhotoOutput()
captureSession?.addInput(videoInput!)
captureSession?.addOutput(imageOutput!)
imageOutput?.connection(with: .video)?.videoOrientation = .portrait
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
previewLayer?.videoGravity = .resizeAspectFill
videoContainerView.layer.addSublayer(previewLayer!)
captureSession?.startRunning()
}
我想知道是什么导致了这个问题?我该如何解决这个问题。
最佳答案
我的理解是,两种情况下的底层图像数据是相同的,显示上的差异是由于 photo.cgImageRepresentation()
中缺少元数据所致。照片应用了解图像元数据,并根据图像元数据中“方向”属性的值自动应用必要的旋转和/或镜像。
使用 PHPhotoLibrary
函数会生成带有嵌入元数据的图像副本。如 CGImagePropertyOrientation 中所述, iOS 以 .right
方向保存对象。但是,直接从 AVCapturePhoto
对象创建的 CGImage
不包含关联的元数据。
有几个潜在的修复(这些尚未经过测试,但应该有助于找到有效的解决方案):
UIImage
。func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
let image = photo.cgImageRepresentation()!.takeUnretainedValue()
let orientation = CGImageProperyOrientation(rawValue: photo.metadata["Orientation"] as! UInt32)
var uiImage: UIImage!
if orientation == .right {
uiImage = UIImage(cgImage: image, scale: 1.0, orientation: .right)
} else {
uiImage = UIImage(cgImage: image)
}
UIImageWriteToSavedPhotosAlbum(uiImage, nil, nil, nil)
}
使用 CGImageDestination
和 Image I/O framework 中的 CGImageDestinationAddImageAndMetadata
函数保存带有元数据的 CGImage
.
根据具体用例,可能需要显式旋转图像数据。可以找到如何执行此操作的示例 here .
关于ios - 调用 `cgImageRepresentation()!.takeUnretainedValue()`后AVCapturePhoto逆时针旋转90,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58224013/
我正在 Eclipse 上学习 clojure(逆时针插件)。 当我在 Eclipse 中单击“运行”时(就像我用 Java 做的那样)我没有 只有控制台打开,但这个“REPL”窗口。为什么有必要 它
是否可以查看您在 Eclipse 中逆时针 REPL 中输入的内容的历史?就像按向上箭头或 ctrl-p 或其他各种在其他 repl 中起作用的东西一样? 谢谢! -菲利普 最佳答案 是的,很抱歉没有
在 Eclipse+Counterclock 中,当我想连接到 REPL 时,对话框告诉我可以通过 HTTP 使用 nREPL: 如何设置? 这是否以某种方式连接到 drawbridge ?尽管 le
我使用的是来自 WWDC 的 Apple CircleLayout 的略微修改版本:https://github.com/mpospese/CircleLayout . 我当前的代码在顶部绘制第一个元
我有一组可能形成凹多边形的无序顶点。现在我想按顺时针或逆时针顺序排列它们。 An answer here建议执行以下步骤: 找到多边形中心 计算角度 按角度排序点 这显然只适用于凸多边形,当点形成凹多
我想知道与 Emacs 相比,Eclipse 的逆时针插件有哪些限制。 Eclipse 不会提供哪些 Lisp(和 Clojure)魔法? - 更新 - 我知道 Emacs 会有更多功能、快捷方式、各
我是一名优秀的程序员,十分优秀!