Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
collidingScopes authored Jul 17, 2024
1 parent 96acbef commit bfc4a7b
Show file tree
Hide file tree
Showing 2 changed files with 465 additions and 48 deletions.
145 changes: 117 additions & 28 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,28 +1,117 @@
<!doctype html>
<head>
<title>CANVAS TO VIDEO FAILS ON SAFARI</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<header>
<h1>CANVAS TO VIDEO FAILS ON SAFARI</h1>
<p>Record canvas to video</p>
<p>This example renders white noise in a <code>canvas</code> for three seconds and records the output in a video clip, using <code>canvas.captureStream</code> and <code>MediaRecorder</code></p>
</header>
<main class="row">
<figure>
<canvas id="canvas" width="800" height="800"></canvas><br>
<caption>This is a <code>canvas</code> element</caption>
</figure>
<!--
<figure>
<video id="video" controls loop></video><br>
<caption>This is a <code>video</code> element</caption>
</figure>
-->
<button id="recordButton">Record 10 second video</button>
<button id="downloadButton">Download video</button>
</main>
</body>
<script src="saveCanvas.js"></script>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="style.css">

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Permanent+Marker&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" integrity="sha512-9usAa10IRO0HhonpyAIVpjrylPvoDwiPUiKdWk5t3PyolY1cOd4DSE0Ga+ri4AuTroPR5aQvXU9xC6qOPnzFeg==" crossorigin="anonymous" referrerpolicy="no-referrer" />

<meta property="og:title" content="Colliding Scopes: kaleidoscope animations" />
<meta property="og:description" content="Turn photos into kaleidoscope animations" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://collidingscopes.github.io/" />
<meta property="og:image" content="https://collidingscopes.github.io/images/siteOGImage.png">
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="800" >
<meta property="og:image:height" content="800" >

<link rel="icon" href="images/siteFavicon2.png">
<link rel="apple-touch-icon" href="images/siteFavicon2.png">

</head>
<body>

<div id="coverScreen" class="hidden">
</div>

<div id="introDiv">
<span id="siteNameText">Colliding Scopes</span>
<span id="subtitleText">Turn photos into kaleidoscope animations</span>
</div>

<div id="toolDiv">

<canvas id="animation"></canvas>

<table id="inputTable">
<tr>
<td>
<label for="imageInput" class="custom-file-upload">
<i class="fa fa-cloud-upload"></i> Select Image
</label>
<input type="file" id="imageInput" accept="image/*">
</td>
<td>
<pre><span class="tableText">Animation Speed</span><br><input class="input-number-noSpinners" type="range" id="speedInput" value="4" min="1" max="10"></pre>
</td>
<td><button id="recordVideoButton" class="recordButton">Record Video (r)</button></td>
<td><span class="tableText">Seconds: </span><input type="number" id="videoDurationInput" class="input-number-noSpinners" value="10" min="1" max="120"></td>
<!--
<td><button id="pauseAnimationButton">Pause/Play (p)</button></td>
<td><button id="save-image-button">Screenshot (s)</button></td>
-->
</tr>

</table>


<div id="videoRecordingMessageDiv" class="hidden">
</div>
<button id="downloadButton" class="hidden">Download video</button>

<div id="imageContainer" class="hidden">
<img id="originalImg" src="images/HK400px.jpg">
</div>
<div id="newImageContainer" class="hidden">
<img id="flippedImg" src="images/HK400pxFlipped.jpg">
</div>

</div>


<div id="notesDiv">
<div id="textBox">

<h2 id="aboutText">About</h2>

<p>This web tool is completely free, open source, without any paywalls or premium options. You are welcome to use it for personal or commercial purposes.</p>
<p>If you found this tool useful, feel free to buy me a coffee. This would be much appreciated during late-night coding sessions!</p>

<a href="https://www.buymeacoffee.com/stereoDrift" target="_blank"><img src="https://www.buymeacoffee.com/assets/img/custom_images/yellow_img.png" alt="Buy Me A Coffee"></a>

<p>Enormous thanks and credits to Luke Hannam, whose <a href="https://www.pepperoni.blog/canvas-kaleidoscope/" target="_blank" rel="noopener">blog post</a> explained the code and mechanics for creating kaleidoscope animations in javascript.</p>
<p>I made only a few tweaks to Luke's original algorithm, with my main work being to add the front-end user interface allowing users to upload their own photos, control variables like animation speed, and easily export the canvas animation to video.</p>
<p>There are a few hotkeys which can speed up using the tool:</p>
<ul>
<li>Press <b>"r"</b> to start recording a video of the animation. You can specify the length of the video in seconds. An mp4 video file will be exported to your downloads folder afterwards</li>
<li>Press <b>"p"</b> to pause / play the animation. This lets you stop at an interesting point of the animation</li>
<li>Press <b>"s"</b> to save a screenshot of the current state of the animation (png image)</li>
</ul>
<p>This project is coded using Javascript, HTML, and CSS (see github repo linked below). Video creation and encoding is done using mp4 muxer.</p>
<p>I do not have access to any of the images that you upload here, as all processing is done "client-side" (i.e., <b>no images are saved or stored by me — they stay on your computer only</b>).</p>
<p>Feel free to reach out to discuss, ask questions, or to share your creations! The animations can be easily uploaded to instagram or otherwise -- you can tag me <a href="https://www.instagram.com/stereo.drift/" target="_blank" rel="noopener">@stereo.drift</a> :)</p>
</div>
</div>

<div id="linksDiv">
<table id="infoMenuTable">
<tr>
<td><button id="gitHubButton"class="socialMediaButton"><a href="https://github.com/collidingScopes/collidingScopes.github.io" target="_blank" rel="noopener"><i class="fa-brands fa-github"></i></a></button></td>
<td><button id="coffeeButton" class="socialMediaButton"><a href="https://www.buymeacoffee.com/stereoDrift" target="_blank" rel="noopener"><i class="fa-solid fa-heart"></i></a></button></td>
<td><button id="instagramButton" class="socialMediaButton"><a href="https://www.instagram.com/stereo.drift/" target="_blank" rel="noopener"><i class="fa-brands fa-instagram"></i></a></button></td>
<td><button id="emailButton" class="socialMediaButton"><a href="mailto:[email protected]" target="_blank" rel="noopener"><i class="fa-solid fa-envelope"></i></a></button></td>
</tr>
</table>
</div>


</body>

<script src="kaleidoscope.js"></script>
<script src="mp4-muxer-main/build/mp4-muxer.js"></script>

</html>
Loading

0 comments on commit bfc4a7b

Please sign in to comment.