You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件:

  1. 获取桌面路径:使用FileManager获取用户桌面的URL
  2. 构造目标文件路径:结合指定文件名和桌面路径
  3. 转换并写入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:52:54