From e60458db5fd5cee96ad09ecb10922a18b81d535f Mon Sep 17 00:00:00 2001 From: bluesea <307723040@qq.com> Date: Thu, 7 Mar 2024 14:46:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=EF=BC=9A=201.=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E7=A9=BA=E9=97=B4=E7=85=A7=E7=89=87=E8=BD=AC=E5=87=BA?= =?UTF-8?q?hsbs=E6=A0=BC=E5=BC=8F=E5=B9=B6=E4=BF=9D=E5=AD=98=E8=87=B3?= =?UTF-8?q?=E7=9B=B8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SwiftProject.xcodeproj/project.pbxproj | 4 ++ .../VRPhotoTransformController.swift | 22 ++++++- .../Project/Util/SpatialImageConvertor.swift | 63 +++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 SwiftProject/SwiftProject/Project/Util/SpatialImageConvertor.swift diff --git a/SwiftProject/SwiftProject.xcodeproj/project.pbxproj b/SwiftProject/SwiftProject.xcodeproj/project.pbxproj index 9da5403..9e2cbdc 100644 --- a/SwiftProject/SwiftProject.xcodeproj/project.pbxproj +++ b/SwiftProject/SwiftProject.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 00B946212B67AC9D00DA668F /* CCSpatialPlayController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00B946202B67AC9C00DA668F /* CCSpatialPlayController.swift */; }; 00B946232B67B26D00DA668F /* ddd_video.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 00B946222B67B26D00DA668F /* ddd_video.mp4 */; }; 00B946252B67B7DE00DA668F /* CCSpatialPlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00B946242B67B7DE00DA668F /* CCSpatialPlayView.swift */; }; + 00D33BF42B998BF700604A44 /* SpatialImageConvertor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D33BF32B998BF700604A44 /* SpatialImageConvertor.swift */; }; 04E1D3F12B68EDFE00743F2F /* CCWebController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E1D3F02B68EDFE00743F2F /* CCWebController.swift */; }; 1E02C9322B8990C600DD3143 /* CCDeviceOperationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E02C9312B8990C600DD3143 /* CCDeviceOperationListView.swift */; }; 1E02C9342B89916C00DD3143 /* CCDeviceOperationListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E02C9332B89916C00DD3143 /* CCDeviceOperationListCell.swift */; }; @@ -91,6 +92,7 @@ 00B946202B67AC9C00DA668F /* CCSpatialPlayController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCSpatialPlayController.swift; sourceTree = ""; }; 00B946222B67B26D00DA668F /* ddd_video.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = ddd_video.mp4; sourceTree = ""; }; 00B946242B67B7DE00DA668F /* CCSpatialPlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCSpatialPlayView.swift; sourceTree = ""; }; + 00D33BF32B998BF700604A44 /* SpatialImageConvertor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpatialImageConvertor.swift; sourceTree = ""; }; 04E1D3F02B68EDFE00743F2F /* CCWebController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCWebController.swift; sourceTree = ""; }; 1E02C9312B8990C600DD3143 /* CCDeviceOperationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCDeviceOperationListView.swift; sourceTree = ""; }; 1E02C9332B89916C00DD3143 /* CCDeviceOperationListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCDeviceOperationListCell.swift; sourceTree = ""; }; @@ -220,6 +222,7 @@ isa = PBXGroup; children = ( 1E1EA2952B936C9600A5D5D2 /* VideoConvertor2.swift */, + 00D33BF32B998BF700604A44 /* SpatialImageConvertor.swift */, 1E1EA28F2B933C8200A5D5D2 /* VideoWriter.swift */, 1EE5C5F92B8F97BF00EDFC2F /* SpatialVideoWriter.swift */, ); @@ -611,6 +614,7 @@ 1EFAF0C02B8B7A59002A1773 /* VRPhotoTransformController.swift in Sources */, AF21210B2B4EA7FE00400B7F /* CCRequest.swift in Sources */, AF2120D82B4E9AC500400B7F /* CCAddImageView.swift in Sources */, + 00D33BF42B998BF700604A44 /* SpatialImageConvertor.swift in Sources */, AF2120B32B4E94BE00400B7F /* CCDefine.swift in Sources */, 1EEF683E2B8D079600B953F7 /* CCVRPreviewController.swift in Sources */, 04E1D3F12B68EDFE00743F2F /* CCWebController.swift in Sources */, diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/VRPhotoTransformController.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/VRPhotoTransformController.swift index 6162fe9..79f41c1 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/VRPhotoTransformController.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/VRPhotoTransformController.swift @@ -225,13 +225,33 @@ class VRPhotoTransformController: BaseController { } //空间图片才能进行3D格式的转换,普通图片没有这些参数 - + switch mTabView?.datas.first?.type { + case .hsbs_3D: + let result:UIImage = SpatialImageConvertor.convertToHSBS(imageData: sourceImageData!)! + UIImageWriteToSavedPhotosAlbum(result, self, #selector(completeSaveImg(_:error:contextInfo:)), nil) + case .fsbs_3D: + let result:UIImage = SpatialImageConvertor.convertToHSBS(imageData: sourceImageData!)! + UIImageWriteToSavedPhotosAlbum(result, self, #selector(completeSaveImg(_:error:contextInfo:)), nil) + + default: + print("不执行...") + } }else if(sender.tag == 11){ } } + + @objc func completeSaveImg(_ image: UIImage, error: NSError?, contextInfo: UnsafeRawPointer?) { + if let error = error { + print("保存失败:\(error)") + SVProgressHUD.showError(withStatus: "导入手机相册失败,请查看相册权限") + } else { + SVProgressHUD.showSuccess(withStatus: "转码成功,已导入手机相册") + } + } + //MARK: - action func selectedCellAction(_ model:(type:CCTransformParameterType,title:String,name:String)) { diff --git a/SwiftProject/SwiftProject/Project/Util/SpatialImageConvertor.swift b/SwiftProject/SwiftProject/Project/Util/SpatialImageConvertor.swift new file mode 100644 index 0000000..ed1f348 --- /dev/null +++ b/SwiftProject/SwiftProject/Project/Util/SpatialImageConvertor.swift @@ -0,0 +1,63 @@ +// +// SpatialImageConvertor.swift +// SwiftProject +// +// Created by aaa on 2024/3/7. +// + +import Foundation +import UIKit +class SpatialImageConvertor { + //将空间照片转换为hsbs格式 + public class func convertToHSBS(imageData:Data) -> UIImage? { + let (left_uiimage,right_uiimage) = SpatialImageConvertor.getLeftAndRightImgFrom(imageData: imageData) + let newpb = SpatialImageConvertor.joinImages_sbs( left: left_uiimage!, right:right_uiimage! ,imgWidth: left_uiimage!.size.width,imgHeight:left_uiimage!.size.height) + let lastImg = SpatialImageConvertor.convertCIImageToUIImage(ciImage: newpb)! + return lastImg + } + + class func getLeftAndRightImgFrom(imageData:Data) -> (left_uiimage:UIImage?,right_uiimage:UIImage?){ + guard let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil) else { + return (nil,nil) + } + let frameCount = CGImageSourceGetCount(imageSource) + var frames: [CGImage] = [] + for index in 0.. UIImage? { + let context = CIContext(options: nil) + if let cgImage = context.createCGImage(ciImage, from: ciImage.extent) { + let uiImage = UIImage(cgImage: cgImage) + return uiImage + } + return nil + } + + + //将两张图片合成一张图片 + class func joinImages_sbs( left:UIImage, right:UIImage,imgWidth:CGFloat,imgHeight:CGFloat) -> CIImage { + let newImageSize = CGSize(width:imgWidth, height: imgHeight); + UIGraphicsBeginImageContextWithOptions(newImageSize, false, 1); + left.draw(in: CGRect(x:0, y:0, width:imgWidth/2, height:imgHeight)) + right.draw(in: CGRect(x:imgWidth/2, y:0, width:imgWidth/2, height:imgHeight)) + let image = UIGraphicsGetImageFromCurrentImageContext()! + UIGraphicsEndImageContext(); + + let ci = CIImage(cgImage: image.cgImage!) + return ci + } +}