from PIL import Image import math, random from samila import GenerativeImage, Projection import os from cmap_utils import get_random_cmap from constants import ELEMENTS REQUIREMENTS_TXT = """numpy==1.21.5 Pillow==9.2.0 samila==0.8""" # install these requirements w pip to generate code def f1(x, y): result = random.uniform(-1,1) * x**2 - math.sin(y**2) + abs(y-x) return result def f2(x, y): result = random.uniform(-1,1) * y**3 - math.cos(x**2) + 2*x return result def get_image(seeds, save_to_folder, colors): """ Fully deterministic function for reproducibly generating a single Atomic NFT PNG from a list of random seeds. """ os.system("mkdir -p %s" % (save_to_folder)) open("%s/data" % (save_to_folder), 'w').write("%s\n%s" % (str(seeds), str(colors))) for seed_index in range(len(seeds)): # Generate component images, one for each seed. Save each component locally. seed = seeds[seed_index] g = GenerativeImage(f1, f2) g.generate(seed=seed) print("Using", colors[seed_index]) g.plot(projection=Projection.POLAR, color=colors[seed_index], bgcolor="transparent") g.save_image('%s/seed_%d_%s.png' % (save_to_folder, seed_index, seed), depth=6) # Merge components into a single transparent PNG background = Image.open('%s/seed_0_%s.png' % (save_to_folder, seeds[0])) for seed_index in range(1, len(seeds)): foreground = Image.open("%s/seed_%d_%s.png" % (save_to_folder, seed_index, seeds[seed_index])) background.paste(foreground, (0, 0), foreground) background.save("%s/final_nft.png" % (save_to_folder)) print("Saved complete NFT to %s" % (save_to_folder)) # hardcoded seed = deterministic generation main_random = random.Random(69420) # generate 1k contracts for nft_num in range(0, 200): depth = int(main_random.random() * 8) + 1 print("Depth", depth) seeds = [] chosen_colors = [] for i in range(0, depth): seed = int(10000000000000000000000000000000000000000000000 * main_random.random()) seeds.append(seed) chosen_colors.append(random.Random(seed).choice(ELEMENTS)) main_random = random.Random(seed) get_image(seeds, "nfts/atomic_nfts_%d" % (nft_num), chosen_colors) print("Finished NFT", nft_num)