批量生成独一无二的NFT猫猫图,这项目王多鱼会投吗?

一起用代码吸猫!本文正在参与【喵星人征文活动】

批量生成独一无二的NFT猫猫图,这项目王多鱼会投吗?

零、前言

我们本项目是基于Benyamin Ahmed小朋友写的 nft-image-generator。之前在新闻看到这个小朋友暑假期间靠卖NFT鲸鱼“表情包” weird-whales-images一个暑假赚了250万元。另外他还将这个NFT图片生成器开源了,今天我们就基于他的这个开源工具来生成猫猫表情包。

一、设置合成部件的权重

1
2
3
4
5
py复制代码cat = ["01","02","03","04","05","06","07"]
cat_weights = [10, 40, 15, 5, 10, 10, 10]

title = ["01","02","03","04"]
title_weights = [20, 40, 15, 15]

我们这里分别有7张和4张猫咪图片。我们要将这7张猫咪与4张猫咪排列组合,生成独一无二的图片。

P.S. 这里权重之和要是100.

二、每一张图片对应的文件名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
py复制代码cat_files = {
   "01": "cat1",
   "02": "cat2",
   "03": "cat3",
   "04": "cat4",
   "05": "cat5",
   "06": "cat6",
   "07": "cat7"
}

title_files = {
   "01": "title01",
   "02": "title02",
   "03": "title03",
   "04": "title04"
}

我们是将文件夹中的文件名放入字典中。

image-20211105212957978

image-20211105213009005

三、随即生成基于权重的图片组合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
py复制代码TOTAL_IMAGES = 10 # Number of random unique images we want to generate

all_images = []

# A recursive function to generate unique image combinations
def create_new_image():
   
   new_image = {} #

   # For each trait category, select a random trait based on the weightings

   new_image ["Cat"] = random.choices(cat, cat_weights)[0]
   new_image ["Title"] = random.choices(title, title_weights)[0]
   
   if new_image in all_images:
       return create_new_image()
   else:
       return new_image
   
   
# Generate the unique combinations based on trait weightings
for i in range(TOTAL_IMAGES):
   
   new_trait_image = create_new_image()
   
   all_images.append(new_trait_image)

TOTAL_IMAGES这个变量是我们要生成的最大图片数量。

create_new_image是利用递归,对于每个图片类别都根据权重随机选择一张图片。

四、判断所有的图片是否独特

1
2
3
4
5
py复制代码def all_images_unique(all_images):
   seen = list()
   return not any(i in seen or seen.append(i) for i in all_images)

print("Are all images unique?", all_images_unique(all_images))

这里我们遍历所有图片来判断是否有重复图片。

五、为每一张图片添加Token Id

1
2
3
4
5
6
py复制代码# Add token Id to each image
i = 0
for item in all_images:
   item["tokenId"] = i
   i = i + 1
print(all_images)

这之后all_images中内容是:

1
py复制代码[{'Cat': '05', 'Title': '01', 'tokenId': 0}, {'Cat': '02', 'Title': '04', 'tokenId': 1}, {'Cat': '01', 'Title': '03', 'tokenId': 2}, {'Cat': '01', 'Title': '02', 'tokenId': 3}, {'Cat': '02', 'Title': '03', 'tokenId': 4}, {'Cat': '07', 'Title': '02', 'tokenId': 5}, {'Cat': '02', 'Title': '02', 'tokenId': 6}, {'Cat': '07', 'Title': '01', 'tokenId': 7}, {'Cat': '03', 'Title': '02', 'tokenId': 8}, {'Cat': '05', 'Title': '02', 'tokenId': 9}]

包含tokenId和两种猫的图片。

六、获取图片使用的数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
py复制代码# Get Trait Counts

   
title_count = {}
for item in title:
   title_count[item] = 0

cat_count = {}
for item in cat:
   cat_count[item] = 0

for image in all_images:
   cat_count[image["Cat"]] += 1
   title_count[image["Title"]] += 1
   
print(cat_count)
print(title_count)

使用字典来存储各个图片被使用的次数。

七、拼凑图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
py复制代码#### Generate Images    
for item in all_images:

   im1 = Image.open(f'./trait-layers/cat/{cat_files[item["Cat"]]}.png').convert('RGBA')
   im2 = Image.open(f'./trait-layers/title/{title_files[item["Title"]]}.png').convert('RGBA')
   
   im1 = im1.resize((400, 400))
   im2 = im2.resize((400, 400))
   #Create each composite

   com = Image.alpha_composite(im1, im2)
   
   #Convert to RGB
   rgb_im = com.convert('RGB')
   file_name = str(item["tokenId"]) + ".png"
   rgb_im.save("./images/" + file_name)

这里的思路很简单,将图片转化为同一尺寸,然后利用Image.alpha_composite将其叠加,然后在根据tokenId来保存图片。

八、来欣赏一下我生成的独一无二的图片吧~

image-20211105214705663

image.png

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%