summaryrefslogtreecommitdiff
path: root/gif.html
diff options
context:
space:
mode:
Diffstat (limited to 'gif.html')
-rw-r--r--gif.html149
1 files changed, 149 insertions, 0 deletions
diff --git a/gif.html b/gif.html
new file mode 100644
index 0000000..a9090cc
--- /dev/null
+++ b/gif.html
@@ -0,0 +1,149 @@
+<!doctype html>
+<html>
+<head>
+<title>Gifs</title>
+</head>
+<body>
+<div>
+<button id="random">random</button>
+<button id="pattern2">pattern2</button>
+<button id="pattern3">pattern3</button>
+<button id="pattern4">pattern4</button>
+<button id="pattern2Lite">pattern2lite</button>
+<button id="pattern3Lite">pattern3lite</button>
+<button id="pattern4Lite">pattern4lite</button>
+<button id="floydSteinberg">floyd-steinberg</button>
+<button id="right">right</button>
+<input type="text" id="url" value="http://i.imgur.com/BmGm7sU.gif">
+<button id="save">SAVE</button>
+<span id="loading"></span>
+</div>
+<div id="images"></div>
+</body>
+<script type="text/javascript" src="gif-encode/util.js"></script>
+<script type="text/javascript" src="gif-encode/tube.js"></script>
+<script type="text/javascript" src="gif-encode/client.js"></script>
+<script type="text/javascript" src="gif.js"></script>
+<script type="text/javascript" src="FileSaver.js"></script>
+<script type="text/javascript" src="canvasquery.js"></script>
+<script type="text/javascript" src="canvasquery.dither.js"></script>
+<script type="text/javascript">
+
+document.getElementById("url").onchange = load
+setTimeout(load)
+
+function status (s){
+ var el = document.getElementById("loading")
+ el.innerHTML = s + "..."
+}
+
+function load(imageURL) {
+ document.getElementById("save").style.display = "none"
+ status("loading")
+ var imageURL = proxify( document.getElementById("url").value );
+
+ if (imageURL.substr(-3) === "gif") {
+ window.gif = GIF(imageURL);
+ // gif.on("error", tryToLoadNextImage);
+ // gif.on("rendered", trackLoadTime);
+ gif.on("rendered", ready);
+ return gif.render();
+ } else {
+ window.img = new Image();
+ // img.addEventListener("error", tryToLoadNextImage);
+ img.addEventListener("load", ready);
+ img.crossOrigin = "anonymous";
+ return img.src = imageURL;
+ }
+}
+
+function giveImage() {
+ if (imageURL.substr(-3) === "gif") {
+ return gif.frames[gif.currentFrame()].ctx.canvas;
+ } else {
+ return img;
+ }
+}
+
+function proxify (url) {
+ return "/cgi-bin/proxy?" + url // .replace(/^https?:\/\//, "");
+};
+
+
+function ready(){
+ status("")
+ var buttons = document.getElementsByTagName("button")
+ for (var i = 0; i < buttons.length; i++) {
+ (function(n){
+ buttons[n].onclick = function(){
+ algo = buttons[n].id;
+ build()
+ }
+ })(i)
+ }
+ document.getElementById("save").onclick = save
+ build()
+}
+
+var encoder = new GifEncoder()
+
+encoder.on("quantized", function(url){
+ status("encoding")
+ encoder.encode()
+})
+
+encoder.on("rendered-url", function(url){
+ status("")
+ var image = new Image ()
+ image.src = url
+ document.body.appendChild(image)
+})
+
+var lastGif;
+encoder.on("rendered", function(bits){
+ status("")
+ lastGif = bits
+ document.getElementById("save").style.display = "inline"
+})
+
+function save (){
+ if (!lastGif) return;
+ var filename = document.getElementById("url").value.replace(/^.*\//,"").replace(/\.gif.*$/,"")
+ var blob = new Blob ([lastGif], {type: "image/gif"});
+ saveAs(blob, filename + "-" + algo + "-" + (+new Date() % 1000) + ".gif");
+}
+
+var algo = "random"
+var frames = []
+function build(){
+ document.getElementById("save").style.display = "none"
+ status("dithering")
+ encoder.resetFrames()
+
+ document.getElementById("images").innerHTML = ""
+ gif.frames.forEach(function(frame){
+ var cc = dither(frame)
+ encoder.addFrame(cc.canvas)
+ })
+
+ if (! encoder.quantized) {
+ status("quantizing")
+ encoder.quantize()
+ }
+ else {
+ status("encoding")
+ encoder.encode()
+ }
+}
+function dither(frame){
+ var canvas = frame.ctx.canvas
+ var w = canvas.width, h = canvas.height;
+ var cc = cq(w, h)
+ cc.drawImage(canvas, 0, 0, w, h);
+ cc[algo + "Dither"]( )
+ return cc
+ // cc.appendTo("#images")
+}
+</script>
+</html>
+