wip back to old method about to change it
This commit is contained in:
parent
1d77bb3b22
commit
bc354d9f05
1 changed files with 7 additions and 48 deletions
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue