打开您的终端并导航到您的项目目录或在特定位置创建一个项目文件夹。例如,在终端上运行**mkdir preprocessor**
将在您指定的位置创建一个名为“ preprocessor”的文件夹。
cd preprocessor npm init -y npm install sharp @faker.js/faker --save-dev
接下来,在您的项目中创建一个名为arts
的文件夹和另一个名为outputs
的文件夹。在“艺术”文件夹中,将所有要处理的图像放入其中。
- preprocessor/ - arts/ - node_modules/ - outputs/ - package.json - package-lock.json
在项目的根目录下创建一个名为**imagify.js**
的文件并粘贴以下代码
const fs = require('fs') const path = require('path') const sharp = require('sharp') const { faker } = require('@faker-js/faker') const input = './arts' const output = './outputs' let img_counter = 1 const imgSize = { width: 500, height: 500 } const desired_ext = '.webp' const base_url = '//ipfs.io/ipfs/REPLACE_WITH_IPFS_CID/' const attributes = { weapon: [ 'Stick', 'Knife', 'Blade', 'Clube', 'Ax', 'Sword', 'Spear', 'Gun', 'Craft', ], environment: [ 'Space', 'Sky', 'Desert', 'Forest', 'Grassland', 'Moiuntains', 'Oceans', 'Rainforest', ], rarity: Array.from(Array(10).keys()), } fs.readdirSync(input).forEach((file) => { const orginal_ext = path.extname(file) const orginal_file_name = path.basename(file).split('.')[0] if (['.jpg', '.jpeg', '.png', '.gif', '.webp'].includes(orginal_ext)) { const id = img_counter const metadata = { id, name: `Adulam NFT #${id}`, description: 'AI Arts NFTs Collection, Mint and collect the hottest NFTs around.', price: 1, image: base_url + id + desired_ext, demand: faker.random.numeric({ min: 10, max: 100 }), attributes: [ { trait_type: 'Environment', value: attributes.environment.sort(() => 0.5 - Math.random())[0], }, { trait_type: 'Weapon', value: attributes.weapon.sort(() => 0.5 - Math.random())[0], }, { trait_type: 'Rarity', value: attributes.rarity.sort(() => 0.5 - Math.random())[0], max_value: 10, }, { display_type: 'date', trait_type: 'Created', value: Date.now(), }, { display_type: 'number', trait_type: 'generation', value: 1, }, ], } if (fs.existsSync(`${input}/${orginal_file_name + orginal_ext}`)) { sharp(`${input}/${orginal_file_name + orginal_ext}`) .resize(imgSize.height, imgSize.width) .toFile(`${output}/images/${id + desired_ext}`, (err, info) => console.log(err), ) fs.writeFileSync(`${output}/metadata/${id}.json`, JSON.stringify(metadata), { encoding: 'utf-8', flag: 'w', }) } console.log(metadata) img_counter++ } })
导入基本库
const fs = require('fs') const path = require('path') const sharp = require('sharp') const { faker } = require('@faker-js/faker') const input = './arts' const output = './outputs'
fs
代表文件系统,它是 NodeJs 附带的内置模块。它负责管理您机器上的文件读写活动。
path
是另一个节点模块,可帮助您浏览机器上的目录结构。这将有助于定位我们的图像保存位置。
最后, input
变量包含要处理的图像所在的位置, output
指向将保存处理后的图像的位置。
定义基本变量
let img_counter = 1 const imgSize = { width: 500, height: 500 } const desired_ext = '.webp' const base_url = '//ipfs.io/ipfs/REPLACE_WITH_IPFS_CID/' const attributes = { weapon: [ 'Stick', 'Knife', 'Blade', 'Clube', 'Ax', 'Sword', 'Spear', 'Gun', 'Craft', ], environment: [ 'Space', 'Sky', 'Desert', 'Forest', 'Grassland', 'Moiuntains', 'Oceans', 'Rainforest', ], rarity: Array.from(Array(10).keys()), }
**Image_counter**
帮助我们按照当前迭代对图像进行编号。**ImgSize**
定义要处理的每个图像的宽度和高度的尺寸。**Desired_ext**
表示您希望处理后的图像采用的文件格式。**Base_url**
指定要在 IPFS 上存储图像的位置。**Attributes**
包含有关每个图像元数据的更多信息。
执行递归任务
fs.readdirSync(input).forEach((file) => { if(['.jpg', '.jpeg', '.png', '.gif', '.webp'].includes(orginal_ext)) { // Images and metadata tasks are recursively performed here... } })
在上面的代码块中,我们使用文件系统库 (fs) 循环遍历**input**
位置 (arts) 中的所有图像。对于每个图像,我们确保我们的引擎仅从已批准的扩展列表中选择图像。
执行元数据任务
const id = img_counter const metadata = { id, name: `Adulam NFT #${id}`, description: 'AI Arts NFTs Collection, Mint and collect the hottest NFTs around.', price: 1, image: base_url + id + desired_ext, demand: faker.random.numeric({ min: 10, max: 100 }), attributes: [ { trait_type: 'Environment', value: attributes.environment.sort(() => 0.5 - Math.random())[0], }, { trait_type: 'Weapon', value: attributes.weapon.sort(() => 0.5 - Math.random())[0], }, { trait_type: 'Rarity', value: attributes.rarity.sort(() => 0.5 - Math.random())[0], max_value: 10, }, { display_type: 'date', trait_type: 'Created', value: Date.now(), }, { display_type: 'number', trait_type: 'generation', value: 1, }, ], }
执行图像转换任务
if (fs.existsSync(`${input}/${orginal_file_name + orginal_ext}`)) { sharp(`${input}/${orginal_file_name + orginal_ext}`) .resize(imgSize.height, imgSize.width) .toFile(`${output}/images/${id + desired_ext}`, (err, info) => console.log(err), ) fs.writeFileSync(`${output}/metadata/${id}.json`, JSON.stringify(metadata), { encoding: 'utf-8', flag: 'w', }) } console.log(metadata) img_counter++
调整图像大小并将图像转换为webp
极大地优化了我们的艺术作品,达到了惊人的高度。
例如,中,我让这个图像预处理引擎处理了99
张图像,总大小为111MB
。 .png
扩展名的大小下降到62MB
, .webp
扩展名的大小下降到惊人的4.5MB
。如此巨大的尺寸缩减使得使用我的图像构建的 Minting 网站的加载时间有了很大的飞跃。
最后,从上面的代码块中,我们为每个处理的图像创建了JSON
元数据,包含相同的名称和指向图像位置的 URL。此元数据是我们在处理图像后将部署到 IPFS 的内容。
node imagify.js
- output/ - images - 1.webp - 2.webp - ...... - metadata - 1.json - 2.json - ......
现在,复制上图中可以看到的图像文件夹 CID,并将其替换到您的**imagify.js**
代码中。请参阅下面的代码。
const base_url = "//ipfs.io/ipfs/REPLACE_WITH_IPFS_CID/" //old string const base_url = "//ipfs.io/ipfs/QmY1zrFibpdHQ7qcqZqq7THsqTremZYepXNWR5Au3MF1ST/" //new string
现在,再次运行**node imagify.js**
以将每个图像的准确位置包含到您的JSON元数据中。请参阅替换 CID 前后生成的 JSON 元数据的示例。
更换 CID 之前
{ id: 97, name: 'Adulam NFT #97', description: 'AI Arts NFTs Collection, Mint and collect the hottest NFTs around.', price: 1, image: '//ipfs.io/ipfs/REPLACE_WITH_IPFS_CID/97.webp', demand: '4', attributes: [ { trait_type: 'Environment', value: 'Forest' }, { trait_type: 'Weapon', value: 'Craft' }, { trait_type: 'Rarity', value: 4, max_value: 10 }, { display_type: 'date', trait_type: 'Created', value: 24 }, { display_type: 'number', trait_type: 'generation', value: 1 } ] }
更换 CID 后
{ id: 97, name: 'Adulam NFT #97', description: 'AI Arts NFTs Collection, Mint and collect the hottest NFTs around.', price: 1, image: '//ipfs.io/ipfs/QmY1zrFibpdHQ7qcqZqq7THsqTremZYepXNWR5Au3MF1ST/97.webp', demand: '7', attributes: [ { trait_type: 'Environment', value: 'Moiuntains' }, { trait_type: 'Weapon', value: 'Clube' }, { trait_type: 'Rarity', value: 2, max_value: 10 }, { display_type: 'date', trait_type: 'Created', value: 87 }, { display_type: 'number', trait_type: 'generation', value: 1 } ] }
首先,如果您以前没有这样做过,请前往并注册。然后单击帐户图标并选择 API 密钥。见下图。
现在,您可以使用上图中的任何链接作为ERC721令牌的基本 URL。见下图。
在查看我在 Goerli 测试网上的 NFT 项目的现场演示使用情况。请查看 Opensea 的位置。您可以在我的 YouTube 频道上观看视频版本。
我是一名全栈区块链开发人员,在软件开发行业拥有6+
年以上的经验。
我的堆栈包括JavaScript
、 React
、 Vue
、 Angular
、 Node
、 React Native
、 NextJs
、 Solidity
等等。
,了解如何从头开始构建 Web3 应用程序。我还为想要从导师那里一对一学习的认真的人提供私人和专业课程。
。
下面,我就向您显示应该怎么才能编号中表达所述图形和元参数。