파일이 유효한 이미지 파일인지 확인하는 방법은 무엇입니까?
저는 현재 PIL을 사용하고 있습니다.
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
그러나 이는 대부분의 경우를 충분히 포함하지만 xcf, svg 및 psd와 같은 일부 이미지 파일은 검색되지 않습니다.Psd 파일은 OverflowError 예외를 발생시킵니다.
제가 그것들도 포함시킬 수 있는 방법이 있을까요?
저는 방금 내장된 imhdr 모듈을 찾았습니다.파이썬 문서에서:
imhdr 모듈은 파일 또는 바이트 스트림에 포함된 이미지 유형을 결정합니다.
작동 방식은 다음과 같습니다.
>>> import imghdr
>>> imghdr.what('/tmp/bass')
'gif'
모듈을 사용하는 것이 유사한 기능을 다시 구현하는 것보다 훨씬 좋습니다.
업데이트: imghdr은 python 3.11에서 더 이상 사용되지 않습니다.
Brian이 제안하는 것 외에도 PIL의 확인 방법을 사용하여 파일이 손상되었는지 확인할 수 있습니다.
im.영원히
실제로 이미지 데이터를 디코딩하지 않고 파일이 손상되었는지 확인하려고 시도합니다.이 방법은 문제가 발견되면 적절한 예외를 발생시킵니다.이 방법은 새로 연 이미지에서만 작동하며 이미지가 이미 로드된 경우에는 결과가 정의되지 않습니다.또한 이 방법을 사용한 후 이미지를 로드해야 하는 경우 이미지 파일을 다시 열어야 합니다.특성
추적로으에 PIL
이미지 검사 다음과 같이 파일 이름 확장명 검사를 추가할 수도 있습니다.
filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'))
를 열지 로 파일다름이확있여확는인니합부만지자에유효이 가장미지한▁note▁addition다확니ally합인▁you▁need▁to▁use파여일▁name▁only부▁that▁this▁the있만,▁that▁to▁has는▁image▁file▁if▁it▁open'▁extensions▁checks▁actually▁why▁not▁does▁the,. 실제로는 이미지를 열어 유효한 이미지인지 확인하지 않으므로 추가로 사용해야 합니다.PIL
또는 다른 답변에 제시된 라이브러리 중 하나.
대부분의 경우 처음 두 문자는 다양한 파일 형식에 마법의 숫자가 됩니다.위의 예외 확인 외에도 이를 확인할 수 있습니다.
한 가지 옵션은 다음을 사용하는 것은filetype
꾸러미
설치
python -m pip install filetype
이점
- Fast: 이미지의 처음 몇 바이트만 로드하면 작동합니까(마법 번호 확인).
- 다양한 MIME 유형을 지원합니다.이미지, 비디오, 글꼴, 오디오, 아카이브.
예
file type >= 1.0.
import filetype
filename = "/path/to/file.jpg"
if filetype.is_image(filename):
print(f"{filename} is a valid image...")
elif filetype.is_video(filename):
print(f"{filename} is a valid video...")
파일 형식 < = 1.0.6
import filetype
filename = "/path/to/file.jpg"
if filetype.image(filename):
print(f"{filename} is a valid image...")
elif filetype.video(filename):
print(f"{filename} is a valid video...")
공식 레포에 대한 추가 정보: https://github.com/h2non/filetype.py
갱신하다
저는 또한 여기 GitHub에서 제 파이썬 스크립트에 다음 솔루션을 구현했습니다.
또한 손상된 파일(jpg)이 종종 '파손된' 이미지가 아님을 확인했습니다. 즉, 손상된 사진 파일이 때때로 합법적인 사진 파일로 남아 있거나 원본 이미지가 손실되거나 변경되었지만 여전히 오류 없이 로드할 수 있습니다.그러나 파일 잘라내기는 항상 오류를 일으킵니다.
업데이트 종료
대부분의 이미지 형식에서 Python Pillow(PIL) 모듈을 사용하여 파일이 유효하고 손상되지 않은 이미지 파일인지 확인할 수 있습니다.
는 @ Alramli를 정확하게 제안합니다.im.verify()
방법, 그러나 이것이 가능한 모든 이미지 결함을 감지하는 것은 아닙니다.im.verify
대부분의 뷰어가 회색 영역으로 로드되는 잘린 이미지는 감지하지 않습니다.
Pillow도 이러한 유형의 결점을 감지할 수 있지만, 검사를 트리거하려면 이미지 조작 또는 이미지 디코딩/레코드를 적용해야 합니다.마지막으로 이 코드를 사용할 것을 제안합니다.
from PIL import Image
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(Image.FLIP_LEFT_RIGHT)
im.close()
except:
#manage excetions here
이미지에 결함이 있는 경우 이 코드는 예외를 발생시킵니다.im.verify가 이미지 조작을 수행하는 것보다 약 100배 빠르다는 것을 고려하십시오(그리고 플립은 더 저렴한 변환 중 하나라고 생각합니다).이 코드를 사용하면 표준 Pillow를 사용하면 약 10MB/sec, Pillow-SIMD 모듈(현대의 2.5Ghz x86_64 CPU)을 사용하면 약 40MB/sec의 이미지 세트를 확인할 수 있습니다.
다른 형식 xcf의 경우..Imagemagick 래퍼 Wand를 사용할 수 있으며 코드는 다음과 같습니다.Wand 설명서 확인: 여기, 설치 대상: 여기
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
하지만 제 실험에서 Wand는 잘린 이미지를 감지하지 못했고, 부족한 부분을 회색 영역으로 로드하는 것 같습니다.
Imagemagick에 작업을 수행할 수 있는 외부 명령 ID가 있지만 프로그래밍 방식으로 해당 기능을 호출하는 방법을 찾지 못했으며 이 경로를 테스트하지 않았습니다.
항상 예비 검사를 수행하고 파일 크기가 0이 아니거나 매우 작지 않은지 확인하는 것이 매우 저렴한 방법입니다.
import os
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case
리눅스에서는 libmagic을 사용하여 파일 형식을 식별하는 python-magic을 사용할 수 있습니다.
AFAIK, libmagic은 파일을 들여다보고 비트맵 치수, 포맷 버전 등과 같은 포맷 이상의 것을 알려주려고 합니다.그래서 여러분은 이것을 "유효성"에 대한 피상적인 테스트로 볼 수 있습니다.
"유효"에 대한 다른 정의를 위해서는 자체 테스트를 작성해야 할 수도 있습니다.
Python 바인딩을 사용하여 libmagic, python-magic을 실행한 다음 mime 유형을 확인할 수 있습니다.파일이 손상되었거나 손상되지 않았는지는 알 수 없지만 이미지 유형을 확인할 수 있어야 합니다.
파비아노와 티아고의 대답에서 적응.
from PIL import Image
def check_img(filename):
try:
im = Image.open(filename)
im.verify()
im.close()
im = Image.open(filename)
im.transpose(Image.FLIP_LEFT_RIGHT)
im.close()
return True
except:
print(filename,'corrupted')
return False
if not check_img('/dir/image'):
print('do something')
다음과 같이 이미지 확장을 사용하여 이미지 파일을 확인할 수 있습니다.
import os
for f in os.listdir(folderPath):
if (".jpg" in f) or (".bmp" in f):
filePath = os.path.join(folderPath, f)
format = [".jpg",".png",".jpeg"]
for (path,dirs,files) in os.walk(path):
for file in files:
if file.endswith(tuple(format)):
print(path)
print ("Valid",file)
else:
print(path)
print("InValid",file)
언급URL : https://stackoverflow.com/questions/889333/how-to-check-if-a-file-is-a-valid-image-file
'programing' 카테고리의 다른 글
Python에서 서로 다른 라인 스타일로 주 그리드라인과 부 그리드라인을 만드는 방법 (0) | 2023.07.16 |
---|---|
DistutilsOptionError: home 또는 prefix/exec-prefix 중 하나를 제공해야 합니다. 둘 다 제공하지 않습니다. (0) | 2023.07.16 |
파이썬에서 가장 효율적인 문자열 연결 방법은 무엇입니까? (0) | 2023.07.06 |
MongoDb Atlas 서버에 연결하는 중 오류 발생 (0) | 2023.07.06 |
정적 인라인, 외부 인라인 및 일반 인라인 기능의 차이점은 무엇입니까? (0) | 2023.07.06 |