반응형
이미지 파일이 아닌 경우를 걸러내주도록 하겠습니다
def ExtractEXIFParameters(image):
try:
img = Image.open(image)
img.verify()
except(IOError, SyntaxError):
print('This is not image file.')
return [], []
# 이하 내용 동일
예외문(try, except)을 사용해서 이미지 파일이 아니거나 손상된 이미지 파일들은 예외문으로 실행됩니다
여기에는 docx 파일과 같이 이미지 파일이 아닌 파일들의 확장자를 이미지 파일 확장자인 png로 변경한 것도 해당됩니다
하지만 여전히 png 파일만 가능한데 이것을 다른 확장자명으로도 가능하도록 변경해보겠습니다
import chardet # 5.2.0
import piexif # 1.1.3
# 중간 내용 생략
def ExtractEXIFParameters(image):
# 중간 내용 생략
if (img.format == 'PNG'):
metadata = list(img.info.values())[0]
elif (img.format == 'JPEG'):
# check exist exif data
try:
exif_dict = piexif.load(img.info['exif'])
except:
return [], []
user_comment = exif_dict['Exif'].get(piexif.ExifIFD.UserComment)
if user_comment:
# remove encoding header
metadata = user_comment[8:]
# detecting encoding
detected = chardet.detect(metadata)
encoding = detected['encoding'] or 'utf-8'
# decoding exif data
metadata = metadata.decode(encoding, errors = 'ignore')
else:
print('Not support format, support *.png or *.jpg image format.')
return [], []
이미지 포맷으로 png인지 jpg인지 확인하고 각 포맷에 맞는 방식으로 진행하면 됩니다
png는 그대로 출력해도 문제가 없지만 jpg는 인코딩을 별도로 설정해줘야 하는데 자동 인코딩을 설정하도록 chardet를 사용했습니다
여기까지 하게 된다면 전체적인 코드는 아래와 같을겁니다
import re
import chardet
import piexif
from PIL import Image
def ExtractEXIFParameters(image):
try:
img = Image.open(image)
img.verify()
except(IOError, SyntaxError):
print('This is not image file.')
return [], []
if (img.format == 'PNG'):
metadata = list(img.info.values())[0]
elif (img.format == 'JPEG'):
# check exist exif data
try:
exif_dict = piexif.load(img.info['exif'])
except:
return [], []
user_comment = exif_dict['Exif'].get(piexif.ExifIFD.UserComment)
if user_comment:
# remove encoding header
metadata = user_comment[8:]
# detecting encoding
detected = chardet.detect(metadata)
encoding = detected['encoding'] or 'utf-8'
# decoding exif data
metadata = metadata.decode(encoding, errors = 'ignore')
else:
print('Not support format, support *.png or *.jpg image format.')
return [], []
parameters = re.search(r'^(.*?)\nNegative prompt: (.*?)\n(.*)', metadata, re.DOTALL)
if (parameters is not None):
positive_prompt = parameters.group(1).strip()
negative_prompt = parameters.group(2).strip()
other_parameters = parameters.group(3).strip()
positive_prompt = re.sub(r'\n+', ', ', positive_prompt)
negative_prompt = re.sub(r'\n+', ', ', negative_prompt)
key_array = ['Prompt', 'Negative prompt', 'Other parameters']
value_array = [positive_prompt, negative_prompt, other_parameters]
return key_array, value_array
else:
return [], []
image = './image_file.jpg'
keys, values = ExtractEXIFParameters(image)
for key, value in zip(keys, values):
print(key + ': ' + value + '\n')
그러나 여전히 출력된 exif가 보기 좋지 않다는 문제점이 있습니다
이 부분은 다음에 해결해보도록 하겠습니
반응형
'Python > Stable Diffusion EXIF' 카테고리의 다른 글
3. Stable Diffusion으로 생성된 이미지 EXIF 추출하기(3) (0) | 2025.06.08 |
---|---|
1. Stable Diffusion으로 생성된 이미지 EXIF 추출하기(1) (0) | 2025.03.14 |
[Stable Diffusion EXIF] 목차 (0) | 2025.03.13 |