使用Selenium从canvas标签创建PIL Image对象时遇到问题

时间:2016-06-21 16:18:50

标签: python selenium selenium-webdriver python-imaging-library pillow

我正在尝试根据this网站上的Selenium提取的canvas标记创建PIL图像对象。目标是使用pytesseract并获取验证码内容。我的代码没有引发任何错误,但创建的图像全黑。

到目前为止我的代码:

# Run JS code to get data URI
png_url = driver.execute_script(
        'return document.getElementsByTagName("canvas")[0].toDataURL("image/png");')
# Parse the URI to get only the base64 part
str_base64 = re.search(r'base64,(.*)', png_url).group(1)
# Convert it to binary
str_decoded = str_base64.decode('base64')
# Create and show Image object
image = Image.open(StringIO(str_decoded))
image.show()    
# Read image with pytesseract
recaptcha = pytesseract.image_to_string(image)

我不知道为什么图像全黑。我的代码基于this教程,可以保存图像。我不想保存图像,我希望它只在内存中。

编辑:

我已将图像保存在文件系统中,图像保存正常,但背景透明,显示时呈现黑色。如何将背景设为白色?

2 个答案:

答案 0 :(得分:1)

我需要做的就是在this回答后提取背景:

def remove_transparency(im, bg_colour=(255, 255, 255)):

    # Only process if image has transparency (https://stackoverflow.com/a/1963146)
    if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info):

        # Need to convert to RGBA if LA format due to a bug in PIL (https://stackoverflow.com/a/1963146)
        alpha = im.convert('RGBA').split()[-1]

        # Create a new background image of our matt color.
        # Must be RGBA because paste requires both images have the same format
        # (https://stackoverflow.com/a/8720632  and  https://stackoverflow.com/a/9459208)
        bg = Image.new("RGBA", im.size, bg_colour + (255,))
        bg.paste(im, mask=alpha)
        return bg

    else:
        return im

完整的代码:

png_url = driver.execute_script(
            'return document.getElementsByTagName("canvas")[0].toDataURL("image/png");')
str_base64 = re.search(r'base64,(.*)', png_url).group(1)
# Convert it to binary
str_decoded = str_base64.decode('base64')
image = Image.open(StringIO(str_decoded))
image = remove_transparency(image)
recaptcha = pytesseract.image_to_string(image).replace(" ", "")

答案 1 :(得分:0)

您应该创建RGB白色图像并将RGBA图像粘贴到其中。解决方案可能是this,但也有其他方法。我建议numpy和opencv。