Skip to content

Commit

Permalink
added metadata creation
Browse files Browse the repository at this point in the history
  • Loading branch information
HashLips committed Nov 19, 2021
1 parent c42c04e commit 28db499
Show file tree
Hide file tree
Showing 2 changed files with 179 additions and 1 deletion.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"preview": "node utils/preview.js",
"pixelate": "node utils/pixelate.js",
"update_info": "node utils/update_info.js",
"preview_gif": "node utils/preview_gif.js"
"preview_gif": "node utils/preview_gif.js",
"generate_metadata": "node utils/generate_metadata.js"
},
"author": "Daniel Eugene Botha (HashLips)",
"license": "MIT",
Expand Down
177 changes: 177 additions & 0 deletions utils/generate_metadata.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
const fs = require("fs");
const path = require("path");
const { createCanvas, loadImage } = require("canvas");
const basePath = process.cwd();
const buildDir = `${basePath}/build/json`;
const inputDir = `${basePath}/build/images`;
const {
format,
namePrefix,
description,
baseUri,
} = require(`${basePath}/src/config.js`);
const console = require("console");
const canvas = createCanvas(format.width, format.height);
const ctx = canvas.getContext("2d");
const metadataList = [];

const buildSetup = () => {
if (fs.existsSync(buildDir)) {
fs.rmdirSync(buildDir, { recursive: true });
}
fs.mkdirSync(buildDir);
};

const getImages = (_dir) => {
try {
return fs
.readdirSync(_dir)
.filter((item) => {
let extension = path.extname(`${_dir}${item}`);
if (extension == ".png" || extension == ".jpg") {
return item;
}
})
.map((i) => {
return {
filename: i,
path: `${_dir}/${i}`,
};
});
} catch {
return null;
}
};

const loadImgData = async (_imgObject) => {
return new Promise(async (resolve) => {
const image = await loadImage(`${_imgObject.path}`);
resolve({ imgObject: _imgObject, loadedImage: image });
});
};

const draw = (_imgObject) => {
let w = canvas.width;
let h = canvas.height;
ctx.drawImage(_imgObject.loadedImage, 0, 0, w, h);
};

const addRarity = () => {
let w = canvas.width;
let h = canvas.height;
let i = -4;
let count = 0;
let imgdata = ctx.getImageData(0, 0, w, h);
let rgb = imgdata.data;
let newRgb = { r: 0, g: 0, b: 0 };
const tolerance = 15;
const rareColorBase = "NOT a Hot Dog";
const rareColor = [
{ name: "Hot Dog", rgb: { r: 192, g: 158, b: 131 } },
{ name: "Hot Dog", rgb: { r: 128, g: 134, b: 90 } },
{ name: "Hot Dog", rgb: { r: 113, g: 65, b: 179 } },
{ name: "Hot Dog", rgb: { r: 162, g: 108, b: 67 } },
];

while ((i += 10 * 4) < rgb.length) {
++count;
newRgb.r += rgb[i];
newRgb.g += rgb[i + 1];
newRgb.b += rgb[i + 2];
}

newRgb.r = ~~(newRgb.r / count);
newRgb.g = ~~(newRgb.g / count);
newRgb.b = ~~(newRgb.b / count);

let rarity = rareColorBase;

rareColor.forEach((color) => {
if (isNeighborColor(newRgb, color.rgb, tolerance)) {
rarity = color.name;
}
});

console.log(newRgb);
console.log(rarity);

return [
{
trait_type: "average color",
value: `rgb(${newRgb.r},${newRgb.g},${newRgb.b})`,
},
{
trait_type: "What is this?",
value: rarity,
},
{
trait_type: "date",
value: randomIntFromInterval(1500, 1900),
},
];
};

randomIntFromInterval = (min, max) => {
return Math.floor(Math.random() * (max - min + 1) + min);
};

isNeighborColor = (color1, color2, tolerance) => {
return (
Math.abs(color1.r - color2.r) <= tolerance &&
Math.abs(color1.g - color2.g) <= tolerance &&
Math.abs(color1.b - color2.b) <= tolerance
);
};

const saveMetadata = (_loadedImageObject) => {
let shortName = _loadedImageObject.imgObject.filename.replace(
/\.[^/.]+$/,
""
);

let tempAttributes = [];
tempAttributes.push(addRarity());

let tempMetadata = {
name: `${namePrefix} #${shortName}`,
description: description,
image: `${baseUri}/${shortName}.png`,
edition: Number(shortName),
attributes: tempAttributes,
compiler: "HashLips Art Engine",
};
fs.writeFileSync(
`${buildDir}/${shortName}.json`,
JSON.stringify(tempMetadata, null, 2)
);
metadataList.push(tempMetadata);
};

const writeMetaData = (_data) => {
fs.writeFileSync(`${buildDir}/_metadata.json`, _data);
};

const startCreating = async () => {
const images = getImages(inputDir);
if (images == null) {
console.log("Please generate collection first.");
return;
}
let loadedImageObjects = [];
images.forEach((imgObject) => {
loadedImageObjects.push(loadImgData(imgObject));
});
await Promise.all(loadedImageObjects).then((loadedImageObjectArray) => {
loadedImageObjectArray.forEach((loadedImageObject) => {
draw(loadedImageObject);
saveMetadata(loadedImageObject);
console.log(
`Created metadata for image: ${loadedImageObject.imgObject.filename}`
);
});
});
writeMetaData(JSON.stringify(metadataList, null, 2));
};

buildSetup();
startCreating();

0 comments on commit 28db499

Please sign in to comment.