Open pixelsage opened 3 years ago
The offending code seems to be findClosest(c). It always returns with a value that turns black pixels transparent in octree.
EDIT: Or perhaps the octree algorithm turns transparent pixels black?
@benjaminadk Any chance you could take a quick peek at this?
I'm in the same boat here. This is definitely the function findClosest(c) that always returns -1. Maybe we should find a way to set the variable transIndex manually to the color we want. Anyone found a solution?
Oh lord it took me HOURS for this but I got mine working! here's what I did:
script.js file
const file = require('fs').createWriteStream(`${storage}/${name}.gif`);
const gif = new GifEncoder(fw, fh, 'octree', true);
gif.setRepeat(0);
gif.setFrameRate(Number(framerate));
gif.setQuality(Number(quality));
gif.createReadStream().pipe(file);
gif.start();
I commented this line in the GifEncoder.js library
// if (this.transparent !== null) {
// this.transIndex = this.findClosest(this.transparent)
// for (var pixelIndex = 0; pixelIndex < nPix; pixelIndex++) {
// if (this.image[pixelIndex * 4 + 3] == 0) {
// this.indexedPixels[pixelIndex] = this.transIndex
// }
// }
// }
Then proceed with generating
? Enter folder directory. Press "enter" for auto: build/images
? Enter name (no extension). Leave blank to convert all:
? Enter storage folder directory. Press "enter" for auto: build/gifs
? Enter frames per second: 10
? Enter frame width. Leave blank for auto:
? Enter transparent color in hex: 000000
? Enter quality (1 = best; 20 = worst): 10
? Proceed with conversion? Yes
As long as setTransparent() isn't set to null, octree will render black pixels as transparent. For anyone else running into this issue, one workaround is to set the encoder to neuquant instead, which does not have this issue.
Bugged:
const encoder = new GIFEncoder(256, 256, 'octree', true);
Working:
const encoder = new GIFEncoder(256, 256, 'neuquant', true);
Caveat: In certain cases, neuquant colors will not be as accurate.