ios - 如何在 iOS Swift 中录制视频时拍摄照片?
问题描述
在这里,我正在从设备的后置摄像头录制视频。在拍摄视频时如何拍摄照片并保存到 photoLibrary。
这是我使用的代码:
var photoTagImage = Data()
拍摄视频时使用的荧光笔按钮拍照
@IBAction func HightLightButtonClicked(_ sender: UIButton) {
// return
self.selectedtagsArray = NSMutableArray.init()
if self.recordEventInfo.isDayEvent {
let clipSecond: Int64 = 30
let clipName: String = "Hightlight"
let dict: Dictionary <String, Any> = [
"clipcapturesecond": Int64(self.totalRecordedSecond),
"cliptagsecond": clipSecond,
"clipname": clipName,
"teamname": "",
"tagsArray": self.selectedtagsArray,
"clipDate": Date.init()
]
self.videoClipsArray.add(dict)
} else if self.recordEventInfo.isMatchEvent {
picker.sourceType = .camera
picker.delegate = self
self.present(picker, animated: true, completion: nil)
let clipSecond: Int64 = 30
let clipName: String = "Hightlight"
let dict: Dictionary <String, Any> = [
"clipcapturesecond": Int64(self.totalRecordedSecond),
"cliptagsecond": clipSecond,
"clipname": clipName,
"teamname": "",
"tagsArray": self.selectedtagsArray,
"clipDate": Date.init(),
"clipImage": photoTagImage
]
print("phototagimage: \(photoTagImage)")
self.matchEventvideoClipsArray.add(dict)
}
}
拍照后应保存到照片库
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
let docDir = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let imageUniqueName: Int64 = Int64(NSDate().timeIntervalSince1970 * 1000)
let filePath = docDir.appendingPathComponent("\(imageUniqueName).png")
do {
if let pngimage = UIImagePNGRepresentation((info[UIImagePickerControllerOriginalImage] as? UIImage)!) {
photoTagImage = pngimage
print("photoImage::::::\(photoTagImage)")
try pngimage.write(to : filePath , options : .atomic)
/*FETCH DATA:
public static func fetchData(nameImage : String) -> UIImage{
let docDir = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let filePath = docDir.appendingPathComponent(nameImage);
if FileManager.default.fileExists(atPath: filePath.path){
if let containOfFilePath = UIImage(contentsOfFile : filePath.path){
return containOfFilePath;
}
}
return UIImage();
}
*/
}
}
}
目前我可以录制视频但不能拍照。我打印了值 print("phototagimage: (photoTagImage)") 它显示 photoImage 是 0 字节。
解决方案
如果您可以截取视图的屏幕截图以获取图像并对其进行处理,该怎么办。
extension UIView {
func currentViewToImage() -> UIImage {
UIGraphicsBeginImageContext(self.bounds.size)
self.drawHierarchy(in: self.bounds, afterScreenUpdates: true)
var image:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
或者
获取窗口截图:
guard let layer = UIApplication.shared.keyWindow?.layer else { return }
let renderer = UIGraphicsImageRenderer(size: layer.frame.size)
let image = renderer.image(actions: { context in
layer.render(in: context.cgContext)
})
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
推荐阅读
- laravel - 每个客户的 laravel 8 个多子域
- typescript - 如何配置 vite/rollup 以从我的客户端代码中排除 firebase-admin?
- python - 使用 cx_Oracle + Python 从另一个所有者访问表
- mysql - 对于插入期间出错的字段数据,是否存在类似的 mysql 函数,如 coalesce?
- c# - 计算线上的弹跳速度
- python - 使用 Office365-REST-Python-Client 上传后在 SharePoint 中签入文件
- video - Melt:如何将带有黑色边的垂直视频转换为 16:9、背景模糊的视频
- visual-c++ - 无法为 python 安装 web3
- gcc - 我可以将现有的 .so 链接到另一个 .so 以便 ldd 显示它们的关联吗?
- visual-studio - 为什么添加新项目时不显示 Visual Studio 2019 报告?