[英]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.