Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 이미지 파일 형식 판별하기 – imghdr 모듈 활용 가이드

디렉터리 안에 수백 개의 이미지 파일이 있고, 그중에서 JPEG(또는 특정 이미지 형식) 파일만 골라내야 하는 상황을 생각해 봅시다. 이런 작업을 일일이 수작업으로 처리하기에는 비효율적이지만, 파이썬(Python)을 활용하면 프로그래밍 방식으로 손쉽게 해결할 수 있습니다.

파이썬은 이미지 유형을 판별할 수 있는 여러 라이브러리를 제공하는데, 그중 대표적인 것이 imghdr입니다.

imghdr 패키지는 파일 또는 바이트 스트림에 담긴 이미지의 유형을 자동으로 판별해 주는 모듈입니다.

설치 방법

파이썬 3.6 이상을 사용하고 있다면 imghdr 모듈은 표준 라이브러리에 포함되어 있어 별도 설치 없이 바로 사용할 수 있습니다.

만약 설치가 필요하다면 명령 터미널에서 아래 명령어를 실행하세요:

pip install imghdr

설치가 완료된 후에는 파이썬 셸에서 모듈을 임포트하여 정상적으로 설치되었는지 확인할 수 있습니다.

>>> import imghdr
>>>

아무 오류 없이 프롬프트가 돌아오면 imghdr이 정상적으로 설치된 것입니다.

참고: imghdr 모듈은 파이썬 3.11부터 폐기(deprecated) 상태로 지정되었으며, 파이썬 3.13에서는 표준 라이브러리에서 제거되었습니다. 최신 파이썬 환경에서는 Pillow나 python-magic 같은 대체 라이브러리 사용을 권장합니다.

문법(Syntax)

imghdr 패키지는 다음과 같은 함수를 제공합니다:

imghdr.what(filename[, h])

매개변수 설명

  • filename: 해당 이름의 파일에 담긴 이미지 데이터를 검사하고, 이미지 유형을 나타내는 문자열을 반환합니다.

  • h: 선택 사항입니다. h가 주어지면 filename은 무시되고, h에 담긴 바이트 스트림이 검사 대상으로 간주됩니다.

인식 가능한 이미지 형식

imghdr 패키지로 인식할 수 있는 이미지 형식은 아래 표와 같습니다.

반환값이미지 형식
'rgb'SGI ImgLib 파일
'gif'GIF 87a 및 89a 파일
'pbm'Portable Bitmap 파일
'pgm'Portable Graymap 파일
'ppm'Portable Pixmap 파일
'tiff'TIFF 파일
'rast'Sun Raster 파일
'xbm'X Bitmap 파일
'jpeg'JFIF 또는 Exif 형식의 JPEG 데이터
'bmp'BMP 파일
'png'Portable Network Graphics(PNG)

또한 imghdr.tests 리스트에 새로운 검사 함수를 추가하면, 패키지가 인식할 수 있는 파일 형식 목록을 직접 확장할 수도 있습니다.

imghdr.tests

imghdr.tests는 개별 검사를 수행하는 함수들의 리스트를 담고 있습니다. 각 함수는 두 개의 인자, 즉 바이트 스트림과 열린 파일류 객체(file-like object)를 받습니다. 단, what()이 바이트 스트림과 함께 호출될 경우 파일류 객체는 None이 됩니다.

검사 함수는 이미지 유형을 문자열로 반환하며, 검사에 실패하면 None을 반환합니다.

>>> import imghdr
>>> imghdr.what('clock.jpg')
'jpeg'

실전 활용 예제

아래는 imghdr 패키지의 실제 활용 사례로, 특정 이미지 확장자일 때 특정 작업을 수행하는 코드입니다:

def identify_filetype(url, imageName, folderName):
session = _setupSession()
try:
# 타임아웃 값은 상황에 맞게 조정
image = session.get(url, timeout = 5)
with open(os.path.join(folderName, imageName), 'wb') as fout:
fout.write(image.content)
fileExtension = imghdr.what(os.path.join(folderName, imageName))
if fileExtension is None:
os.remove(os.path.join(folderName, imageName))
else:
newName = imageName + '.' + str(fileExtension)
os.rename(os.path.join(folderName, imageName), os.path.join(folderName, newName))
except Exception as e:
print("failed to download one pages with url of " + str(url))

이 코드는 URL에서 이미지를 내려받아 저장한 뒤, imghdr.what()으로 실제 이미지 형식을 확인합니다. 그 결과 유효한 이미지라면 올바른 확장자를 붙여 파일 이름을 변경하고, 이미지로 인식되지 않는 파일은 삭제하는 로직입니다. 이처럼 imghdr을 활용하면 웹에서 내려받은 파일의 실제 형식을 검증하는 작업을 간편하게 자동화할 수 있습니다.