[python] 파일이 유효한 이미지 파일인지 확인하는 방법은 무엇입니까?

현재 PIL을 사용하고 있습니다.

from PIL import Image
try:
    im=Image.open(filename)
    # do stuff
except IOError:
    # filename not an image file

그러나 이것은 대부분의 경우를 충분히 포함하지만 xcf, svg 및 psd와 같은 일부 이미지 파일은 감지되지 않습니다. Psd 파일에서 OverflowError 예외가 발생합니다.

어떻게 든 그들을 포함시킬 수 있습니까?



답변

많은 경우 처음 몇 개의 문자는 다양한 파일 형식에 대한 마법의 숫자가 될 것입니다. 위의 예외 검사 외에도 이것을 확인할 수 있습니다.


답변

방금 내장 imghdr 모듈을 찾았습니다 . 파이썬 문서에서 :

imghdr 모듈은 파일 또는 바이트 스트림에 포함 된 이미지 유형을 결정합니다.

작동 방식 :

>>> import imghdr
>>> imghdr.what('/tmp/bass')
'gif'

유사한 기능을 다시 구현하는 것보다 모듈을 사용하는 것이 훨씬 낫습니다.


답변

Brian이 제안한 것 외에도 PIL의 확인 방법을 사용 하여 파일이 손상 되었는지 확인할 수 있습니다 .

im.verify ()

이미지 데이터를 실제로 디코딩하지 않고 파일이 손상되었는지 확인합니다. 이 메서드가 문제를 발견하면 적절한 예외가 발생합니다. 이 방법은 새로 열린 이미지에서만 작동합니다. 이미지가 이미로드 된 경우 결과는 정의되지 않습니다. 또한이 방법을 사용한 후 이미지를로드해야하는 경우 이미지 파일을 다시 열어야합니다. 속성


답변

부가 적으로 PIL이미지하면이 같은 파일 이름 확장명 검사를 추가 할 수 있습니다 확인 :

filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'))

이것은 파일 이름에 유효한 이미지 확장자가 있는지 확인하고 유효한 이미지인지 확인하기 위해 실제로 이미지를 열지 않습니다. 그래서 추가로 사용 PIL하거나 다른 답변에서 제안한 라이브러리 중 하나 를 사용해야 합니다.


답변

최신 정보

또한 GitHub의 Python 스크립트에서 다음 솔루션을 구현했습니다 .

또한 손상된 파일 (jpg)은 종종 ‘깨진’이미지가 아닌지 확인했습니다. 즉, 손상된 사진 파일이 때때로 합법적 인 사진 파일로 남아 있고 원본 이미지가 손실되거나 변경되었지만 오류없이로드 할 수 있다는 것을 확인했습니다. 그러나 파일 잘림으로 인해 항상 오류가 발생합니다.

업데이트 종료

대부분의 이미지 형식과 함께 Python Pillow (PIL) 모듈을 사용하여 파일이 유효하고 손상되지 않은 이미지 파일인지 확인할 수 있습니다.

깨진 이미지도 감지하려는 경우 @Nadia Alramli가 im.verify()방법을 올바르게 제안 하지만 가능한 모든 이미지 결함을im.verify 감지하지는 못합니다. 예를 들어 잘린 이미지는 감지하지 못합니다 (대부분의 시청자는 종종 회색 영역으로로드 됨).

Pillow 는 이러한 유형의 결함도 감지 할 수 있지만 이미지 조작 또는 이미지 디코딩 / 리코딩을 적용하거나 검사를 트리거해야합니다. 마지막으로이 코드를 사용하는 것이 좋습니다.

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

이미지 결함의 경우이 코드는 예외를 발생시킵니다. im.verify가 이미지 조작을 수행하는 것보다 약 100 배 더 빠르다는 것을 고려하십시오 (그리고 플립이 더 저렴한 변환 중 하나라고 생각합니다). 이 코드를 사용하면 표준 Pillow를 사용하는 경우 약 10 MBytes / sec, Pillow-SIMD 모듈 (최신 2.5Ghz x86_64 CPU)을 사용하는 경우 40 MBytes / sec의 이미지 집합을 확인할 수 있습니다.

다른 형식 psd , xcf , ..의 경우 Imagemagick wrapper Wand를 사용할 수 있습니다 . 코드는 다음과 같습니다.

im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()

그러나 내 실험에서 Wand는 잘린 이미지를 감지하지 못하기 때문에 부족한 부분을 프롬프트없이 회색 영역으로로드한다고 생각합니다.

나는 그 빨간 있는 Imagemagick가 외부 명령이 식별수있는 일을,하지만 난 프로그램이 함수를 호출하는 방법을 발견하지 않은 나는이 경로를 테스트하지 않았습니다.

항상 예비 검사를 수행하고 파일 크기 가 0 (또는 매우 작음)이 아닌지 확인 하는 것이 매우 저렴한 아이디어입니다.

statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
  #manage here the 'faulty image' case


답변

Linux 에서는 libmagic을 사용하여 파일 형식을 식별하는 python-magic ( http://pypi.python.org/pypi/python-magic/0.1 )을 사용할 수 있습니다.

AFAIK, libmagic은 파일을 살펴보고 비트 맵 크기, 형식 버전 등과 같은 형식보다 더 많은 정보를 알려줍니다. 따라서 “유효성”에 대한 피상적 인 테스트로 볼 수 있습니다.

“유효”의 다른 정의에 대해서는 자체 테스트를 작성해야 할 수도 있습니다.


답변

Python 바인딩을 libmagic, python-magic 에 사용한 다음 MIME 유형을 확인할 수 있습니다. 파일이 손상되었거나 손상되지 않았는지 알려주지는 않지만 어떤 유형의 이미지인지 확인할 수 있어야합니다.