見出し画像

ジェネラティブNFTの発行方法

先日、DOKU-TOKUさんの個展に行くとジェネラティブNFTが展示されていました。

そこで興味を持ち、自分でも発行してみたいと思いチャレンジしてみました!

発行方法を残しておきます。

まずパーツ毎のデザインを用意する必要があります。
今回は、商用可能な動物の画像と背景を用意しました。

別方法として、hashlips_art_engineという公開されたGithubからできます。

node.jsのバージョンを「v10.18.0」にする必要がありますが、
READMEに沿って進めれば、簡単に生成した画像ができました。


pythonのスクリプトから、用意した画像を掛け合わせます。
※google colaboratoryを使うと環境構築せずに実行できます。

from PIL import Image
import random
import os

# 各パーツのディレクトリを指定
animals = ["animals/cat.png", "animals/doc.png", "animals/pengin.png", "animals/risu.png"]
backgrounds = ["backgrounds/05.jpg", "backgrounds/06.jpg", "backgrounds/21.jpg", "backgrounds/23.jpg"]

def create_nft(output_path, token_id):
    animal = Image.open(random.choice(animals)).convert("RGBA")
    background = Image.open(random.choice(backgrounds)).convert("RGBA")

    # 背景のサイズに動物の画像をリサイズ
    animal = animal.resize(background.size, Image.ANTIALIAS)

    # レイヤーを合成
    combined = Image.alpha_composite(background, animal)

    # 保存
    combined.save(os.path.join(output_path, f"nft_{token_id}.png"))

# ジェネレートする数
num_nfts = 10
output_dir = "output_nfts"
os.makedirs(output_dir, exist_ok=True)

for i in range(num_nfts):
    create_nft(output_dir, i)

animalsには、動物の画像パスを設定し、backgroundsには背景のパスを設定します。

Image.openでパーツ毎の変数を用意します。
今回は、動物と背景の2つになります。

画像のサイズは統一する必要があるため、コードでリサイズしています。

スクリプトを実行すると、output_nftsにそれぞれのパーツをランダムに組み合わせた画像が出力されます。

次にメタデータを作成していきます。
metadataにはopenseaに表示するためのパラメーターとtraitsには各パーツの名称を設定します。

スクリプトを実行します。

import json
import os

# メタデータを保存するディレクトリ
metadata_dir = "metadata"
os.makedirs(metadata_dir, exist_ok=True)

# メタデータのテンプレート
def generate_metadata(token_id, image_url, traits):
    metadata = {
        "name": f"Generative Animals #{token_id}",
        "description": "This is a unique animal generative NFT",
        "image": image_url,
        "attributes": traits
    }
    return metadata

# 各NFTのメタデータを生成
for i in range(10):
    image_url = f"https://purple-gentle-elephant-417.mypinata.cloud/ipfs/QmSvzaCUk117Z5Ax44JEPaupbVFjT4WKomJMBXLiXnKEdy/nft_{i}.png"  # 実際にはIPFSなどのURL
    traits = [
        {"trait_type": "background", "value": "Blue"},
        {"trait_type": "animal", "value": "Sword"}
    ]
    metadata = generate_metadata(i, image_url, traits)

    # JSONファイルとして保存
    with open(os.path.join(metadata_dir, f"nft_{i}.json"), "w") as f:
        json.dump(metadata, f, indent=4)

metadataのフォルダーが出力されました。
それぞれのメタデータのimageとattributesを紐づける画像パスとパーツ名称に変更します。

ここからは以前に作成した記事とやり方は同じなので割愛します。
下記の記事に沿って進めれば、OpenSeaに表示することができます。

流れとしては、
・画像とメタデータをIFPSにアップロード
 おすすめは、pinataです。
・openzeppelin wizardでコードを作成し、Remixで実行
・OpenSeaで確認
 もし表示されなければ、メタデータを更新を押します。
 表示に最大24時間かかる場合があります。

以上です!

この記事が気に入ったらサポートをしてみませんか?