Compare commits

..

9 Commits

Author SHA1 Message Date
Mike Lynch
ca10f8a038 Saves alt text to the image params 2025-04-06 23:03:48 +00:00
00e5fed522 Merge pull request 'feature-bot-cell-size' (#35) from feature-bot-cell-size into main
Reviewed-on: #35
2025-04-06 08:30:07 +00:00
Mike Lynch
91ab1a453c Merge branch 'main' into feature-bot-cell-size
bringing the json-params stuff from the server
2025-04-06 18:26:47 +10:00
Mike Lynch
3eb527008a Made the bot version do bigger cell sizes 2025-04-06 18:25:54 +10:00
007da37674 Merge pull request 'feature-json-params' (#34) from feature-json-params into main
Reviewed-on: #34
2025-04-06 08:24:10 +00:00
Mike Lynch
0427a3295f Standard "grayscale" 2025-04-06 08:22:36 +00:00
c852633119 Merge pull request 'Adjust the size of cells and dots' (#33) from feature-size into main
Reviewed-on: #33
2025-04-06 07:14:02 +00:00
Mike Lynch
ead2b1a7ee Can now load params from the JSON 2025-04-01 01:48:28 +00:00
Mike Lynch
84034ef41c Writes out the parameters as JSON 2025-04-01 01:18:15 +00:00
4 changed files with 49 additions and 18 deletions

View File

@ -2,6 +2,7 @@ import { Resvg } from "@resvg/resvg-js";
import { promises } from "fs";
import { JSDOM } from "jsdom";
import * as d3 from "d3";
import * as d3c from "d3-color";
import yargs from "yargs/yargs";
import { hideBin } from "yargs/helpers";
import spawn from "await-spawn";
@ -17,9 +18,11 @@ import {ColourNamer} from './src/components/colour_namer.js';
const CELL = 10;
const MAG = 2;
const WIDTH = 20;
const WIDTH = 200;
const HEIGHT = WIDTH;
const VISIBLE_DOG = 1000;
// number of pixels which have to be visible for a colour to be
// mentioned in the alt text
const VISIBLE_DOG = 400;
function randomise_params() {
const palette_name = random.choice(Array.from(PALETTES.keys()));
@ -33,13 +36,37 @@ function randomise_params() {
f: random.choice(RADIUS_OPTS),
r: random.float(0, 0.4),
}});
const cell = 5 + random.float() * random.float() * 55;
return {
background: palette[0],
palette: palette_name,
patterns: patterns
patterns: patterns,
cell: cell,
}
}
async function load_or_random_params(paramf) {
if( paramf ) {
const pjson = await promises.readFile(paramf);
const params = JSON.parse(pjson);
params.background = d3c.color(params.background);
params.patterns.forEach((p) => {
p.colour = d3c.color(p.colour);
});
return params;
}
return randomise_params();
}
async function save_params(paramf, params) {
params.background = params.background.formatHex();
params.patterns.forEach((p) => {
p.colour = p.colour.formatHex();
});
await promises.writeFile(paramf, JSON.stringify(params));
}
// lol the best way I found to to this was imagemagick!
@ -109,18 +136,21 @@ function poptimal_svg(params) {
const document = window.document;
const container = d3.select(document.body).append("div");
const dm = new DotMaker(WIDTH);
const width = WIDTH / params.cell;
const height = WIDTH / params.cell;
const dm = new DotMaker(width, height);
const svg = container.append("svg")
.attr("width", WIDTH * CELL * MAG)
.attr("height", HEIGHT * CELL * MAG)
.attr("viewBox", [ 0, 0, WIDTH, HEIGHT ]);
.attr("width", WIDTH * MAG)
.attr("height", HEIGHT * MAG)
.attr("viewBox", [ 0, 0, width, height ]);
const background = svg.append("rect")
.attr("x", 0)
.attr("y", 0)
.attr("width", WIDTH)
.attr("height", WIDTH)
.attr("width", width)
.attr("height", height)
.attr("fill", params.background);
@ -183,20 +213,22 @@ async function post_image(image, alt_text, cf) {
async function main() {
const argv = yargs(hideBin(process.argv))
.usage("Usage: -s SIZE -o output.png -c config.json")
.usage("Usage: -s SIZE [-o output] -c config.json [-p params.json]")
.default('s', 1200)
.default('c', 'config.json').argv;
const cfjson = await promises.readFile(argv.c);
const cf = JSON.parse(cfjson);
const ts = String(Date.now());
const fn = argv.o || String(Date.now()) + '.png';
const fn = (argv.o || ts) + '.png';
const jsfn = (argv.o || ts) + '.json';
const imgfile = cf['working_dir'] + '/' + fn;
const paramsfile = cf['working_dir'] + '/' + jsfn;
const params = randomise_params();
const params = await load_or_random_params(argv.p);
const colourf = params.palette === 'grayscale' ? cf['grayscale'] : cf['colour'];
const namer = new ColourNamer();
@ -216,14 +248,14 @@ async function main() {
const pngData = resvg.render();
const pngBuffer = pngData.asPng();
await promises.writeFile(imgfile, pngBuffer);
// generate the alt_text last to check the image file histogram
// so we don't include obscured colours
const hist = await get_histogram(imgfile);
const alt_text = image_description(namer, params, hist);
params.alt_text = alt_text;
await save_params(paramsfile, params);
console.log(alt_text);
console.log(imgfile);
if( cf['base_url'] ) {

View File

@ -45,7 +45,6 @@ function int_range(v1, v2) {
class DotMaker {
constructor(width, height) {
console.log(width, height);
this.width = width;
this.height = height;
this.wh = 0.5 * (width + height);

View File

@ -144,8 +144,8 @@ const dots2 = dm.dots(1 / m2, n2, false);
const svg = d3.create("svg")
.attr("width", width * cell * MAG)
.attr("height", height * cell * MAG)
.attr("width", WIDTH * MAG)
.attr("height", HEIGHT * MAG)
.attr("viewBox", [ 0, 0, width, height ]);