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
相关产品推荐
相关产品推荐

