This is an old revision of the document!
Generating Photos with Code 程式生成照片
By Yiler Huang
First round
Second round
Third round
First program
Second program
// import the JIMP library const Jimp = require("jimp"); const fs = require('fs'); // knuth shuffle from https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array //shuffle function shuffle(array) { var currentIndex = array.length, randomIndex; // While there remain elements to shuffle... while (currentIndex != 0) { // Pick a remaining element... randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; // And swap it with the current element. [array[currentIndex], array[randomIndex]] = [ array[randomIndex], array[currentIndex] ]; } return array; } //randomRange function randomRange(min, max) { return min + ((max - min) * Math.random()) } //pickFromArray function pickFromArray(array) { return array[Math.floor(Math.random() * array.length)]; } //from https://jeremyresearch.medium.com/node-js-count-the-numbers-of-files-in-a-directory-9562dec64a45 // set the path data in an array let pathArray = [ "pics/input1.jpg", "pics/input2.jpg", "pics/input3.jpg", "pics/input4.jpg", "pics/input5.jpg", "pics/input6.jpg", "pics/input7.jpg", "pics/input8.jpg", ]; function trueOrFalse() { let output = Math.random() < 0.5 ? true : false; return output } // use map to read the path data and produce JIMP Promises let newPA = shuffle(pathArray).slice(0, 3) let jimpData = newPA.map(path => Jimp.read(path)); // through Promise.all, get the data from the Promises and process it through the methods provided by JIMP // the data processing will proceed in parallel, just as it does in Hydra for (let i = 0; i < 50; i++) { Promise.all(jimpData).then((pictures) => { return pictures[0] .grayscale() //composite argument1: shiftX, argument2: shiftY .composite(pictures[1].color([{ apply: "tint", params: [randomRange(0, 30)] }]).mirror(trueOrFalse(), trueOrFalse()), 0, 0, { mode: Jimp.BLEND_LIGHTEN, opacitySource: 1 }) .composite(pictures[2].grayscale().dither565().dither565(), 0,0, { mode:Jimp.BLEND_DARKEN, opacitySource: 0.6 }) .color([{ apply: "hue", params: [randomRange(-360, 360)] }]) .resize(2000, 2000) .write(`./output-3/output-${i}.jpg`); }).catch((err) => { console.error(err) }) newPA = shuffle(pathArray).slice(0, 2) jimpData = newPA.map(path => Jimp.read(path)); }
Program 3
// import the JIMP library
const Jimp = require("jimp");
const fs = require('fs');
// knuth shuffle from https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
//shuffle
function shuffle(array) {
var currentIndex = array.length,
randomIndex;
// While there remain elements to shuffle...
while (currentIndex != 0) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex--;
// And swap it with the current element.
[array[currentIndex], array[randomIndex]] = [
array[randomIndex], array[currentIndex]
];
}
return array;
}
//randomRange
function randomRange(min, max) {
return min + ((max - min) * Math.random())
}
//pickFromArray
function pickFromArray(array) {
return array[Math.floor(Math.random() * array.length)];
}
//from https://jeremyresearch.medium.com/node-js-count-the-numbers-of-files-in-a-directory-9562dec64a45
// set the path data in an array
let pathArray = [
"pics/input1.jpg",
"pics/input2.jpg",
"pics/input3.jpg",
"pics/input4.jpg",
"pics/input5.jpg",
"pics/input6.jpg",
"pics/input7.jpg",
"pics/input8.jpg",
"pics/input9.jpg",
"pics/input10.jpg",
"pics/input11.jpg",
"pics/input12.jpg",
];
function trueOrFalse() {
let output = Math.random() < 0.5 ? true : false;
return output
}
// use map to read the path data and produce JIMP Promises
let newPA = shuffle(pathArray).slice(0, 3)
let jimpData = newPA.map(path => Jimp.read(path));
// through Promise.all, get the data from the Promises and process it through the methods provided by JIMP
// the data processing will proceed in parallel, just as it does in Hydra
for (let i = 0; i < 100; i++) {
Promise.all(jimpData).then((pictures) => {
return pictures[0]
.grayscale()
//composite argument1: shiftX, argument2: shiftY
.composite(pictures[1].grayscale().invert(), 0,0, {
mode:Jimp.BLEND_DARKEN,
opacitySource: 0.8
})
.composite(pictures[2].color([{
apply: "tint",
params: [randomRange(0, 30)]
}]).mirror(trueOrFalse(), trueOrFalse()), 0, 0, {
mode: Jimp.BLEND_LIGHTEN,
opacitySource: 1
})
.color([{
apply: "hue",
params: [randomRange(-360, 360)]
}])
.resize(2000, 2000)
.write(`./output-5/output-${i}.jpg`);
}).catch((err) => {
console.error(err)
})
newPA = shuffle(pathArray).slice(0, 3)
jimpData = newPA.map(path => Jimp.read(path));
}













































