diff --git a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate index 11bf857..1a6ff84 100644 Binary files a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate and b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index e76c3a8..55b0ef9 100644 --- a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/aaa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -403,9 +403,9 @@ filePath = "SwiftProject/Project/Util/ZZHImageExtension.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "72" - endingLineNumber = "72" - landmarkName = "getRotateFrom()" + startingLineNumber = "79" + endingLineNumber = "79" + landmarkName = "getRotateFrom(_:)" landmarkType = "7"> + + @@ -601,5 +616,37 @@ landmarkType = "7"> + + + + + + + + diff --git a/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Contents.json b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Contents.json new file mode 100644 index 0000000..a44b4a6 --- /dev/null +++ b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Tuning@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Tuning@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Tuning@2x.png b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Tuning@2x.png new file mode 100644 index 0000000..b5c375b Binary files /dev/null and b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Tuning@2x.png differ diff --git a/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Tuning@3x.png b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Tuning@3x.png new file mode 100644 index 0000000..3fc9b43 Binary files /dev/null and b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Tuning@3x.png differ diff --git a/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_refresh.imageset/Contents.json b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_refresh.imageset/Contents.json new file mode 100644 index 0000000..b010611 --- /dev/null +++ b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_refresh.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "refresh (1).png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_refresh.imageset/refresh (1).png b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_refresh.imageset/refresh (1).png new file mode 100644 index 0000000..ff404ab Binary files /dev/null and b/SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_refresh.imageset/refresh (1).png differ diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift index dc640a4..cd90f36 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift @@ -42,11 +42,16 @@ class ZZHCustomPlayer: UIView { var temScale:CGFloat = 1.0 var currentScale:CGFloat = 1.0//当前缩放值 var currentED:Int = 5//当前的瞳距 + let userdefaultValueKey_scale = "userdefaultValueKey_scale" + let userdefaultValueKey_ed = "userdefaultValueKey_ed" + //ui var playerLayerBgView:UIView? var avPlayer:AVPlayer? var avPlayerLayer:AVPlayerLayer? var timeSlider:ZZHCustomSlider? + var edBtn:UIButton? //瞳距调节按钮 + var prePlayingState:Bool = true {//标记 在滑块拖动前,player的播放状态,以便在拖动完毕之后回复播放状态 didSet { if(prePlayingState){ @@ -82,6 +87,10 @@ class ZZHCustomPlayer: UIView { deinit { print("zzhcustomplayer deinit......") + UserDefaults.standard.setValue(currentScale, forKey: self.userdefaultValueKey_scale ) + UserDefaults.standard.setValue(currentED, forKey: self.userdefaultValueKey_ed) + UserDefaults.standard.synchronize() + releaseVideoComposition() assetReader?.cancelReading() NotificationCenter.default.removeObserver(self) @@ -94,6 +103,23 @@ class ZZHCustomPlayer: UIView { override init(frame: CGRect) { super.init(frame: frame) + //提前初始化配置参数 + if let defaultScale = UserDefaults.standard.value(forKey: userdefaultValueKey_scale) as? CGFloat { + currentScale = defaultScale + } + else { + UserDefaults.standard.setValue(currentScale, forKey: userdefaultValueKey_scale) + UserDefaults.standard.synchronize() + } + + if let defaultED = UserDefaults.standard.value(forKey: userdefaultValueKey_ed) as? Int { + currentED = defaultED + } + else{ + UserDefaults.standard.setValue(currentED, forKey: userdefaultValueKey_ed) + UserDefaults.standard.synchronize() + } + NotificationCenter.default.addObserver(self, selector: #selector(notification_PlayerEndTime(notification:)), name: AVPlayerItem.didPlayToEndTimeNotification, object: nil) let playerWidth = KScreenWidth @@ -137,10 +163,30 @@ class ZZHCustomPlayer: UIView { self.addSubview(timeSlider!) timeSlider!.snp.makeConstraints { make in make.left.equalToSuperview().offset(24) - make.right.equalToSuperview().offset(-24) +// make.right.equalToSuperview().offset(-24) make.bottom.equalToSuperview().offset(0) make.height.equalTo(120) } + + edBtn = UIButton() + edBtn?.setImage(UIImage(named: "custom_TuningBtn"), for: .normal) + edBtn?.addTarget(self, action: #selector(showEDView(sender:)), for: .touchUpInside) + self.addSubview(edBtn!) + edBtn!.snp.makeConstraints { make in + make.centerY.equalTo(timeSlider!.snp.centerY) + make.width.height.equalTo(40) + make.right.equalToSuperview().offset(-24) + make.left.equalTo(timeSlider!.snp.right).offset(24) + } + } + + //显示调节瞳距、缩放的界面 + @objc func showEDView(sender:UIButton){ + CustomParamBoardView.showBoard(scaleCallback: {[weak self] scale in + self?.currentScale = scale + }, edCallback: {[weak self] ed in + self?.currentED = ed + }, scale: currentScale, ed: currentED) } //通过slider进行seek播放时间点 diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayerForVideoTask.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayerForVideoTask.swift index 1523c45..9727b62 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayerForVideoTask.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayerForVideoTask.swift @@ -56,7 +56,7 @@ extension ZZHCustomPlayer { func convertFrame(request:AVAsynchronousCIImageFilteringRequest){ let compositionTime = request.compositionTime - let end:CMTime = CMTimeMake(value: Int64(compositionTime.value+1), timescale: compositionTime.timescale) +// let end:CMTime = CMTimeMake(value: Int64(compositionTime.value+1), timescale: compositionTime.timescale) // let tr = CMTimeRange(start: compositionTime, end: end) var ciImg:CIImage? = nil @@ -72,7 +72,8 @@ extension ZZHCustomPlayer { } else { ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime) - guard let ciImg else {print("未合成成功.....,此处将进行重新构建assetoutput,然后再次重拾") + guard let ciImg else { + print("未合成成功.....,此处将进行重新构建assetoutput,然后再次重拾") quickLoadAReaderWhenSeek(startCT: compositionTime) ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime) break @@ -97,7 +98,7 @@ extension ZZHCustomPlayer { } var ciImg:CIImage? = nil - var presentTime:CMTime? = nil +// var presentTime:CMTime? = nil switch mode { case .crossedEyes://交叉眼 ciImg = self.videoTranserConvertor.convertVideo(asset: self.videoOriginalAsset, assetOutput: ao, type: self.selectedIndex, time: compositionTime,scale: currentScale,ed:currentED) diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomSlider.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomSlider.swift index a040a85..4a3a7db 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomSlider.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomSlider.swift @@ -13,6 +13,7 @@ class ZZHCustomSlider: UIView { var sLabel:UILabel? var eLabel:UILabel? var timeSlider:CustomSlider? + var processChangeValueCallback:CustomSliderProcessChangeValueCallback? var preValue:Float = 0.0 //更新进度前的value var totalSec:Int = -1//代表视频总时长 @@ -29,7 +30,7 @@ class ZZHCustomSlider: UIView { bgView.snp.makeConstraints { make in make.left.right.equalToSuperview() make.centerY.equalToSuperview() - make.height.equalTo(28) + make.height.equalTo(38) } timeSlider = CustomSlider() @@ -47,7 +48,7 @@ class ZZHCustomSlider: UIView { bgView.addSubview(eLabel!) sLabel?.snp.makeConstraints({ make in make.left.equalTo(timeSlider!.snp.left) - make.top.equalTo(timeSlider!.snp.bottom).offset(10) + make.top.equalTo(timeSlider!.snp.bottom).offset(20) make.bottom.equalToSuperview() }) @@ -192,3 +193,380 @@ class CustomSlider: UISlider { } + + + + + + + + + + + + + + +//底部自定义的参数调节视图 +typealias CCSliderCallback = (_ value:Float,_ isMoving:Bool)->Void +class CCSlider: UIView{ + var preValue:Float = 0.0 //更新进度前的value + var callback:CCSliderCallback? + var slider:CustomSlider? + var sHeight:CGFloat = 0.0 + override init(frame: CGRect) { + super.init(frame: frame) + slider = CustomSlider() + slider?.isUserInteractionEnabled = false + self.addSubview(slider!) + slider!.snp.makeConstraints { make in + make.left.top.right.bottom.equalToSuperview() + } + slider?.setThumbImage(UIImage(named: "slider_thumb"), for: .normal) + slider?.minimumTrackTintColor = .white + slider?.maximumTrackTintColor = UIColor(r: 20, g: 20, b: 20, a: 0.8) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + super.touchesMoved(touches, with: event) + if slider!.isNormal == true { + slider!.isNormal = false + sHeight = self.height + self.updateSliderHeight(height: self.sHeight + 5) + } + let touch = touches.first + if let th = touch { + let touchPoint = th.location(in: self.slider!) + + updateProcessValue(value: Float(touchPoint.x / self.slider!.frame.size.width),isMoving: true) + } + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + super.touchesEnded(touches, with: event) + if slider!.isNormal == false { + slider!.isNormal = true + self.updateSliderHeight(height: self.sHeight) + } + + updateProcessValue(value: preValue,isMoving: false) + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + if slider!.isNormal == false { + slider!.isNormal = true + self.updateSliderHeight(height: self.sHeight) + } + updateProcessValue(value: preValue,isMoving: false) + } + + + func updateSliderHeight(height:CGFloat) { + UIView.animate(withDuration: 0.25) {[weak self] in + self?.snp.updateConstraints {make in + make.height.equalTo(height) + } + self?.superview?.layoutIfNeeded() + } completion: { finish in + + } + } + + func updateProcessValue(value:Float,isMoving:Bool) { + self.slider!.value = value + guard let callback else { + return + } + var currentValue = max(0, min(value, 1)) + + preValue = currentValue + callback(preValue,isMoving) + + } + + +} + + + + + + + + + + + + + + + + + +typealias CustomParamBoardViewScaleCallback = (_ scale:CGFloat)->Void +typealias CustomParamBoardViewEDCallback = (_ ed:Int)->Void +typealias CustomParamBoardViewResetCallback = ()->Void +class CustomParamBoardView: UIView { + + var scaleCallback:CustomParamBoardViewScaleCallback? + var edCallback:CustomParamBoardViewEDCallback? + var resetCallback:CustomParamBoardViewResetCallback? + var scaleSlider:CCSlider? + var scaleTitleLabel:UILabel? + + var edSlider:CCSlider? + var edTitleLabel:UILabel? + + let bgViewHeight = 400 + lazy var bgView:UIView = { + let bg = UIView() + bg.backgroundColor = UIColor(r: 28, g: 28, b: 28, a: 1) + bg.layer.cornerRadius = 12 + bg.layer.masksToBounds = true + + let titleLabel = UILabel() + titleLabel.text = NSLocalizedString("v1.6_参数设置", comment: "") + titleLabel.textColor = .white + titleLabel.font = UIFont.boldSystemFont(ofSize: 16) + bg.addSubview(titleLabel) + + titleLabel.snp.makeConstraints { make in + make.left.equalTo(20) + make.top.equalTo(12) + } + + let resetBtn = UIButton() + bg.addSubview(resetBtn) + resetBtn.addTarget(self, action: #selector(resetParams(sender: )), for: .touchUpInside) + resetBtn.snp.makeConstraints { make in + make.width.height.equalTo(26) + make.centerY.equalTo(titleLabel.snp.centerY) + make.right.equalToSuperview().offset(-20) + } + resetBtn.setImage(UIImage(named: "custom_refresh"), for: .normal) + return bg + }() + + let superBgView = UIView() + + override init(frame: CGRect) { + super.init(frame: frame) + let tgrBgView = UIView() + self.addSubview(tgrBgView) + tgrBgView.snp.makeConstraints { make in + make.left.top.right.bottom.equalToSuperview() + } + self.addSubview(superBgView) + self.superBgView.snp.makeConstraints { make in + make.height.equalTo(170) + make.width.equalTo(330) + make.bottom.equalToSuperview().offset(bgViewHeight) + make.centerX.equalToSuperview() + } + self.superBgView.backgroundColor = .black +// let blackBgView = UIView() +// self.addSubview(blackBgView) + + + self.superBgView.addSubview(bgView) + bgView.snp.makeConstraints { make in + make.left.top.right.bottom.equalToSuperview() + } + + scaleTitleLabel = UILabel() + superBgView.addSubview(scaleTitleLabel!) + scaleTitleLabel?.snp.makeConstraints { make in + make.left.equalToSuperview().offset(20) + make.top.equalToSuperview().offset(50) + } + scaleTitleLabel?.textColor = .white + scaleTitleLabel?.font = UIFont.systemFont(ofSize: 14) + scaleTitleLabel?.text = "缩放:100%" + scaleSlider = CCSlider(frame: .zero) + scaleSlider?.callback = {[weak self] (value,isMoving) in //scale不能小于0.5 + if isMoving { + if(self?.scaleSlider?.tag == 0) { + self?.scaleSlider?.tag = 1 + self?.hiddenOther(slider: self?.edSlider, titleLabel: self?.edTitleLabel) + } + } + else { + self?.scaleSlider?.tag = 0 + self?.showAll() + } + self?.updateScaleTitleWithValue(value:value) + + + } + superBgView.addSubview(scaleSlider!) + scaleSlider!.snp.makeConstraints { make in + make.left.equalTo(scaleTitleLabel!.snp.left) + make.top.equalTo(scaleTitleLabel!.snp.bottom).offset(-1) + make.right.equalToSuperview().offset(-20) + make.height.equalTo(30) + } + + + + edTitleLabel = UILabel() + superBgView.addSubview(edTitleLabel!) + edTitleLabel?.snp.makeConstraints { make in + make.left.equalTo(scaleTitleLabel!.snp.left) + make.top.equalTo(scaleSlider!.snp.bottom).offset(10) + } + edTitleLabel?.textColor = .white + edTitleLabel?.font = UIFont.systemFont(ofSize: 14) + edTitleLabel?.text = "瞳距:10mm" + + edSlider = CCSlider(frame: .zero) + edSlider?.callback = {[weak self] (value,isMoving) in + if isMoving { + if(self?.edSlider?.tag == 0) { + self?.edSlider?.tag = 1 + self?.hiddenOther(slider: self?.scaleSlider, titleLabel: self?.scaleTitleLabel) + } + } + else { + self?.edSlider?.tag = 0 + self?.showAll() + } + + self?.updateEDTitleLabelWith(value:value) + } + superBgView.addSubview(edSlider!) + edSlider!.snp.makeConstraints { make in + make.left.equalTo(edTitleLabel!.snp.left) + make.top.equalTo(edTitleLabel!.snp.bottom).offset(-1) + make.right.equalToSuperview().offset(-20) + make.height.equalTo(30) + } + + + + + + + let tgr = UITapGestureRecognizer(target: self, action: #selector(hidenView(sender: ))) + tgrBgView.addGestureRecognizer(tgr) + } + + //更新缩放的标题文本 + func updateScaleTitleWithValue(value:Float) { + let minValue = 0.6 + let maxValue = 1.5 + let resultValue = minValue + (maxValue - minValue) * Double(value) + let formattedValue = String(format: "\(NSLocalizedString("v1.6_缩放", comment: ""))%.f%%", (resultValue - 0.5) * 200) + self.scaleTitleLabel?.text = formattedValue + if let scaleCallback = self.scaleCallback { + scaleCallback(CGFloat(resultValue)) + } + } + + //提供给它的类方法调用 + func exUpdateScaleTitleWithValue(resultValue:CGFloat) { + let formattedValue = String(format: "\(NSLocalizedString("v1.6_缩放", comment: ""))%.f%%", (resultValue - 0.5) * 200) + self.scaleTitleLabel?.text = formattedValue + let minValue = 0.6 + let maxValue = 1.5 +// let resultValue = minValue + (maxValue - minValue) * Double(value) + let v = (resultValue - minValue) / (maxValue - minValue) + self.scaleSlider?.slider?.value = Float(v) + } + + //更新瞳距的标题文本 + func updateEDTitleLabelWith(value:Float) { + let currED = Int(60 * (value - 0.5)) + if let edCallback = self.edCallback { + edCallback(Int(currED)) + } + let formattedValue = String(format: "\(NSLocalizedString("v1.6_瞳距", comment: ""))%dmm", currED) + self.edTitleLabel?.text = formattedValue + } + + func exUpdateEDTitleLabelWith(currED:Int) { + let formattedValue = String(format: "\(NSLocalizedString("v1.6_瞳距", comment: ""))%dmm", currED) + self.edTitleLabel?.text = formattedValue + let v = Float(currED) * 1.0 / 30.0 + 0.5 + self.edSlider?.slider?.value = v + } + + + + + func hiddenOther(slider:CCSlider?,titleLabel:UILabel?) { + UIView.animate(withDuration: 0.25) {[weak self] in + slider?.alpha = 0 + titleLabel?.alpha = 0 + self?.bgView.alpha = 0 + } completion: { finish in + + } + } + + func showAll() { + UIView.animate(withDuration: 0.25) {[weak self] in + self?.scaleSlider?.alpha = 1 + self?.scaleTitleLabel?.alpha = 1 + self?.edSlider?.alpha = 1 + self?.edTitleLabel?.alpha = 1 + self?.bgView.alpha = 1 + } completion: { finish in + + } + } + + //dismiss + @objc func hidenView(sender:UITapGestureRecognizer) { + UIView.animate(withDuration: 0.25) {[weak self] in + self?.superBgView.snp.updateConstraints({ make in + make.bottom.equalToSuperview().offset(self?.bgViewHeight ?? 400) + }) + self?.layoutIfNeeded() + + } completion: { finish in + self.removeFromSuperview() + } + + } + + class func showBoard(scaleCallback:@escaping CustomParamBoardViewScaleCallback,edCallback:@escaping CustomParamBoardViewEDCallback,scale:CGFloat,ed:Int) { + let view = CustomParamBoardView(frame: .zero) + view.scaleCallback = scaleCallback + view.edCallback = edCallback + view.exUpdateEDTitleLabelWith(currED: ed) + view.exUpdateScaleTitleWithValue(resultValue: scale) + KWindow?.addSubview(view) + view.snp.makeConstraints { make in + make.left.top.right.bottom.equalToSuperview() + } + KWindow?.layoutIfNeeded() + UIView.animate(withDuration: 0.25) { + view.superBgView.snp.updateConstraints { make in + make.bottom.equalToSuperview().offset(-30) + } + view.layoutIfNeeded() + } completion: { finish in + + } + + } + + //重置 + @objc func resetParams(sender:UIButton) { + if let rc = self.resetCallback { + rc() + } + } + + + + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift b/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift index 1de13c2..58b91bc 100644 --- a/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift +++ b/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift @@ -176,8 +176,8 @@ class PlayByTransferConvertor { //将两张图片合成一张图片 func joinImages( leftImage:CIImage, rightImage:CIImage,scale:CGFloat,ed:Int) -> CIImage { -// let scale = 1.0 //缩放参数,此处必须大于0.5 -// let ed = 5 //瞳距参数,暂定 瞳距与像素点的比例为1:2,瞳距的值范围为 -30 ~ +30 之间的整数 +//缩放参数,此处必须大于0.5 +//瞳距参数,暂定 瞳距与像素点的比例为1:2,瞳距的值范围为 -30 ~ +30 之间的整数 let edS = 30 //比列 let left = UIImage(ciImage: leftImage ) @@ -191,7 +191,7 @@ class PlayByTransferConvertor { //获取调整了瞳距的图片 let x_offset = CGFloat(abs(ed) * edS) //关于瞳距的x偏移量 - let imageWidth = left.size.width/2 - x_offset + let imageWidth = left.size.width*0.5 - x_offset let imageHeight = left.size.height let ed_left = getImgWithED(image: n_left, imgWidth: imageWidth) let ed_right = getImgWithED(image: n_right, imgWidth: imageWidth) @@ -205,7 +205,7 @@ class PlayByTransferConvertor { } else if (ed < 0) { ed_left.draw(in: CGRect(x:x_offset, y:0, width:imageWidth, height:imageHeight)) - ed_right.draw(in: CGRect(x:imageWidth, y:0, width:imageWidth, height:imageHeight)) + ed_right.draw(in: CGRect(x:left.size.width*0.5, y:0, width:imageWidth, height:imageHeight)) } else {//瞳距没有改变的情况 ed_left.draw(in: CGRect(x:0, y:0, width:imageWidth, height:imageHeight)) diff --git a/SwiftProject/SwiftProject/Project/Util/ZZHImageExtension.swift b/SwiftProject/SwiftProject/Project/Util/ZZHImageExtension.swift index 16dc374..4565f02 100644 --- a/SwiftProject/SwiftProject/Project/Util/ZZHImageExtension.swift +++ b/SwiftProject/SwiftProject/Project/Util/ZZHImageExtension.swift @@ -7,9 +7,16 @@ import Foundation import UIKit - +import CoreImage extension UIImage { + func imageAtRect(rect: CGRect) -> UIImage? { + // 确保CGRect在图片范围内 + guard let cgImage = self.cgImage else { return nil } + let imageRef = cgImage.cropping(to: rect) + return imageRef == nil ? nil : UIImage(cgImage: imageRef!) + } + // func rotate( radians: CGFloat) -> UIImage? { // // 计算旋转角度对应的弧度 // let radians = radians * CGFloat.pi / 180 diff --git a/SwiftProject/SwiftProject/en.lproj/Localizable.strings b/SwiftProject/SwiftProject/en.lproj/Localizable.strings index c7cad65..90ebc8e 100644 --- a/SwiftProject/SwiftProject/en.lproj/Localizable.strings +++ b/SwiftProject/SwiftProject/en.lproj/Localizable.strings @@ -134,3 +134,8 @@ "v1.5_submit" = "Submit"; "v1.5_menu_lang" = "en"; "v1.5_提交中..." = "submiting..."; + +//V1.6版本 +"v1.6_参数设置" = "参数设置"; +"v1.6_缩放" = "缩放:"; +"v1.6_瞳距" = "瞳距:"; diff --git a/SwiftProject/SwiftProject/zh-Hans.lproj/Localizable.strings b/SwiftProject/SwiftProject/zh-Hans.lproj/Localizable.strings index 05b9f53..c906643 100644 --- a/SwiftProject/SwiftProject/zh-Hans.lproj/Localizable.strings +++ b/SwiftProject/SwiftProject/zh-Hans.lproj/Localizable.strings @@ -134,3 +134,8 @@ "v1.5_submit" = "提交"; "v1.5_menu_lang" = "zh"; "v1.5_提交中..." = "提交中..."; + +//V1.6版本 +"v1.6_参数设置" = "参数设置"; +"v1.6_缩放" = "缩放:"; +"v1.6_瞳距" = "瞳距:";