Atualizar
Também implementei a seguinte solução em meu script Python aqui no GitHub .
Também verifiquei que os arquivos danificados (jpg) freqüentemente não são imagens 'quebradas', ou seja, um arquivo de imagem danificado às vezes permanece um arquivo de imagem legítimo, a imagem original foi perdida ou alterada, mas você ainda consegue carregá-la sem erros. Porém, o truncamento de arquivos sempre causa erros.
Fim da atualização
Você pode usar o módulo Python Pillow (PIL), com a maioria dos formatos de imagem, para verificar se um arquivo é válido e intacto.
Caso pretenda detectar também imagens quebradas, @Nadia Alramli sugere corretamente o im.verify()
método, mas este não detecta todos os possíveis defeitos da imagem , por exemplo, im.verify
não detecta imagens truncadas (que a maioria dos visualizadores costuma carregar com uma área acinzentada).
O Pillow também é capaz de detectar esses tipos de defeitos, mas você deve aplicar a manipulação da imagem ou a decodificação / recodificação da imagem ou para acionar a verificação. Finalmente, sugiro usar este código:
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
Em caso de defeitos na imagem, este código irá gerar uma exceção. Por favor, considere que im.verify é cerca de 100 vezes mais rápido do que realizar a manipulação de imagens (e eu acho que flip é uma das transformações mais baratas). Com este código você vai verificar um conjunto de imagens a cerca de 10 MBytes / seg com Pillow padrão ou 40 MBytes / seg com módulo Pillow-SIMD (moderno CPU 2.5Ghz x86_64).
Para os outros formatos psd , xcf , .. você pode usar Imagemagick wrapper Wand , o código é o seguinte:
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
Mas, a partir de meus experimentos, o Wand não detecta imagens truncadas, acho que carrega partes que faltam como área cinza sem avisar.
Eu vermelho que Imagemagick tem uma identificação de comando externa que poderia fazer o trabalho, mas não encontrei uma maneira de invocar essa função programaticamente e não testei esta rota.
Sugiro sempre fazer uma verificação preliminar, verificar se o tamanho do arquivo não é zero (ou muito pequeno), é uma ideia muito barata :
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case