Obecnie używam PIL.
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
Jednakże, chociaż wystarcza to w większości przypadków, niektóre pliki graficzne, takie jak xcf, svg i psd, nie są wykrywane. Pliki psd zgłaszają wyjątek OverflowError.
Czy jest jakiś sposób, że mógłbym je również uwzględnić?
python
image
identification
imghdr
Sujoy
źródło
źródło
Odpowiedzi:
W wielu przypadkach pierwsze kilka znaków będzie magiczną liczbą dla różnych formatów plików. Możesz to sprawdzić oprócz sprawdzania wyjątków powyżej.
źródło
Właśnie znalazłem wbudowany moduł imghdr . Z dokumentacji Pythona:
Tak to działa:
Korzystanie z modułu jest znacznie lepsze niż ponowne wdrażanie podobnej funkcjonalności
źródło
imghdr.what(path)
zwraca,None
jeśli podanypath
nie jest rozpoznany typ pliku obrazu. Lista obecnie rozpoznawanych typów obrazów: RGB , gif , PBM , PGM , ppm , tiff , Rast , XBM , JPEG , BMP , PNG , WebP , EXR .Oprócz tego, co sugeruje Brian, możesz skorzystać z PIL metody weryfikacji aby sprawdzić, czy plik nie jest uszkodzony.
źródło
Oprócz
PIL
sprawdzania obrazu możesz również dodać sprawdzenie rozszerzenia nazwy pliku w następujący sposób:Zwróć uwagę, że sprawdza to tylko, czy nazwa pliku ma prawidłowe rozszerzenie obrazu, w rzeczywistości nie otwiera obrazu, aby sprawdzić, czy jest to prawidłowy obraz, dlatego musisz użyć dodatkowo
PIL
lub jednej z bibliotek sugerowanych w innych odpowiedziach.źródło
from PIL import Image img = Image.open(filename) print(img.format)
a następnie sprawdzić to w ten sposób:img.format.lower() in ['png', 'jpg', 'jpeg', 'tiff', 'bmp', 'gif']
Aktualizacja
Zaimplementowałem również następujące rozwiązanie w moim skrypcie Python tutaj na GitHub .
Sprawdziłem również, że uszkodzone pliki (jpg) często nie są „zepsutymi” obrazami, tj. Uszkodzony plik obrazu czasami pozostaje prawidłowym plikiem obrazu, oryginalny obraz zostaje utracony lub zmieniony, ale nadal można go załadować bez błędów. Ale obcięcie pliku zawsze powoduje błędy.
Zakończ aktualizację
Możesz użyć Python Pillow modułu (PIL) z większością formatów obrazu, aby sprawdzić, czy plik jest prawidłowym i nienaruszonym plikiem obrazu.
W przypadku, gdy celem jest wykrycie również uszkodzonych obrazów, @Nadia Alramli poprawnie sugeruje
im.verify()
metodę, ale to nie wykrywa wszystkich możliwych defektów obrazu , np.im.verify
Nie wykrywa przyciętych obrazów (które większość widzów często ładuje z szarym obszarem).Pillow jest również w stanie wykryć tego typu defekty, ale musisz zastosować manipulację obrazem lub dekodować / przekodować obraz lub uruchomić kontrolę. Na koniec proponuję użyć tego kodu:
W przypadku wad obrazu ten kod zgłosi wyjątek. Proszę wziąć pod uwagę, że im.verify jest około 100 razy szybsze niż wykonanie manipulacji obrazem (i myślę, że flip jest jedną z tańszych transformacji). Za pomocą tego kodu zweryfikujesz zestaw obrazów z prędkością około 10 MB / s ze standardową poduszką lub 40 MB / s z modułem Pillow-SIMD (nowoczesny procesor 2,5 GHz x86_64).
Dla innych formatów PSD , XCF , .. można użyć ImageMagick wrapper Wand , kod jest w następujący sposób:
Ale z moich eksperymentów Wand nie wykrywa obciętych obrazów, myślę, że wczytuje brakujące części jako szare obszary bez monitowania.
Napisałem, że Imagemagick ma zewnętrzne polecenie identyfikujące, które może wykonać zadanie, ale nie znalazłem sposobu na programowe wywołanie tej funkcji i nie testowałem tej trasy.
Proponuję zawsze przeprowadzić wstępną kontrolę, sprawdzić, czy rozmiar pliku nie jest zerowy (lub bardzo mały), to bardzo tani pomysł:
źródło
W Linuksie możesz użyć Python-Magic ( http://pypi.python.org/pypi/python-magic/0.1 ), który używa libmagic do identyfikacji formatów plików.
AFAIK, libmagic zagląda do pliku i próbuje powiedzieć więcej niż tylko o formacie, jak wymiary bitmapy, wersja formatu itp. Więc możesz to potraktować jako powierzchowny test "poprawności".
W przypadku innych definicji „prawidłowych” może być konieczne napisanie własnych testów.
źródło
Możesz użyć powiązań Pythona do libmagic, python-magic, a następnie sprawdzić typy MIME. To nie powie ci, czy pliki są uszkodzone lub nienaruszone, ale powinno być w stanie określić, jaki to typ obrazu.
źródło
Cóż, nie wiem o wnętrzu psd, ale na pewno wiem, że w rzeczywistości svg nie jest plikiem obrazu jako takim - jest oparty na xml, więc zasadniczo jest zwykły plik tekstowy.
źródło
Jedną z opcji jest skorzystanie z
filetype
pakietu.Instalacja
python -m pip install filetype
Zalety
Przykład rozwiązania
Dodatkowe informacje o oficjalnym repozytorium: https://github.com/h2non/filetype.py
źródło
Czy sprawdzenie rozszerzeń plików byłoby dopuszczalne, czy też próbujesz potwierdzić, że same dane reprezentują plik obrazu?
Jeśli możesz sprawdzić rozszerzenie pliku, to wymaganie może spełnić wyrażenie regularne lub proste porównanie.
źródło
źródło