Ошибка при покрытии изображений TIF в jpg с Python - PullRequest
1 голос
/ 07 апреля 2020

У меня есть папка, содержащая 2000 изображений в формате TIF, и я хочу преобразовать их в изображения JPG. Я написал два кода, и оба работают хорошо, пока они не преобразуют 370 изображений, а затем они вызывают ошибку

Вот мой первый код:

DestPath='/media/jack/Elements/ToJPG95/'
from PIL import Image
import os
def change(path, row):
  filename1=path+row
  filename=row.split('.')[0] + '.jpg'
  im = Image.open(filename1)
  img= im.convert('RGB')
  Dest=os.path.join(DestPath,filename)
  img.save(Dest, format='JPEG',quality=95)


import csv
sourcePath='/media/jack/Elements/TifImages/'
with open("TIFFnames.csv") as f:
    filtered = (line.replace('\n', '') for line in f)
    reader = csv.reader(filtered)
    for row in filtered:
       change(sourcePath , row)

и вот мой второй код, в котором я запускал внутри папки с изображениями:

from PIL import Image  # Python Image Library - Image Processing
import glob
DestPath='/media/jack/Elements/ToJPG95/'
print(glob.glob("*.TIF"))
for file in glob.glob("*.TIF"):
    im = Image.open(file)
    rgb_im = im.convert('RGB')
    rgb_im.save(DestPath+file.replace("TIF", "jpg"), quality=95)
# based on SO Answer: https://stackoverflow.com/a/43258974/5086335

они конвертируют до 370 изображений, а затем выдают ошибку. Вот ошибка, которую я получаю:

Traceback (most recent call last):
  File "conmg.py", line 7, in <module>
    rgb_im = im.convert('RGB')
  File "/home/jack/.local/lib/python3.6/site-packages/PIL/Image.py", line 873, in convert
    self.load()
  File "/home/jack/.local/lib/python3.6/site-packages/PIL/TiffImagePlugin.py", line 1070, in load
    return self._load_libtiff()
  File "/home/jack/.local/lib/python3.6/site-packages/PIL/TiffImagePlugin.py", line 1182, in _load_libtiff
    raise OSError(err)
OSError: -2

Я пробовал упоминание imagemagick в решении Здесь

но это то, что я получаю, когда нажимаю клавишу ВВОД, чтобы выполнить команду:

jack@jack-dell:/media/jack/Elements/TifImages$ for f in *.tif; do  echo "Converting $f"; convert "$f"  "$(basename "$f" .tif).jpg"
> 
> 
> 
> 

Как видите, ничего не происходит. думаю, что коды работают хорошо, но по какой-то причине они не работают после преобразования 370 изображений, которые я запускаю на внешнем жестком диске объемом 6 ТБ. Может кто-нибудь сказать мне, пожалуйста, что не так?

1 Ответ

1 голос
/ 07 апреля 2020

Как говорит @ fmw42, у вас, вероятно, проблема с 370-м файлом (поврежден или имеет какой-либо плохо поддерживаемый вариант TIFF). Ваш код bash преобразует все файлы, которые могут быть прочитаны, он не работает, потому что вы пропускаете закрывающий done:

 for f in *.tif; do  echo "Converting $f"; convert "$f"  "$(basename "$f" .tif).jpg" ; done

Ваш Python также преобразует все читаемые файлы если вы используете try / кроме, чтобы перехватить ошибки и продолжить со следующего файла:

...