TomJ
TomJ

Reputation: 5469

PIL saving only the first image

I'm trying to do some batch image processing, but I'm having trouble saving the images once they are created. Here is all of the code:

import Image
import os
import random

training_images = []
training_path = 'cropped'
background_images = []
background_path = 'background'
training_file = 'train'

def get_image_list(file_path):
    return os.listdir(file_path)

def rotate_randomely(im):
    number = random.randint(1, 6)
    if number == 1:
        return im.transpose(Image.FLIP_LEFT_RIGHT)
    elif number == 2:
        return im.transpose(Image.FLIP_TOP_BOTTOM)
    elif number == 3:
        return im.transpose(Image.ROTATE_90)
    elif number == 4:
        return im.transpose(Image.ROTATE_180)
    elif number == 5:
        return im.transpose(Image.ROTATE_270)
    else:
        return im

def get_random_point(maxX, maxY):
    x = random.randint(0, maxX)
    y = random.randint(0, maxY)
    return x, y 

def insert_image(from_image, onto_image):

    from_image = resize_smaller(from_image, onto_image.size)
    x, y = get_random_point(onto_image.size[0] - from_image.size[0], onto_image.size[1] - from_image.size[0])
    onto_image.paste(from_image, (x, y))
    width = from_image.size[0]
    height = from_image.size[1]
    return x, y, width, height

def resize_smaller(image, maxXY):
    if image.size[0] > maxXY[0] or image.size[1] > maxXY[1]:
        image = image.resize((image.size[0] / 2, image.size[1] / 2))
    if image.size[0] > maxXY[0] or image.size[1] > maxXY[1]:
        resize_smaller(image, maxXY)
    else:
        return image

training_images = get_image_list(training_path)
background_images =  get_image_list(background_path)
print('training_images size', len(training_images))
print('background_images size', len(background_images))

for training_image in training_images:
    index = 0
    for background_image in background_images:
        name = background_image
        training_image = Image.open(training_path + '/' + training_image)
        background_image = Image.open(background_path + '/' + background_image)
        training_image = rotate_randomely(training_image)
        x, y, width, height = insert_image(training_image, background_image)
        background_image.save('images/' + str(index) + name)
        index = index + 1

The output: ('training_images size', 7) ('background_images size', 1). So it's finding the images correctly, but when I look at the results there is only one image saved, and it only has a 0 pre-pended to the image name. Yet I know it went through each image so there should be seven of them.

I've been looking at this for a while, and I just don't see where I went wrong. Is there something weird about pil's save method that I'm not aware of?

Upvotes: 1

Views: 272

Answers (1)

smitec
smitec

Reputation: 3049

put the index = 0 outside the upper for loop otherwise it will become 0 every iteration and save over the top of old files.

Upvotes: 1

Related Questions