From 49cd0514cc03e9ce3859a3f672f66c18d331f5be Mon Sep 17 00:00:00 2001
From: Kristjan SCHMIDT <35647502+KristjanESPERANTO@users.noreply.github.com>
Date: Wed, 29 Dec 2021 03:11:06 +0100
Subject: [PATCH] Add video export + layout changes
---
app.js | 68 +-
index.html | 30 +-
license.md | 4 +-
readme.md | 6 +
stylesheet.css | 22 +-
third-party/webm-writer-js/Readme.md | 106 ++
.../webm-writer-js/webm-writer-0.3.0.js | 1362 +++++++++++++++++
7 files changed, 1565 insertions(+), 33 deletions(-)
create mode 100644 third-party/webm-writer-js/Readme.md
create mode 100644 third-party/webm-writer-js/webm-writer-0.3.0.js
diff --git a/app.js b/app.js
index df5e145..236c2c4 100644
--- a/app.js
+++ b/app.js
@@ -7,7 +7,7 @@ let canvasHeight;
let canvasWidth;
let canvasCounter = 0;
-let slider = document.getElementById("slider");
+const slider = document.getElementById("slider");
let intervalValue = document.getElementById("intervalValue");
intervalValue.innerText = slider.value;
slider.oninput = function () { intervalValue.innerText = this.value; };
@@ -15,18 +15,29 @@ slider.oninput = function () { intervalValue.innerText = this.value; };
let slidesCounter = document.getElementById("slides");
function deleteSlide(e) {
- e.parentNode.parentNode.removeChild(e.parentNode);
+ e.parentNode.parentNode.parentNode.removeChild(e.parentNode.parentNode);
canvasCounter = canvasCounter - 1;
slidesCounter.innerText = canvasCounter;
}
function addCanvas() {
let wrapper = document.getElementById("wrapper");
- const lineBreak = document.createElement("br");
+
+ const gridContainer = document.createElement("div");
+ gridContainer.className = "grid-container";
+
const canvasContainer = document.createElement("div");
- const deleteSpan = document.createElement("button");
- deleteSpan.onclick = function () { deleteSlide(this); };
- deleteSpan.innerText = "Delete";
+ canvasContainer.className = "grid-item";
+ gridContainer.appendChild(canvasContainer);
+
+ const buttonContainer = document.createElement("div");
+ buttonContainer.className = "grid-item";
+ gridContainer.appendChild(buttonContainer);
+
+ const deleteButton = document.createElement("button");
+ deleteButton.onclick = function () { deleteSlide(this); };
+ deleteButton.innerText = "Delete";
+ buttonContainer.appendChild(deleteButton);
canvasCounter += 1;
let animationContainer = document.getElementById("animationContainer");
@@ -35,39 +46,58 @@ function addCanvas() {
}
let slidesContainer = document.getElementById("slidesContainer");
slidesContainer.style.display = "unset";
+ slidesContainer.appendChild(gridContainer);
slidesCounter.innerText = canvasCounter;
html2canvas(wrapper).then(function (canvas) {
canvasHeight = canvas.height;
canvasWidth = canvas.width;
canvasContainer.appendChild(canvas);
- canvasContainer.appendChild(deleteSpan);
- slidesContainer.appendChild(canvasContainer);
- slidesContainer.appendChild(lineBreak);
});
}
function mergeCanvases() {
- let encoder = new GIFEncoder();
- encoder.setRepeat(0);
- encoder.setDelay(slider.value);
- let canvases = document.getElementsByTagName("canvas");
+ let gifEncoder = new GIFEncoder();
+ let videoWriter = new WebMWriter({
+ quality: 0.95,
+ frameDuration: slider.value,
+ });
+
+ gifEncoder.setRepeat(0);
+ gifEncoder.setDelay(slider.value);
+ gifEncoder.setSize(canvasWidth, canvasHeight);
+ gifEncoder.start();
- encoder.setSize(canvasWidth, canvasHeight);
- encoder.start();
+ let canvases = document.getElementsByTagName("canvas");
for (let canvas of canvases) {
let context = canvas.getContext("2d");
- encoder.addFrame(context);
+ gifEncoder.addFrame(context);
+ videoWriter.addFrame(canvas);
}
- encoder.finish();
+ finalizeGif(gifEncoder);
+ finalizeVideo(videoWriter);
+}
+
+function finalizeGif(gifEncoder) {
+ gifEncoder.finish();
let gifAnimation = document.getElementById("gifAnimation");
- gifAnimation.src = "data:image/gif;base64," + encode64(encoder.stream().getData());
+ gifAnimation.src = "data:image/gif;base64," + encode64(gifEncoder.stream().getData());
gifAnimation.width = canvasWidth;
gifAnimation.height = canvasHeight;
let gifAnimationContainer = document.getElementById("gifAnimationContainer");
gifAnimationContainer.style.display = "unset";
+ document.getElementById('gifSize').innerHTML = "~" + Math.ceil(gifAnimation.src.length / 1300) + "kB";
+}
+
+function finalizeVideo(videoWriter) {
+ videoWriter.complete().then(function (webMBlob) {
+ let url = (window.webkitURL || window.URL).createObjectURL(webMBlob);
+ document.getElementById('video').src = url;
+ document.getElementById('downloadVideo').href = url;
+ document.getElementById('videoSize').innerHTML = "~" + Math.ceil(webMBlob.size / 1024) + "kB";
+ });
}
function shiftLine() {
@@ -173,4 +203,4 @@ const fontSize4 = document.querySelector("#fontSize4");
fontSize4.oninput = function () {
let line = document.getElementById("tr4");
line.style.fontSize = fontSize4.value + "px";
-};
\ No newline at end of file
+};
diff --git a/index.html b/index.html
index 048a65f..ac1c52e 100644
--- a/index.html
+++ b/index.html
@@ -17,8 +17,8 @@
PIDasGIF
You can edit this table
-
-
+
+
@@ -47,8 +47,8 @@ You can edit this table
+
-
Departure |
@@ -127,13 +127,30 @@ You can edit this table
Animation Result
-
![]()
-
+
+
+
![]()
+
+
+
+
+
+
+
Slides:
+
@@ -151,8 +168,9 @@
Slides:
+