diff --git a/dither-image.js b/dither-image.js index 70292af..b0c81d1 100644 --- a/dither-image.js +++ b/dither-image.js @@ -27,6 +27,10 @@ class RGB { this.b = b; } + clone() { + return new RGB(this.r, this.g, this.b); + } + static fromHex(val) { let r = (val >>> 16) & 0xff; let g = (val >>> 8) & 0xff; @@ -408,7 +412,7 @@ function decimate(input, palette, n, inputError) { let width = input.length; let inputPixel = (x, error) => { - let rgb = input[x]; + let rgb = input[x].clone(); if (error) { rgb.add(error.cur[x]); } @@ -495,7 +499,7 @@ function decimate(input, palette, n, inputError) { //decimated = [0, 0x36, 0x0f, 0x86]; let reserved = [0]; // black - reserved = [0, 15]; // black, white + //reserved = [0, 15]; // black, white //reserved = [0, 5, 10, 15]; // grayscale //reserved = [0, 0x48, 0x78, 15]; // vaporwave //reserved = [0, 0x3c, 0x78, 15]; // red/blue/white @@ -505,57 +509,13 @@ function decimate(input, palette, n, inputError) { keepers[i & 0xfe] = 1; // drop that 0 luminance bit! } - - // not happy with this alt yet - - let colorCount = []; - for (let i = 0; i < 256; i++) { - colorCount[i] = 0; - } - - const bestColor = (rgb) => { - let best = -1; - let closest = Infinity; - for (let i = 0; i < 256; i += 2) { - let distance = rgb.difference(atariRGB[i]).magnitude(); - if (distance < closest) { - closest = distance; - best = i; - } - } - return best; - }; - for (let x = 0; x < width; x++ ) { - let rgb = inputPixel(x); - let i = bestColor(rgb); - colorCount[i]++; - } - - for (let keep of reserved) { - colorCount[keep] = Infinity; - } - let popular = colorCount - .map((count, color) => {return {count, color}}) - .filter(({count}) => count > 0) - .sort((a, b) => b.count - a.count) - decimated = []; - for (let {color} of popular) { - decimated.push(color); - if (decimated.length == n) { - break; - } - } - decimated = decimated.sort((a, b) => a - b); - - /* - while (decimated.length > n) { let {popularity, fitness, output} = dither(decimated); // Try dropping least used color on each iteration let least = Infinity; let pick = -1; - for (let i = 0; i < decimated.length; i++) { + for (let i = 1; i < decimated.length; i++) { let color = decimated[i]; if (keepers[color]) { continue; @@ -587,7 +547,6 @@ function decimate(input, palette, n, inputError) { throw new Error('this should not happen'); } } - */ // Palette fits return dither(decimated);