2009-05-20 5 views
60

현재 PIL을 사용하고 있습니다. 이것은 충분히 대부분을 커버하면서파일이 유효한 이미지 파일인지 확인하는 방법은 무엇입니까?

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

그러나, XCF, SVG 및 PSD와 같은 일부 이미지 파일이 감지되는 것은 아니다. Psd 파일에서 OverflowError 예외가 발생합니다.

어딘가에 포함시킬 수 있습니까?

+19

를 다시 구현하는 것보다 훨씬 낫다. 다른 Python 관련 질문을 찾을 수 없다면 사람들이 게시하려는 Python 특정 솔루션이있을 수 있으므로 공개하십시오. 게시 한 질문에 맞지 않습니다. –

+0

예, 우선 내가 정말로 알지 못했던 파이썬 라이브러리를 기대하고있었습니다 : P 그리고 벤이 지적했듯이, 단지 마법 번호가 전체 이미지의 유효성을 검사하지 않습니다. – Sujoy

+0

@Sujoy, 컴퓨터가 올바른 색상 픽셀과 1과 0의 왜곡 된 세트를 구분할 수 없기 때문에 @Sujoy는 전체 이미지의 유효성을 확인하는 것이 거의 불가능합니다. 제어 (마술 번호)가 정확합니다. – DevinB

답변

8

처음 몇 개의 문자가 여러 파일 형식의 매직 번호가됩니다. 위의 예외 검사 이외에이를 확인할 수 있습니다.

+4

그는 "유효한"이미지를 실제로 테스트하는 경우 충분하지 않습니다. 매직 넘버가 있다고해서 파일이 잘리지 않았다고 보장 할 수는 없습니다. –

+0

우수한 조언, 지금은 그 번호가 무엇인지 알아낼 필요가 있습니다. 고마워요 :) – Sujoy

+0

@ 벤, 나는 그것을 아직 생각하지 못했습니다. 실제로 좋은 점이 있습니까? – Sujoy

1

파일 확장명을 확인하거나 데이터 자체가 이미지 파일임을 나타내려고합니까?

파일 확장명을 확인할 수 있으면 정규식 또는 간단한 비교가 요구 사항을 충족시킬 수 있습니다.

+0

단순히 txt 파일의 이름을 jpg 또는 다른 것으로 바꿀 수 있기 때문에 단순히 확장을 확인하지 않아도됩니다. 만약 솔루션을 찾을 수 없다면 xcf 및 svg에 대한 확장 검사를 사용합니다. – Sujoy

+0

이해하기 쉽기 때문에 사용자의 요구에 더 잘 맞는 솔루션을 개발하기 전에 이해하기를 바랬습니다. 감사! – doomspork

2

글쎄, 나는 psd의 내부에 대해 알지 못한다. 그러나 실제로, svg는 이미지 파일 자체가 아니다. xml을 기반으로하므로 기본적으로 일반 텍스트 파일입니다.

+0

아하, 네 말이 맞아. 그것은 xml입니다. 그러나 일부 이미지 데이터가 포함되어 있습니다. – Sujoy

2

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

AFAIK, libmagic은 파일을 조사하여 비트 맵 차원, 형식 버전 등과 같은 형식보다 더 자세히 알려려고합니다. 따라서 이것을 "유효성"에 대한 피상적 인 테스트로 볼 수 있습니다.

"유효"에 대한 다른 정의는 직접 테스트를 작성해야 할 수도 있습니다.

28

Brian이 제안하는 것 외에 PIL의 verify 메서드를 사용하여 파일이 손상되었는지 확인할 수 있습니다. 파일이 실제로 화상 데이터를 복호화하지 않고, 파손 경우

im.verify()

시도를 결정한다. 이 방법으로 문제가 발견되면 예외가 발생합니다. 이 방법은 새로 열린 이미지 에서만 작동합니다. 이미지에 이 이미로드 된 경우 결과는 입니다. 또한이 방법을 사용하여 이미지 을로드해야하는 경우 이미지 파일을 다시 열어야합니다. 속성

+0

잘 주된 문제는 svg, xcf 및 psd 파일을 Image.open()과 함께 열 수 없으므로 im.verify()로 확인할 기회가 없다는 것입니다. – Sujoy

+11

PIL 문서가 끔찍합니다. 정확히 "적합한 예외"란 무엇입니까? – Timmmm

+0

다음은 [Image.verify()의 베개 문서] 링크입니다 (https://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.verify). 불행히도, 그것은 더 좋지 않습니다. 그리고 그들은 아무것도 추가하지 않고 위 단락을 들었습니다. –

3

libmagic, python-magic에 파이썬 바인딩을 사용하고 MIME 유형을 확인할 수 있습니다. 파일이 손상되었거나 그대로 유지되었지만 이미지의 유형을 판별 할 수 있어야합니다.

134

방금 ​​내장 된 imghdr 모듈을 발견했습니다. 파이썬 문서에서 :

imghdr 모듈은 파일 또는 바이트 스트림에 포함 된 화상의 종류를 결정 .

이 작동하는 방법이다 : 모듈을 사용

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

그것은 다른 언어에서 중복을 닫습니다 특히 일반적인 관행이 아니다 유사한 기능을

+1

예 imghdr은 대부분의 이미지 형식에서 작동하지만 전부는 아닙니다. svg, xcf 및 psd 파일에 대한 원래 문제와 마찬가지로 imghdr에서도 잘 감지되지 않습니다. – Sujoy

+0

예, 바퀴를 다시 만들지 않고 시작해야 할 부분이 있습니다. –

+0

예를 들어 감지되지 않은 이미지 헤더를 거부 할 수 있습니다. 이미지가 imghdr에 의해 감지되지 않으면 아마도 PIL에서 지원되지 않을 것입니다. 또는 imghdr 소스 코드를보고 어떻게 작동하는지 확인할 수 있습니다. –

관련 문제