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

