2

So, I wrote this sript, which takes command line arguments and generates images based on them (there is only one argument now), it works prety good until it gets to the save function, I don't know why but it just takes the last image and saves it 10 times instead of saving every image

Here is the code;

import os, argparse
from PIL import Image as image
from PIL import ImageDraw as image_draw
from PIL import ImageFont as image_font

parser = argparse.ArgumentParser(description='Image generator')

#Argument definition

parser.add_argument('-num', action='store_true', required=False, help='Generates numbers')

numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

args = parser.parse_args()

arg_num = args.num

def img_gen(n, lenght):
    text = n

    fnts = 20

    fnt = image_font.truetype('Roboto.ttf', size=fnts, index=0, encoding='', layout_engine=None)
    gen_i_width = (6 * fnts)
    gen_i_height = (3 * fnts)

    gen_img = image.new('RGBA', (gen_i_width, gen_i_height), color=(0, 0, 0, 255))

    gen_text = image_draw.Draw(gen_img)
    gen_text.text((0,0), text, font=fnt, fill=(255, 255, 255, 255))
    text_size = gen_text.textsize(text, font=fnt, spacing=0, direction=None, features=None)

    text_s_list = list(text_size)
    text_width, text_height = text_s_list

    img_c = gen_img.crop((0, 0, text_width, text_height))

    for file_name in range(1, lenght + 1):
        img_c.save(f"{file_name:04d}.png")

def main():
    if arg_num == True:
        lenght = len(numbers)
        for n in numbers:
            img_gen(n, lenght)

if __name__ == '__main__':
    main()

2 Answers 2

2

Each time you create an image, you save it to multiple files with sequential numbers for names. This overwrites the previous image each time, in all the files.

Remove the loop from your img_gen function. Instead, save to one file with its name generated from n. Then each image will be saved into one file, and the file name will be the image number.

So, change

for file_name in range(1, lenght + 1):
    img_c.save(f"{file_name:04d}.png")

... to ...

fnum = int(n)
img_c.save(f"{fnum:04d}.png")
Sign up to request clarification or add additional context in comments.

2 Comments

I think that I mostly understand what you mean, but I'm new to python so, could you please show me what exactly has to be changed?
Well, that throws this error; ValueError: Unknown format code 'd' for object of type 'str'
0

I do something similar for some work

for i in list:
     #GRAPH
     plt.savefig("path/{0}/{1}.pdf".format(i,i));

This is saving to a folder with the name 'i' and the file name will be 'i.pdf'

When you have the following:

'{0}_{1}'.format('apple','juice')

the output is

'apple_juice'

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.