簡體   English   中英

如何在python中查找索引顏色模式PNG

[英]How to find Indexed Color mode PNGs in python

如何使用 Python 獲取給定文件夾中存在的所有索引顏色模式 PNG 的列表,該文件夾包含許多其他文件(都是圖像,但它們都有不同的顏色模式)?

之前嘗試過的代碼:

from PIL import Image
import os

path = 'logos/'

for x in os.listdir (path):
    if x.endswith(".png"):
        img = Image.open(path + x)
    cmode = str(img)
    P = 'mode=P' in cmode
    if P == True:
        print (x + " " + str(img))

使用這段代碼,我得到了一個圖像列表,其中一些是索引顏色模式,其余是 RGB 顏色模式(通過 Photoshop 檢查它們) https://www.dropbox.com/s/vlvywqhcfrkk8kq/3978.png? dl=0這是通過腳本顯示為 P 的圖像的鏈接,但它是 Photoshop 中的 RGB 圖像。 https://www.dropbox.com/s/x3qiuuhs3gv9bp9/6507.png?dl=0這是一個真正的索引彩色圖像,就像我需要找到的那些。

你可以使用這個:

#!/usr/bin/env python3

from PIL import Image
from glob import glob

# Start with empty list
paletteImages = []

# Iterate over all PNGs
for f in glob("*.png"):
  # Open with PIL
  im = Image.open(f)
  # Append to list if palette image
  if 'P' in im.mode: paletteImages.append(f)

print(paletteImages)

更多關於調色板/索引圖像的討論在這里

請注意,上面的代碼也會找到PaletteAlpha圖像,即那些帶有mode = 'PA'圖像,因此如果您不想要PaletteAlpha圖像,請更改in ==


或者您可以更簡單地在終端中使用ImageMagick來完成:

identify -verbose  *png | egrep "Filename:|Type|png.IHDR.color_type"

Filename: 3978.png
Type: PaletteAlpha
png:IHDR.color_type: 3 (Indexed)
Filename: 6507.png
Type: Palette
png:IHDR.color_type: 3 (Indexed)

請注意,您可以從wand獲得完全相同的結果,它是一個ctypes綁定到ImageMagick


或者你可以使用pngcheck

pngcheck *png   
                           
OK: 3978.png (64x64, 8-bit palette+trns, non-interlaced, 33.1%).
OK: 6507.png (64x64, 8-bit palette, non-interlaced, 56.3%).

您可以使用 Python subprocess.run()調用它。


或者您可以使用exiftool

exiftool *png | egrep "Color Type|File Name"   
File Name                       : 3978.png
Color Type                      : Palette
File Name                       : 6507.png
Color Type                      : Palette

您可以通過 Python 綁定到exiftool獲得相同的結果。 這里的例子。


或者您可以搜索 PLTE,即調色板 PNG 塊:

grep PLTE *png     

Binary file 3978.png matches
Binary file 6507.png matches

或者,您可以使用 Python 對圖像進行 slurp,並在 slurped 文件中搜索字符串以獲得相同的結果:

with open('3978.png', 'rb') as fd:
   data = fd.read()
   if b'PLTE' in data:
      print('PLTE was found')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM