Программа Python, использующая PIL, отказывается запускаться во второй раз - PullRequest
0 голосов
/ 02 ноября 2018

Я написал эту короткую программу для преобразования файлов JPEG в папке в миниатюры.

import os
import glob
from PIL import Image
from PIL import ExifTags

size = (800,800)

for infile in glob.glob("c:/Users/ascklee/Desktop/PIL_test/*.jpg"):
    file, ext = os.path.splitext(infile)
    im = Image.open(infile)

    exif = {
        ExifTags.TAGS[k]: v
        for k, v in im._getexif().items()
        if k in ExifTags.TAGS
    }

    for i in exif:
        print (i, ":", exif[i])

    if exif['Orientation'] == 3:
        image=im.rotate(180, expand=True)
    elif exif['Orientation'] == 6:
        image=im.rotate(270, expand=True)
    elif exif['Orientation'] == 8:
        image=im.rotate(90, expand=True)

    image.thumbnail(size)
    image.save(file + "_TN" + ".jpg", "JPEG")

Это действительно странно, потому что в первый раз программа работает нормально. После первого изображения произойдет сбой, если я запустлю его снова, не удалив предварительно созданные эскизы в первый раз.

Это сообщение об ошибке, которое я получаю:

Traceback (most recent call last):
  File "C:\Users\ascklee\AppData\Local\Programs\Python\Python37-32\Creating 
Thumbnails (orientation - 4).py", line 14, in <module>
    for k, v in im._getexif().items()
AttributeError: 'NoneType' object has no attribute 'items'

Я использую IDLE 3.7.0.

Любая помощь очень ценится. Спасибо.

1 Ответ

0 голосов
/ 02 ноября 2018

одно из изображений возвращает None на вызов im._getexif(), возможно, у него нет никаких тегов exif, вы можете обойти это, изменив код так, чтобы он выглядел следующим образом

import os
import glob
from PIL import Image
from PIL import ExifTags

size = (800,800)

for infile in glob.glob("c:/Users/ascklee/Desktop/PIL_test/*.jpg"):
    file, ext = os.path.splitext(infile)
    im = Image.open(infile)

    try:
        exif = {
            ExifTags.TAGS[k]: v
            for k, v in im._getexif().items()
            if k in ExifTags.TAGS
         }

    except AttributeError:
        print('this image has no exif tags')
        continue

    for i in exif:
        print (i, ":", exif[i])

    if exif['Orientation'] == 3:
        image=im.rotate(180, expand=True)
    elif exif['Orientation'] == 6:
        image=im.rotate(270, expand=True)
    elif exif['Orientation'] == 8:
        image=im.rotate(90, expand=True)

    image.thumbnail(size)
    image.save(file + "_TN" + ".jpg", "JPEG")
...