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:
try:
im = Image.load(filename)
im.verify() #I perform also verify, don't know if he sees other types o defects
im.close() #reload is necessary in my case
im = Image.load(filename)
im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
im.close()
except:
#manage excetions here
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:
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
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ł:
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case