반응형

이미지 파일이 아닌 경우를 걸러내주도록 하겠습니다

 

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가 보기 좋지 않다는 문제점이 있습니다

이 부분은 다음에 해결해보도록 하겠습니

반응형

+ Recent posts