首页 文章详情

价值百万的 NFT 制作教程(Python版)

Python中文社区 | 696 2022-07-10 01:45 0 0 0
UniSMS (合一短信)

随着时间的推移,数字藏品领域越来越火。当一个加密朋克头像以15万美元的价格出售给Visa时,人们逐渐通过各种渠道去认识NFT。

方法论

这个生成器背后的方法很简单。通过将不同的特征结合在一起,创建一个独特的头像。

获取你的数据

你将使用 usetech-llc"Substrapunks "资源库中的数据。

在下面的链接中下载他们的资源库,并将压缩文件解压到你的本地电脑上。

  1. https://github.com/usetech-llc/substrapunks/archive/refs/heads/master.zip

导入软件包

你将在这个项目中使用以下软件包:

  • PIL

  • IPython

  • Random

  • Json

  • OS

  1. from PIL import Image

  2. from IPython.display import display

  3. import random

  4. import json

  5. import os

指定NFT特性的稀有性

每个独特的头像都由五个特征组成。

  • Face

  • Ears

  • Hair

  • Mouth

  • Nose

稀有性很重要,因为它创造了稀缺性,反过来又创造了价值。你将通过给一个特征中的不同类型分配权重来实现特征中的稀有性。权重的总和应该总是100。

有两种类型的脸(黑色和白色)。你在程序中可以规定,一张图片有60%的机会获得白脸,40%的机会获得黑脸。

  1. # Each image is made up a series of traits

  2. # The weightings for each trait drive the rarity and add up to 100%


  3. face = ["White", "Black"]

  4. face_weights = [60, 40]


  5. ears = ["No Earring", "Left Earring", "Right Earring", "Two Earrings"]

  6. ears_weights = [25, 30, 44, 1]


  7. eyes = ["Regular", "Small", "Rayban", "Hipster", "Focused"]

  8. eyes_weights = [70, 10, 5 , 1 , 14]


  9. hair = ['Up Hair', 'Down Hair', 'Mohawk', 'Red Mohawk', 'Orange Hair', 'Bubble Hair', 'Emo Hair',

  10. 'Thin Hair',

  11. 'Bald',

  12. 'Blonde Hair',

  13. 'Caret Hair',

  14. 'Pony Tails']

  15. hair_weights = [10 , 10 , 10 , 10 ,10, 10, 10 ,10 ,10, 7 , 1 , 2]


  16. mouth = ['Black Lipstick', 'Red Lipstick', 'Big Smile', 'Smile', 'Teeth Smile', 'Purple Lipstick']

  17. mouth_weights = [10, 10,50, 10,15, 5]


  18. nose = ['Nose', 'Nose Ring']

  19. nose_weights = [90, 10]

对特性进行分类

字典是用来将特征名称重定向到它们的文件名。你可以在以下位置找到特征文件名:

  1. ...\substrapunks-master\scripts\face_parts\

特性名称 "White "被引导到face1,而 "Black "被引导到face2。

  1. #Classify traits


  2. face_files = {

  3. "White": "face1",

  4. "Black": "face2"

  5. }


  6. ears_files = {

  7. "No Earring": "ears1",

  8. "Left Earring": "ears2",

  9. "Right Earring": "ears3",

  10. "Two Earrings": "ears4"

  11. }


  12. eyes_files = {

  13. "Regular": "eyes1",

  14. "Small": "eyes2",

  15. "Rayban": "eyes3",

  16. "Hipster": "eyes4",

  17. "Focused": "eyes5"

  18. }


  19. hair_files = {

  20. "Up Hair": "hair1",

  21. "Down Hair": "hair2",

  22. "Mohawk": "hair3",

  23. "Red Mohawk": "hair4",

  24. "Orange Hair": "hair5",

  25. "Bubble Hair": "hair6",

  26. "Emo Hair": "hair7",

  27. "Thin Hair": "hair8",

  28. "Bald": "hair9",

  29. "Blonde Hair": "hair10",

  30. "Caret Hair": "hair11",

  31. "Pony Tails": "hair12"

  32. }



  33. mouth_files = {

  34. "Black Lipstick": "m1",

  35. "Red Lipstick": "m2",

  36. "Big Smile": "m3",

  37. "Smile": "m4",

  38. "Teeth Smile": "m5",

  39. "Purple Lipstick": "m6"

  40. }


  41. nose_files = {

  42. "Nose": "n1",

  43. "Nose Ring": "n2"

  44. }

定义图像特质

你要创建的每个头像都将是六张图片的组合:脸、鼻子、嘴、耳朵和眼睛。

因此,可以写一个for循环,将这些特征组合成一张图片,并指定图片的总数量。

一个函数为每张图片创建一个字典,指定它拥有哪些特征。

这些特征是根据 random.choice()函数给出的。

