使用 Python 创建您自己的NFT集合(一)
该系列主要分为4部分: 第一部分: 如何使用 Python 拼接创建月饼图像集。 第二部分:了解如何生成收藏的元数据。 第三部分:了解生成的收藏如何存储。 第四部分:了解链上合约,NFT上链。
本文主要讲解第一、二部分,我们学习python如何批量拼接生成图片。
一、批量制作NFT方案选择
按照目前最火的头像来说,一般分为算法生成和拼接图片两种。
除去部分通过手绘的头像,很多NFT头像其实都是通过算法和脚本的方式来将各种元素组合生成不同的头像。
算法生成相对于普通人来说比较难,拼接图像无疑是一种更好的选择。譬如你设计了3张脸、3个发型和3个道具,就能通过脚本拼接的形式自动生成3x3x3即27张图片,倘若你继续往里面添加不同的元素,就可以得到更多的头像,并且每一张都是不一样的。
拼接图像的本质就是 通过将不同的特征组合在一起来创建独特的图像。
二、 拼接图像实现思路
首先,需要准备组合图像的元素,可以根据自己的设定来决定元素的多少。然后将各类元素保存在不同的文件夹里面,利用算法或脚本(例如Python等)来进行随机拼接,就能快速生成n张相似但不同的数字图像。最后将这些数字图像上链制作成NFT作品。
定义图像特征,将各类元素保存在不同的文件夹里面,编写了一个 for循环,将这些特征组合成一张图片。
三、如何使用 Python 拼接创建中秋月饼NFT图像集
月饼设计
- 把这些图片搞一样大小,350*350
- 把月饼背景扣出来,4种颜色的月饼。做为底图背景。
- 把月饼口味扣出来,4种口味,透明背景,大小位置固定,直接去叠层合成
- 把脸扣出来,4种脸型,透明背景,大小位置固定,直接去叠层合成
代码会组合这些元素,生成唯一的月饼图像。
代码实现以及设计(生成图片对应json元数据结构)
实现代码,参考: https://github.com/gelerum/nft-collection-generator
代码主要实现2部分功能:
- 生成最终组合后的图片
- 生成图片对应json元数据结构
首先, 在编写代码前,我们需要准备2个东西,一个是图片素材,一个是根据图片素材修改layers.json文件。
- 代码从layers.json文件获取,要加载要组合素材信息。
通过层的weight来影响稀有性。 - 根据layers.json,生成 image 字典。 一个iamge字典,就其实唯一的描述了这张图片。
例如: {‘background’: ‘orange’, ‘body’: ‘dark’, ‘eye’: ‘big blue’, ‘horn’: ‘standing’} 从layers.json选择随机元素,并将其添加到image字典中 - 定义images列表,非重复image字典加入到images列表中,直到指定集合个数。
- 保存集合图像和元数据
将图像的各层组合为一幅图像,并保存最终图像。 代码根据 image字典,关联layers.json到具体文件,遍历进行合成图像。 文件名,即我们生产的图像编号。
核心代码:
image_id = 0
for image in images:
save_image(data, image, image_id)
save_metadata(image, image_id)
image_id += 1
def save_image(data: dict, image: dict, image_id: int):
"""
Сombines layers of the image to one image and saves the final image
"""
paths = []
for layer in image:
for item in data[layer]:
if item["name"] == image[layer]:
path = PATH_TO_LAYERS + "/{}/{}".format(layer, item["fileName"])
paths.append(path)
break
image_file = Image.open(paths[0]).convert("RGBA")
for path in paths[1:]:
image_file = Image.alpha_composite(image_file, Image.open(path).convert("RGBA"))
image_file.save(PATH_TO_IMAGES + "/{}.png".format(image_id))
- save_image:将图像的各层组合为一幅图像,并保存最终图像
- save_metadata :将图像的各层组合为一个json元数据,并保存最终文件
四、Python图像库PIL
Python图像库PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PIL。 PIL历史悠久,原来是只支持python2.x的版本的,后来出现了移植到python3的库pillow,pillow号称是friendly fork for PIL,其功能和PIL差不多,但是支持python3。
python合成一张背景透明的图像和一张背景不透明的图
Image.alpha_composite( )——实现一张背景透明图像和一张背景不透明图像的合成
使用这个函数,注意,2个参数的图片大小要一样大,不一样大的话,使用resisze提前调整一样大。
import PIL.Image as Image
layer1 = Image.open("image.jpg").convert('RGBA')
layer2 = Image.open("mask.png").convert('RGBA')
final = Image.new("RGBA", layer1.size)
final = Image.alpha_composite(final, layer1)
final = Image.alpha_composite(final, layer2)
final=final.convert('RGB')
final.save('image_mask.jpg')
参考
用自定义素材组合生成艺术NFT https://learnblockchain.cn/article/4549 如何用用Python制作NFT区块链作品 参考URL: https://www.jb51.net/article/215008.htm 英国12岁男孩用 Python 写了一个NFT表情包,赚了250万 参考URL: https://www.163.com/dy/article/H9GO4IB105535UFD.html
|