import os import random from PIL import Image import json import csv # Get the current working directory current_directory = os.path.dirname(os.path.abspath(__file__)) # Set the paths based on the current working directory OUT_DIR = os.path.join(current_directory, "out") TRAITS_DIRECTORY = os.path.join(current_directory, "traits") IMG_SIZE = (2048, 2048) # Full path to the 'rarity.json' file rarity_file_path = os.path.join(current_directory, 'rarity.json') # Open the 'rarity.json' file with open(rarity_file_path) as rarity_file: TRAITS = json.load(rarity_file) # Define the TRAIT_NAMES TRAIT_NAMES = [ "Background", "Skin", "Clothes", "Blop", "Eyes", "Mouth", ] trait_counts = {trait_name: {layer: count for layer, count in TRAITS[trait_name].items()} for trait_name in TRAIT_NAMES} def generate_report(): headers = ["NAME"] headers = headers + TRAIT_NAMES files = os.listdir(OUT_DIR) csv_data = [] for file in files: if file.endswith(".json"): name = file.replace(".json", "") file = os.path.join(OUT_DIR, file) file = open(file) data = json.load(file) csv_data_line = [name] for trait_name in TRAIT_NAMES: for trait in data: if trait_name.lower() == trait.get('trait').lower(): csv_data_line.append(trait.get('value')) break csv_data.append(csv_data_line) with open('report.csv', 'w', encoding='UTF8', newline='') as f: writer = csv.writer(f) writer.writerow(headers) writer.writerows(csv_data) def pick_trait(trait_name, counts): trait = TRAITS.get(trait_name) available_layers = [layer for layer in trait.keys() if counts[trait_name][layer] > 0] if not available_layers: return None layer = random.choices(available_layers, weights=[trait[layer] for layer in available_layers])[0] counts[trait_name][layer] -= 1 rarity = trait.get(layer) return { "layer" : layer, "rarity" : rarity, "directory" : trait_name, "attribute" : { "trait" : trait_name.lower(), "value" : layer.replace(".png", "").lower(), "rarity" : rarity } } def generate_avatar2(seq_num): layers = [] rarities = [] directories = [] attributes = [] # Determine the final size for the avatar final_size = IMG_SIZE for trait_name in TRAIT_NAMES: trait = pick_trait(trait_name, trait_counts) layers.append(trait.get('layer')) rarities.append(trait.get('rarity')) directories.append(trait.get('directory')) attributes.append(trait.get('attribute')) image = Image.new("RGBA", final_size) for i in range(len(layers)): img_filename = os.path.join(TRAITS_DIRECTORY, directories[i], layers[i]) layer_image = Image.open(img_filename) # Resize the layer image to the final size layer_image = layer_image.resize(final_size) # Check if the layer image has an alpha channel if layer_image.mode != 'RGBA': layer_image = layer_image.convert('RGBA') image = Image.alpha_composite(image, layer_image) nft_name = f"blops!_{str(seq_num+1).zfill(4)}" out_file = f"{nft_name}.png" attr_file = f"{nft_name}.json" image.save(os.path.join(OUT_DIR, out_file)) with open(os.path.join(OUT_DIR, attr_file), "w") as outfile: json.dump(attributes, outfile, indent=4) print(f"Created {nft_name} with attributes {attributes}") for i in range(1888): generate_avatar2(i) generate_report()