img = Image.open(filename)
if img.mode == "RGBA" or "transparency" in img.info:
# image uses transparency
Xem here để biết độ trong suốt hoạt động với GIF (và 8 bit, palettized, PNG).
Lưu ý rằng trường hợp dương tính giả của bạn là có thể: GIF có thể xác định màu là minh bạch nhưng không sử dụng màu đó. Tôi tưởng tượng điều này sẽ là khá hiếm, mặc dù - tại sao ném một màu đi cho minh bạch và không sử dụng nó? (Âm tính giả của bạn là không thể.)
Tuy nhiên, nếu bạn cần biết tính trong suốt có thực sự được sử dụng hay không, bạn có thể tạo hai phiên bản của hình ảnh trong đó màu trong suốt được ánh xạ tới các màu khác nhau.) và sau đó so sánh chúng. Nếu có bất kỳ sự khác biệt nào, hình ảnh sẽ sử dụng độ trong suốt. Cũng giống như vậy:
def uses_transparency(filename):
img = Image.open(filename)
trans = img.info.get("transparency", None)
if trans is not None:
trans *= 3 # convert color number to palette table index
palette = img.getpalette()
imgs = []
for bg in [0, 255]: # map transparent color first to black, then white
palette[trans:trans+3] = [bg] * 3
img.putpalette(palette)
imgs.append(img.convert("L"))
return bool(ImageChops.difference(*imgs).getbbox())
Bạn có thể sử dụng một cách tiếp cận tương tự để xem liệu một PNG 24 bit thực sự sử dụng kênh alpha, bằng cách dán nó lên nền màu trắng và màu đen và so sánh kết quả.
Đối với PNG 8 bit, tôi đặt cược phương thức hiện tại của bạn không hoạt động, nó sẽ trả về chế độ '' P'' mọi lúc. Bạn sẽ cần phải xử lý nó tương tự như một GIF trong trường hợp đó. –