Atualmente, estou usando PIL.
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
No entanto, embora isso cubra suficientemente a maioria dos casos, alguns arquivos de imagem como xcf, svg e psd não estão sendo detectados. Os arquivos Psd lançam uma exceção OverflowError.
Existe alguma maneira de incluí-los também?
python
image
identification
imghdr
Sujoy
fonte
fonte
Respostas:
Muitas vezes, os primeiros caracteres serão um número mágico para vários formatos de arquivo. Você pode verificar isso além da verificação de exceção acima.
fonte
Acabei de encontrar o módulo imghdr integrado . Da documentação do python:
É assim que funciona:
Usar um módulo é muito melhor do que reimplementar uma funcionalidade semelhante
fonte
imghdr.what(path)
retornaNone
se opath
tipo de arquivo de imagem fornecido não for reconhecido. Lista de tipos atualmente reconhecidos imagem: rgb , gif , PBM , PGM , ppm , tiff , rast , XBM , jpeg , bmp , png , WebP , EXR .Além do que Brian está sugerindo, você pode usar o método de verificação do PIL para verificar se o arquivo está corrompido.
fonte
Além da
PIL
verificação de imagem, você também pode adicionar verificação de extensão de nome de arquivo como esta:Observe que isso só verifica se o nome do arquivo tem uma extensão de imagem válida, não abre realmente a imagem para ver se é uma imagem válida, por isso você precisa usar adicionalmente
PIL
ou uma das bibliotecas sugeridas nas outras respostas.fonte
from PIL import Image img = Image.open(filename) print(img.format)
e verificar desta forma:img.format.lower() in ['png', 'jpg', 'jpeg', 'tiff', 'bmp', 'gif']
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:
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:
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 :
fonte
No Linux, você pode usar python-magic ( http://pypi.python.org/pypi/python-magic/0.1 ) que usa libmagic para identificar formatos de arquivo.
AFAIK, libmagic examina o arquivo e tenta lhe dizer mais sobre ele do que apenas o formato, como dimensões do bitmap, versão do formato, etc. Portanto, você pode ver isso como um teste superficial de "validade".
Para outras definições de "válido", você pode ter que escrever seus próprios testes.
fonte
Você pode usar as ligações Python para libmagic, python-magic e então verificar os tipos MIME. Isso não dirá se os arquivos estão corrompidos ou intactos, mas deve ser capaz de determinar que tipo de imagem é.
fonte
Bem, eu não sei sobre o interior do psd, mas eu, claro, sei que, na verdade, o svg não é um arquivo de imagem em si, - é baseado em xml, então é, essencialmente, um arquivo de texto simples.
fonte
Uma opção é usar o
filetype
pacote.Instalação
python -m pip install filetype
Vantagens
Exemplo de solução
Informações adicionais sobre o repo oficial: https://github.com/h2non/filetype.py
fonte
Verificar as extensões de arquivo seria aceitável ou você está tentando confirmar se os próprios dados representam um arquivo de imagem?
Se você puder verificar a extensão do arquivo, uma expressão regular ou uma comparação simples pode satisfazer o requisito.
fonte
fonte