Created
January 28, 2025 20:01
-
-
Save incubated-geek-cc/6fb555f5780cab6b9aa6532150b66934 to your computer and use it in GitHub Desktop.
Demo ImageTracer JavaScript plugin (https://github.com/jankovicsandras/imagetracerjs) built-in function imageToSVG: ƒ( url, callback, options ).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang='en'> | |
<head> | |
<meta charset='UTF-8'> | |
<meta name='viewport' content='width=device-width,initial-scale=1.0'> | |
<title>Demo PNG to SVG</title> | |
<style> | |
html,body { | |
padding:0; | |
margin:0; | |
} | |
body { | |
font-family:Segoe UI Symbol; | |
height:100vh; | |
width:100vw; | |
padding: 2.5em 1.5em; | |
overflow:hidden; | |
} | |
.btn { | |
cursor: pointer; | |
background: #dddddd; | |
padding: .25rem .75rem; | |
border-radius: 25px; | |
margin: 10px; | |
display: inline-block; | |
} | |
#svgPreview, #imageDisplay { | |
border: 1px dashed #6c757d; | |
margin: 0 auto; | |
display: inline-flex; | |
overflow:auto; | |
height:250px; | |
width:250px; | |
} | |
</style> | |
</head> | |
<body> | |
<noscript>You need to enable JavaScript to run this app.</noscript> | |
<header> | |
<label class='btn'> | |
📤 𝗨𝗽𝗹𝗼𝗮𝗱 𝗙𝗶𝗹𝗲 | |
<input type='file' hidden id='uploadPNG' /> | |
</label> | |
</header> | |
<main> | |
<h2>𝖨𝗆𝖺𝗀𝖾 𝖣𝗂𝗌𝗉𝗅𝖺𝗒</h2> | |
<div id='imageDisplay'></div> | |
<h2>𝖲𝖵𝖦 𝖯𝗋𝖾𝗏𝗂𝖾𝗐</h2> | |
<div id='svgPreview'></div> | |
</main> | |
<script src="imagetracer_v1.2.6.js"></script> | |
<script> | |
document.addEventListener('DOMContentLoaded', async()=> { | |
// upload file interface | |
const uploadPNG=document.querySelector('#uploadPNG'); | |
// Displays uploaded raster image | |
const imageDisplay=document.querySelector('#imageDisplay'); | |
// Renders output SVG | |
const svgPreview=document.querySelector('#svgPreview'); | |
// Helper functions | |
function readFileAsDataURL(file) { | |
return new Promise((resolve,reject) => { | |
let fileredr = new FileReader(); | |
fileredr.onload = () => resolve(fileredr.result); | |
fileredr.onerror = () => reject(fileredr); | |
fileredr.readAsDataURL(file); | |
}); | |
} | |
const loadImage = (url) => new Promise((resolve, reject) => { | |
const img = new Image(); | |
img.addEventListener('load', () => resolve(img)); | |
img.addEventListener('error', (err) => reject(err)); | |
img.src = url; | |
}); | |
uploadPNG.addEventListener('click', (evt)=> { | |
evt.target.value=''; | |
}); | |
uploadPNG.addEventListener('change', async(evt) => { | |
if (!window.FileReader) { | |
alert('Browser does not support HTML5 "FileReader".'); | |
return; | |
} | |
let file = evt.target.files[0]; | |
if(!file) return; | |
let b64Str = await readFileAsDataURL(file); | |
// Preview image | |
let _img=await loadImage(b64Str); | |
imageDisplay.appendChild(_img); | |
// 1) Using function imageToSVG (async) | |
const svgOutput = (url) => new Promise((resolve) => ImageTracer.imageToSVG(url, resolve)); | |
let svgStr = await svgOutput(b64Str); | |
svgPreview.innerHTML=svgStr; | |
// Generate download link | |
let dwnlnk=document.createElement('a'); | |
dwnlnk.innerHTML='📥 Download File'; | |
let textblob = new Blob([svgStr], { | |
type: 'image/svg+xml' | |
}); | |
dwnlnk.download = `${ (file.name).substr(0,(file.name).length-4) }.svg`; | |
dwnlnk.className='btn'; | |
if (window.webkitURL != null) { | |
dwnlnk.href = window.webkitURL.createObjectURL(textblob); | |
} | |
svgPreview.parentNode.appendChild(dwnlnk); | |
}); | |
}); | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment