python PIL - 检查图像是否透明

时间:2017-05-09 07:48:31

标签: python image python-imaging-library transparency

我在另一张图片上粘贴图片,在查看this问题后,我看到为了粘贴透明图片,您需要执行

background = Image.open("test1.png")
foreground = Image.open("test2.png")

background.paste(foreground, (0, 0), foreground)

正常图片,您应该

background = Image.open("test1.png")
foreground = Image.open("test2.png")

background.paste(foreground, (0, 0)) // difference here

我的问题是,如何检查图像是否透明,以便我可以确定如何使用paste方法(使用或不使用最后一个参数)。

3 个答案:

答案 0 :(得分:2)

检查图像的模式以获得Alpha透明层。例如,RGB没有透明度,但RGBA没有透明度。

有关详情,请参阅https://pillow.readthedocs.io/en/latest/handbook/concepts.html

答案 1 :(得分:0)

我提出了以下函数作为解决方案,该函数将PIL Image对象作为参数。如果图像使用索引颜色(例如在GIF中),则它将获取调色板中透明颜色的索引(img.info.get("transparency", -1)),并检查它是否在画布中的任何地方使用(img.getcolors())。如果图像处于RGBA模式,则假定它具有透明度,但是它通过获取每个通道的最小值和最大值(img.getextrema())进行双重检查,并检查alpha通道的最小值是否低于255。 / p>

def has_transparency(img):
    if img.mode == "P":
        transparent = img.info.get("transparency", -1)
        for _, index in img.getcolors():
            if index == transparent:
                return True
    elif img.mode == "RGBA":
        extrema = img.getextrema()
        if extrema[3][0] < 255:
            return True

    return False

答案 2 :(得分:0)

我使用 numpy 检查 alpha 通道:

def im_has_alpha(img_arr):
    '''
    returns True for Image with alpha channel
    '''
    h,w,c = img_arr.shape
    return True if c ==4 else False

使用它,假设 pil_im 是您的枕头图片:

import numpy as np
has_transparency = im_has_alpha(np.array(pil_im))