개발/Python

[파이썬 Pillow] PIL 이미지에서 EXIF 데이터 제거

MinorMan 2022. 12. 9. 17:41
반응형

<질문>

전이 학습에 사용할 데이터 세트의 이미지에서 EXIF 데이터를 제거하려고 합니다. 그러나 작동하지 않는 것 같습니다. 아래는 내 코드입니다.

import os
from PIL import Image
import piexif
import imghdr
from tqdm import tqdm
import warnings

Folder = 'drive/My Drive/PetImages'
labels =['Dog', 'Cat']
for label in labels:
  imageFolder = os.path.join(Folder, label)  
  listImages = os.listdir(imageFolder)
  for img in tqdm(listImages):
      imgPath = os.path.join(imageFolder,img)

      try:
        img = Image.open(imgPath)
        data = list(img.getdata())
        image_without_exif = Image.new(img.mode, img.size)
        image_without_exif.putdata(data)
        image_without_exif.save(img)
        print("done")
      except:
        print("except")

PIL을 사용하여 이미지 저장을 시도했습니다(이전에 질문한 대로:Python: Remove Exif info from images) 그러나 출력은 순전히 "제외"로 구성됩니다.

아래와 같이 piexif 모듈을 사용하여 다시 시도했습니다.

# Same imports as above
Folder = 'drive/My Drive/PetImages'
labels =['Dog', 'Cat']
for label in labels:
  imageFolder = os.path.join(Folder, label)  
  listImages = os.listdir(imageFolder)
  for img in tqdm(listImages):
      imgPath = os.path.join(imageFolder,img)

      try:
          ImageType = img.format
          # warnings.filterwarnings("error")
          if ImageType in ["JPEG", "TIF", "WAV"]:
            exif_data = img._getexif()
            print(exif_data)
            piexif.remove(img)
            print("done")
      except:
        print("except")

위의 코드에서 먼저 이미지 유형을 확인하여 _getexif() 메서드가 실제로 존재하는지 확인한 다음 exif_data 변수에 저장한 후 데이터를 제거합니다. 출력은 "제외"와 간헐적인 exif 데이터(사전 형식) 또는 존재하지 않는 경우 "없음"으로 구성되지만 "완료"라는 단어는 없습니다. 왜 그 부분에 도달하지 않습니까?


<답변1>

Google을 통해 이것에 걸려 넘어지는 사람에게는 PIL을 사용하는 간단한 솔루션이 있습니다.

from PIL import Image

im = Image.open('some-image.jpg')
# this clears all exif data
im.getexif().clear()
im.save('some-image-without-exif.jpg')

나는 그렇게 생각했다getexif()이름에서 알 수 있듯이 읽기 액세스만 허용하지만 그렇지 않은 것으로 밝혀졌습니다.

편집: 내 경우에는 파일을 로드하고 저장하는 것만으로도 효과가 있었습니다.im.getexif().clear(). 하지만 그것이 얼마나 신뢰할 수 있는지는 모르겠습니다. 하지만 이 명령은 확실히 이미지 객체에서 exif 데이터를 제거합니다. 이것은 Python 셸에서 간단하게 테스트할 수 있습니다.

>>> from PIL import Image
>>> im = Image.open('some-image.jpg')
>>> print(im.getexif())
{296: 2, 282: 72.0, 283: 72.0 ..... }
>>> im.getexif().clear()
>>> print(im.getexif())
{}
반응형