macOS SwiftUI应用:将剪贴板截图保存为桌面PNG文件
macOS SwiftUI:将NSImage保存为桌面PNG文件
我开发了一款macOS SwiftUI应用,用于监测云服务的可用性。当云服务访问中断时,我会将屏幕截图保存到剪贴板,并向Web服务器的PHP脚本发送POST请求,触发通知邮件发送到我的邮箱。
我使用以下两个函数生成截图并保存到剪贴板:
//MARK: - 生成截图并保存到剪贴板 func erfolgreichEinScreenshotErstellt() -> Bool{ let task = Process() task.launchPath = "/usr/sbin/screencapture" task.arguments = ["-c"] task.launch() task.waitUntilExit() let status = task.terminationStatus return status == 0 } //MARK: - 从剪贴板获取图片 func dasBildAbholenUndZeigen() -> NSImage { let pasteboard = NSPasteboard.general guard pasteboard.canReadItem(withDataConformingToTypes: NSImage.imageTypes) else{ return NSImage() } guard let image = NSImage(pasteboard: pasteboard) else { return NSImage() } let tiffData = image.tiffRepresentation! let pngData = NSBitmapImageRep(data: tiffData)?.representation(using: .png, properties: [:]) return image }
目前上述功能运行正常!
最后一步我需要帮助:如何将获取到的NSImage以指定名称保存为桌面PNG文件,以便后续用于生成PDF等操作。我尝试了以下代码但遇到了瓶颈:
let tiffData = image.tiffRepresentation! let pngData = NSBitmapImageRep(data: tiffData)?.representation(using: .png, properties: [:])
恳请各位提供代码示例或解决方案思路,提前感谢!
解决方案
你可以通过以下步骤实现将NSImage保存为桌面PNG文件:
- 获取桌面路径:使用
FileManager获取用户桌面的URL - 构造目标文件路径:结合指定文件名和桌面路径
- 转换并写入PNG数据:处理可选值避免崩溃,执行文件写入操作
以下是完整的函数示例:
func saveImageToDesktop(_ image: NSImage, withFileName fileName: String) -> Bool { // 确保文件名以.png结尾 let safeFileName = fileName.hasSuffix(".png") ? fileName : "\(fileName).png" // 获取桌面路径 guard let desktopURL = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first else { print("无法获取桌面路径") return false } let fileURL = desktopURL.appendingPathComponent(safeFileName) // 将NSImage转换为PNG数据 guard let tiffData = image.tiffRepresentation, let bitmapRep = NSBitmapImageRep(data: tiffData), let pngData = bitmapRep.representation(using: .png, properties: [:]) else { print("图片转换为PNG数据失败") return false } // 写入文件到桌面 do { try pngData.write(to: fileURL) print("图片已成功保存:\(fileURL.path)") return true } catch { print("保存图片失败:\(error.localizedDescription)") return false } }
使用示例
在你的代码中调用该函数即可完成保存:
let capturedImage = dasBildAbholenUndZeigen() let isSaved = saveImageToDesktop(capturedImage, withFileName: "云服务中断截图") if isSaved { // 后续执行生成PDF等操作 }
注意事项
- 避免强制解包可选值,通过
guard语句处理转换失败的情况 - 确保文件名不包含系统不允许的特殊字符
- 若需要保存到其他目录,只需修改
desktopURL为对应目录的URL即可
内容的提问来源于stack exchange,提问作者Thomas Hülsmann
相关产品推荐
相关产品推荐

