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

macOS下pyperclip3与pasteboard是否支持PNG粘贴?

在macOS的Python脚本中获取剪贴板PNG图像的可行方案

结论

完全可行,不用白费功夫。问题出在你使用的第三方库存在实现限制,直接调用macOS原生API即可解决。

问题分析

  • pyperclip:官方明确仅支持文本操作,无需再尝试。
  • pyperclip3:虽声称支持二进制数据,但默认paste()方法仅读取文本格式,未指定PNG类型,导致无法获取剪贴板中的PNG数据。
  • pasteboard库:其PNG常量可能未正确映射到macOS原生的NSPasteboardTypePNG,内部实现存在缺陷,导致返回None。

解决方案:使用PyObjC调用原生NSPasteboard

PyObjC允许Python直接调用macOS的AppKit框架,这是最可靠的原生实现方式。

步骤1:安装依赖

pip install pyobjc

步骤2:实现代码

from AppKit import NSPasteboard, NSPasteboardTypePNG

# 获取系统通用剪贴板实例
pasteboard = NSPasteboard.generalPasteboard()
# 指定获取PNG格式的数据
png_data = pasteboard.dataForType_(NSPasteboardTypePNG)

if png_data:
    # 将NSData对象转换为Python bytes类型
    png_bytes = bytes(png_data)
    # 示例:将数据保存为本地PNG文件
    with open("clipboard_output.png", "wb") as file:
        file.write(png_bytes)
    print(f"成功获取PNG数据,大小:{len(png_bytes)}字节,已保存到clipboard_output.png")
else:
    print("剪贴板中没有PNG格式的数据")

代码说明

  • NSPasteboard.generalPasteboard():获取系统通用剪贴板的实例,是macOS剪贴板操作的入口。
  • dataForType_(NSPasteboardTypePNG):直接使用原生的PNG格式标识,避免第三方库的映射错误,确保能准确读取剪贴板中的PNG数据。
  • 转换后的bytes数据可直接用于保存文件、传输或其他图像处理操作。

替代方案:使用Quartz框架

如果你更倾向于用Core Graphics(Quartz)API,也可以用以下方式实现:

import Quartz

pb = Quartz.NSPasteboard.generalPasteboard()
items = pb.pasteboardItems()
if items:
    for item in items:
        if item.types().__contains__(Quartz.NSPasteboardTypePNG):
            data = item.dataForType_(Quartz.NSPasteboardTypePNG)
            png_bytes = bytes(data)
            with open("clipboard_png.png", "wb") as f:
                f.write(png_bytes)
            print("PNG数据获取成功")
            break
    else:
        print未找到PNG数据")
else:
    print("剪贴板为空")

内容的提问来源于stack exchange,提问作者MikeMayer67

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:35:24