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

Python指定区域截图工具开发报错:无法转换PngImageFile为bytearray

Python截图工具转bytearray报错的解决办法

你遇到的TypeError: cannot convert 'PngImageFile' object to bytearray,是因为pyscreenshot.grab()返回的是PIL库的Image对象,它并非原生字节序列,无法直接用bytearray()转换。

下面提供两种可行的解决方式:

方案1:直接用PIL Image的save方法保存(最简洁)

PIL的Image对象自带save()方法,可直接将截图保存为图片文件,无需手动转换bytearray,修改后的代码如下:

import pyscreenshot

SCREEN_X1 = 10
SCREEN_Y1 = 10
SCREEN_X2 = 255
SCREEN_Y2 = 255
    
filename = 0
# 循环生成递增文件名,避免重复覆盖
while True:
    filename_str = f'{filename}.png'
    image = pyscreenshot.grab(bbox=(SCREEN_X1, SCREEN_Y1, SCREEN_X2, SCREEN_Y2))
    # 直接调用save方法完成保存
    image.save(filename_str)
    filename += 1
    # 可添加退出条件,比如按下q键停止:
    # import keyboard; if keyboard.is_pressed('q'): break

方案2:转为bytearray后再写入文件(适配特殊场景)

如果你的业务场景必须先将图片转为bytearray再写入,可借助io.BytesIO实现,代码如下:

import pyscreenshot
import io

SCREEN_X1 = 10
SCREEN_Y1 = 10
SCREEN_X2 = 255
SCREEN_Y2 = 255
    
filename = 0
filename_str = f'{filename}.png'

image = pyscreenshot.grab(bbox=(SCREEN_X1, SCREEN_Y1, SCREEN_X2, SCREEN_Y2))
# 用BytesIO在内存中生成图片字节流
byte_stream = io.BytesIO()
image.save(byte_stream, format='PNG')
# 提取字节数据并转为bytearray
byte_array = bytearray(byte_stream.getvalue())

with open(filename_str, 'wb') as f:
    f.write(byte_array)

filename += 1

另外注意你原代码的小问题:原代码中FILENAME是在Filename=0时定义的,后续Filename +=1不会更新FILENAME的值,导致每次保存的都是0.png,需要将文件名定义放在自增操作之后或循环内。

内容的提问来源于stack exchange,提问作者TH1211.EXE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:05:26