Как сохранить изображения с одинаковыми именами в разных направлениях, используя PIL и os.path? - PullRequest
0 голосов
/ 01 июня 2019

При попытке разделить путь, чтобы получить имя, я получаю трассировку: TypeError: expected str, bytes or os.PathLike object, not JpegImageFile. Как я могу решить это или есть другие методы?

Я пытаюсь сохранить измененные изображения с тем же именем в другом направлении. По этой причине я использую функции os.path.split ().

import glob
from PIL import Image
import os
images = glob.glob("/Users/marialavrovskaa/Desktop/6_1/*")
path = "/Users/marialavrovskaa/Desktop/2.2/"
quality_val=95
for image in images:
    image = Image.open(image)
    image.thumbnail((640, 428), Image.ANTIALIAS)
    image_path_and_name = os.path.split(image)
    image_name_and_ext = os.path.splitext(image[0])
    name = image_name_and_ext[0] + '.png'
    name = os.path.splitext(image)[0] + '.png'
    file_path = os.path.join(path, name)
    image.save(file_path, quality=quality_val)

Ответы [ 4 ]

2 голосов
/ 01 июня 2019
import glob
from PIL import Image
import os

images = glob.glob("Source_path")
path = r"Destination_path"
quality_val=95

for image in images:
    img = Image.open(image)
    img.thumbnail((640, 428), Image.ANTIALIAS)
    name = os.path.split(image)
    file_path = os.path.join(path, name[1])
    img.save(file_path, quality=quality_val)

Основная проблема с вашим кодом заключалась в том, что вы использовали переменную и объект под тем же именем image.Это вызывало проблемы.

ЛОГИЧЕСКИЕ ОШИБКИ: -

  • image_path_and_name - ненужная переменная в коде, поскольку она используется даром.
  • name был инициализирован с совершенно разными значениями дважды, вместо этого используйте name = os.path.split(image), который служит обоим целям.
  • Вы не должны пытаться явно определить расширение каждого изображения как .pngтак как это может создать проблемы при работе с другими форматами изображений.
0 голосов
/ 01 июня 2019

С помощью приведенного выше кода вы получите изображение в виде миниатюр. Я рекомендую использовать функцию изменения размера, потому что с помощью изменения размера вы можете сохранить соотношение сторон, которое поможет вам получить лучшие результаты.

image.thumbnail((640, 428), Image.ANTIALIAS)

эта строка кода преобразует ваш эскиз. Это не очень хороший подход к изменению размера. Попробуйте код ниже.

import os
from PIL import Image

PATH = "F:\\FYP DATASET\\images\\outliers Dataset\\Not Outliers\\"
Copy_to_path="F:\\FYP DATASET\\images\\outliers Dataset\\"

for filename in os.listdir(PATH):
    img = Image.open(os.path.join(PATH, filename)) # images are color images
    img = img.resize((224,224), Image.ANTIALIAS)
    img.save(Copy_to_path+filename+'.jpeg') 

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

0 голосов
/ 01 июня 2019

во-первых, image_name_and_ext = os.path.splitext(image[0])

должно быть image_name_and_ext = os.path.splitext(image_path_and_name[1])

потому что изображение является строкой, поэтому image[0] просто получите первый символ изображения, в этом случае бесполезный

во-вторых,

name = os.path.splitext(image)[0] + '.png' равно image

name = os.path.splitext(image)[0] должен возвращать путь изображения, не включая расширение

Чтобы решить эту проблему, вы можете попробовать:

for image in images:
    img = Image.open(image)
    img.thumbnail((640, 428), Image.ANTIALIAS)
    name = os.path.split(image)
    file_path = os.path.join(path, name[1])
    image.save(file_path, quality=quality_val)
0 голосов
/ 01 июня 2019
for image in images:
    image = Image.open(image)
    image.thumbnail((640, 428), Image.ANTIALIAS)
    image_path_and_name = os.path.split(image)

Когда вы говорите image = Image.open(image), вы перезаписываете переменную цикла, также называемую image, и она больше не является разделяемой строкой.

Измените одну из image переменных на другое имя.

...