我正在使用Autopy和Pillow在Python中开发一个屏幕抓取器。
是否可以将位图对象转换为Pillow图像对象?
我目前的解决方案是将位图对象保存为图像文件,然后使用该路径创建Pillow图像对象。由于硬盘I / O,这种方法真的慢。
我当前(非常慢)的解决方案:
from PIL import Image
import autopy
bitmap_object = autopy.bitmap.capture_screen()
bitmap_object.save('some/path.png') # VERY SLOW!
img = Image.open('some/path.png')
问题:如果不将位图对象保存到硬盘,是否可以实现上述功能?
答案 0 :(得分:2)
查看源代码后,看起来没有办法直接访问原始位图。但是,您可以获得编码副本。
首先,获取其编码表示。
bitmap_encoded = bitmap_object.to_string()
这被编码为" b",后跟宽度,逗号,高度,逗号和zlib压缩的原始字节的base64编码。解析编码数据:
import base64
import zlib
# b3840,1080,eNrsf...H1ooKAs=
# ^ ^
first_comma = bitmap_encoded.find(',')
second_comma = bitmap_encoded.find(',', first_comma + 1)
# b3840,1080,eNrsf...H1ooKAs=
# ^ ^
width = int(bitmap_encoded[1:first_comma])
# b3840,1080,eNrsf...H1ooKAs=
# ^ ^
height = int(bitmap_encoded[first_comma+1:second_comma])
# b3840,1080,eNrsf...H1ooKAs=
# ^
bitmap_bytes = zlib.decompress(base64.b64decode(bitmap_encoded[second_comma+1:]))
当我在我的机器上测试时,红色和蓝色通道是向后的,所以我假设 autopy 的位图是RGB编码的,而不是BMP文件使用的典型BGR编码。是PIL所期望的。最后,使用PIL加载图像:
img = PIL.Image.frombytes('RGB', (width, height), bitmap_bytes, 'raw', 'BGR', 0, 1)
要正常加载图像而不交换红色和蓝色通道,请执行以下操作:
img = PIL.Image.frombytes('RGB', (width, height), bitmap_bytes)
答案 1 :(得分:0)
看起来现在有一个solution from autopy:
import autopy
import PIL.Image
bmp = autopy.bitmap.capture_screen()
width, height = int(round(bmp.width * bmp.scale)), int(round(bmp.height * bmp.scale))
img = PIL.Image.frombytes('RGB', (width, height), bytes(bmp))