1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
// importScripts('LZWEncoder.js', 'NeuQuant.js', 'GIFEncoder.js');
self.onmessage = function(event) {
var data = event.data;
var task = data['task'];
switch (task) {
case 'encode':
encode (data);
break;
case 'quantize':
quantize(data);
break;
case 'close':
self.close();
break;
}
}
function log(msg) {
self.postMessage({
task: 'message',
message: msg
});
}
function quantize (data) {
var imageData = data["imageData"];
var pixels = discardAlphaChannel( imageData.data );
var nq = new NeuQuant (pixels, pixels.length, 1);
var colortab = nq.process();
self.postMessage({
task: 'quantize',
neuquant: nq.save(),
colortab: colortab
});
}
function discardAlphaChannel( imageData ) {
var pixels = [];
for ( var i = 0, b = 0, _len = imageData.length; i < _len; b += 4 ) {
pixels[i++] = imageData[b];
pixels[i++] = imageData[b+1];
pixels[i++] = imageData[b+2];
}
return pixels;
}
function encode (data) {
var frame_index = data["frame_index"];
var frame_length = data["frame_length"];
var height = data["height"];
var width = data["width"];
var imageData = data["imageData"];
var delay = data["delay"];
var neuquant = data["neuquant"];
var colortab = data["colortab"];
// Create a new GIFEncoder for every new worker
var encoder = new GIFEncoder();
encoder.setRepeat(0); // loop forever
encoder.setQuality(1);
encoder.setSize(width, height);
encoder.setDelay(delay);
if (frame_index == 0) {
encoder.start();
}
else {
encoder.cont();
encoder.setProperties(true, false); //started, firstFrame
}
// Load the neural net here because the color table gets clobbered by encoder.start();
encoder.setNeuquant(neuquant, colortab);
encoder.addFrame(imageData, true);
if(frame_length == frame_index) {
encoder.finish();
}
self.postMessage({
task: 'encode',
frame_index: frame_index,
frame_data: encoder.stream().getData()
});
// on the page, search for the GIF89a to see the frame_index
delete encoder;
delete data;
};
|