这个函数遍历脸部特征列表(白色、黑色),并返回白色(60%的机会)或黑色(40%的机会)。

  1. ## Generate Traits


  2. TOTAL_IMAGES = 100 # Number of random unique images we want to generate


  3. all_images = []


  4. # A recursive function to generate unique image combinations

  5. def create_new_image():


  6. new_image = {} #


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

  8. new_image ["Face"] = random.choices(face, face_weights)[0]

  9. new_image ["Ears"] = random.choices(ears, ears_weights)[0]

  10. new_image ["Eyes"] = random.choices(eyes, eyes_weights)[0]

  11. new_image ["Hair"] = random.choices(hair, hair_weights)[0]

  12. new_image ["Mouth"] = random.choices(mouth, mouth_weights)[0]

  13. new_image ["Nose"] = random.choices(nose, nose_weights)[0]


  14. if new_image in all_images:

  15. return create_new_image()

  16. else:

  17. return new_image



  18. # Generate the unique combinations based on trait weightings

  19. for i in range(TOTAL_IMAGES):


  20. new_trait_image = create_new_image()


  21. all_images.append(new_trait_image)

验证唯一性

对于NFT头像项目来说,每个头像都是独一无二的,这一点很重要。因此,需要检查所有的图像是否是唯一的。写一个简单的函数,在所有的图像上循环,将它们存储到一个列表中,并返回重复的图像。

接下来,为每个图像添加一个唯一的标识符。

  1. # Returns true if all images are unique

  2. def all_images_unique(all_images):

  3. seen = list()

  4. return not any(i in seen or seen.append(i) for i in all_images)


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

  6. # Add token Id to each image

  7. i = 0

  8. for item in all_images:

  9. item["tokenId"] = i

  10. i = i + 1


  11. print(all_images)

性状计数

根据预定的权重和随机函数来分配特征。这意味着,即使你将白色面孔的权重定义为60,你也不可能正好有60张白色面孔。为了准确了解每个特征的出现数量,必须跟踪现在有多少特征出现在你的图像集合中。

要做到这一点,要写下面的代码。

  • 为每个特征定义一个字典,其中有它们各自的分类,并从0开始。

循环查看你创建的图像,如果遇到特质,就把它们添加到各自的特质字典中。

  1. # Get Trait Counts


  2. face_count = {}

  3. for item in face:

  4. face_count[item] = 0


  5. ears_count = {}

  6. for item in ears:

  7. ears_count[item] = 0


  8. eyes_count = {}

  9. for item in eyes:

  10. eyes_count[item] = 0


  11. hair_count = {}

  12. for item in hair:

  13. hair_count[item] = 0


  14. mouth_count = {}

  15. for item in mouth:

  16. mouth_count[item] = 0


  17. nose_count = {}

  18. for item in nose:

  19. nose_count[item] = 0


  20. for image in all_images:

  21. face_count[image["Face"]] += 1

  22. ears_count[image["Ears"]] += 1

  23. eyes_count[image["Eyes"]] += 1

  24. hair_count[image["Hair"]] += 1

  25. mouth_count[image["Mouth"]] += 1

  26. nose_count[image["Nose"]] += 1


  27. print(face_count)

  28. print(ears_count)

  29. print(eyes_count)

  30. print(hair_count)

  31. print(mouth_count)

  32. print(nose_count)

生成图像

这是最神奇的部分。对于每张图片,脚本将执行以下操作。

  • 打开我们定义特质的图像特征文件

  • 使用PIL软件包在你的目录中选择相应的性状图像。

  • 将所有的性状组合成一个图像

  • 转换为RGB,这是最传统的颜色模型

  • 把它保存到你的电脑上

  1. #### Generate Images


  2. os.mkdir(f'./images')


  3. for item in all_images:


  4. im1 = Image.open(f'./scripts/face_parts/face/{face_files[item["Face"]]}.png').convert('RGBA')

  5. im2 = Image.open(f'./scripts/face_parts/eyes/{eyes_files[item["Eyes"]]}.png').convert('RGBA')

  6. im3 = Image.open(f'./scripts/face_parts/ears/{ears_files[item["Ears"]]}.png').convert('RGBA')

  7. im4 = Image.open(f'./scripts/face_parts/hair/{hair_files[item["Hair"]]}.png').convert('RGBA')

  8. im5 = Image.open(f'./scripts/face_parts/mouth/{mouth_files[item["Mouth"]]}.png').convert('RGBA')

  9. im6 = Image.open(f'./scripts/face_parts/nose/{nose_files[item["Nose"]]}.png').convert('RGBA')


  10. #Create each composite

  11. com1 = Image.alpha_composite(im1, im2)

  12. com2 = Image.alpha_composite(com1, im3)

  13. com3 = Image.alpha_composite(com2, im4)

  14. com4 = Image.alpha_composite(com3, im5)

  15. com5 = Image.alpha_composite(com4, im6)




  16. #Convert to RGB

  17. rgb_im = com5.convert('RGB')

  18. file_name = str(item["tokenId"]) + ".png"

  19. rgb_im.save("./images/" + file_name)


- 点击下方阅读原文加入社区会员 -

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter