gif.js
Version:
JavaScript GIF encoding library
93 lines (74 loc) • 2.21 kB
text/coffeescript
{NeuQuant} = require './TypedNeuQuant.js'
###
typed 100 runs:
run finished at q1
avg: 661.46ms median: 660.54ms
run finished at q10
avg: 67.49ms median: 67.03ms
run finished at q20
avg: 34.56ms median: 34.19ms
normal 100 runs:
run finished at q1
avg: 888.10ms median: 887.63ms
run finished at q10
avg: 92.85ms median: 91.99ms
run finished at q20
avg: 46.14ms median: 45.68ms
###
quality = 10 # pixel sample interval, 1 being the best quality
runs = 100
if window.performance?.now?
now = -> window.performance.now()
else
now = Date.now
window.addEventListener 'load', ->
img = document.getElementById 'image'
canvas = document.getElementById 'canvas'
w = canvas.width = img.width
h = canvas.height = img.height
ctx = canvas.getContext('2d')
ctx.drawImage(img, 0, 0)
imdata = ctx.getImageData(0, 0, img.width, img.height)
rgba = imdata.data
rgb = new Uint8Array w * h * 3
#rgb = new Array w * h * 3
rgb_idx = 0
for i in [0...rgba.length] by 4
rgb[rgb_idx++] = rgba[i + 0]
rgb[rgb_idx++] = rgba[i + 1]
rgb[rgb_idx++] = rgba[i + 2]
runtimes = []
for run in [0...runs]
start = now()
imgq = new NeuQuant rgb, quality
imgq.buildColormap()
end = now()
delta = end - start
runtimes.push delta
console.log runtimes.join('\n')
map = imgq.getColormap()
avg = runtimes.reduce((p, n) -> p + n) / runtimes.length
median = runtimes.sort()[Math.floor(runs / 2)]
console.log """
run finished at q#{ quality }
avg: #{ avg.toFixed(2) }ms median: #{ median.toFixed(2) }ms
"""
for y in [0...h]
for x in [0...w]
idx = (y * w + x) * 4
r = rgba[idx + 0]
g = rgba[idx + 1]
b = rgba[idx + 2]
map_idx = imgq.lookupRGB(r, g, b) * 3
rgba[idx + 0] = map[map_idx]
rgba[idx + 1] = map[map_idx + 1]
rgba[idx + 2] = map[map_idx + 2]
ctx.putImageData imdata, 0, 0
for i in [0...map.length] by 3
color = [map[i], map[i + 1], map[i + 2]]
el = document.createElement 'span'
el.style.display = 'inline-block'
el.style.height = '1em'
el.style.width = '1em'
el.style.background = 'rgb(' + color.join(',') + ')'
document.body.appendChild el