This repository has been archived on 2023-03-25. You can view files and clone it, but cannot push or open issues or pull requests.
mightyscape-1.1-deprecated/extensions/fablabchemnitz/fablabchemnitz_imagetracerjs/imagetracerjs-master/imagetracer_test_automation.html
2020-08-30 12:36:33 +02:00

334 lines
12 KiB
HTML

<!DOCTYPE html>
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<title>imagetracer.js test automation</title>
<style>
.imgcontainer{
background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAIklEQVQImWPQ1tb+r62t/d/f3/+/v7//fwYMARgDJoEhAACRARthAfQS8AAAAABJRU5ErkJggg==) repeat;
border: solid 1px cyan;
}
table{ border: solid 1px gray; border-collapse:collapse; }
td{ border: solid 1px gray; vertical-align:top; }
th{ border: solid 1px gray; }
</style>
<script src="imagetracer_v1.2.6.js"></script>
<script>
var queue;
var stats = [], tt, rt;
var timeoutid = 0, timeoutwait = 500, drawmode = false, rowid = 1, repeatnum = 1, totaltime;
function log(msg){ console.log(msg); }
function startprocess(){
if(!timeoutid){
log('starting');
var filenames = [];
// Drawmode
if(document.getElementById('cbox0').checked){ drawmode = true; }else{ drawmode = false; }
// Selected images
for(var i=1; i<17; i++){ if(document.getElementById('icb'+i).checked){ filenames.push("testimages/"+i+".png"); } }
// Repeats
repeatnum = 1;
try{ repeatnum = parseInt(email = document.getElementById('repeatinput').value); }catch(e){log(e);}
// Options
var optionses = [], ks = Object.keys(ImageTracer.optionpresets);
for(var i=0; i<ks.length; i++){
if(document.getElementById('ocb'+i).checked){ optionses.push(ImageTracer.optionpresets[ks[i]]); }
}
/*if(document.getElementById('ocb1').checked){ optionses.push({}); }
if(document.getElementById('ocb2').checked){ optionses.push({ blurradius:2, ltres:0.1, numberofcolors:64 }); }
if(document.getElementById('ocb3').checked){ optionses.push({ strokewidth:4, blurradius:5, roundcoords:0, desc:false, scale:4, }); }
*/
if(document.getElementById('ocbx').checked){
try{
optionses.push( JSON.parse( document.getElementById('custom1input').value ) );
}catch(e){ log(e); }
}
if(document.getElementById('ocby').checked){
try{
optionses.push( JSON.parse( document.getElementById('custom2input').value ) );
}catch(e){ log(e); }
}
// Queue
queue = [];
for(var k=0; k<repeatnum; k++){
for(var i=0; i<filenames.length; i++){
for(var j=0; j<optionses.length; j++){
queue.push([filenames[i],optionses[j]]);
}
}
}
// Processing
totaltime = Date.now();
processqueue();
}
}// End of startprocess()
function processqueue(){
var item = queue.shift();
if(item){
log('file '+item[0]);
ImageTracer.loadImage(item[0],
function(canvas){
// Start tracing timer
tt = Date.now();
var tracedata = ImageTracer.imagedataToTracedata( ImageTracer.getImgdata(canvas), item[1] );
// Stop tracing timer
tt = Date.now() - tt;
// Start rendering timer
rt = Date.now();
// Render
var svgstr = ImageTracer.getsvgstring(tracedata, item[1]);
// Stop rendering timer
rt = Date.now() - rt;
// Counting paths
var pcont = 0;
for(k in tracedata.layers) {
if(!tracedata.layers.hasOwnProperty(k)){ continue; }
pcont += tracedata.layers[k].length;
}
////////////////
// Draw SVG
if(drawmode){
document.getElementById('svgcontainer').innerHTML = '';
ImageTracer.appendSVGString(svgstr,'svgcontainer');
// Draw diff
// draw original
var oc = document.getElementById('originalcanvas'); oc.innerHTML = '';
oc.width = canvas.width;
oc.height = canvas.height;
var ctx = oc.getContext('2d');
var oimgd = ImageTracer.getImgdata(canvas);
ctx.putImageData(oimgd,0,0);
// draw new
backtopng(svgstr,
function(imgd){
// draw diff
var dc = document.getElementById('diffcanvas'); dc.innerHTML = '';
dc.width = imgd.width;
dc.height = imgd.height;
var dctx = dc.getContext('2d');
var idx = 0, d = 0;
var rgbadiff=0, pixeldiff=0, thisdiff=0;
// Calculating RGBA diff
var dimgd = dctx.createImageData(imgd.width,imgd.height);
for(var j=0; j<imgd.height; j++){
for(var i=0; i<imgd.width; i++){
idx = (j*imgd.width + i) * 4;
dimgd.data[idx ] = Math.abs( oimgd.data[idx ] - imgd.data[idx ] );
dimgd.data[idx+1] = Math.abs( oimgd.data[idx+1] - imgd.data[idx+1] );
dimgd.data[idx+2] = Math.abs( oimgd.data[idx+2] - imgd.data[idx+2] );
dimgd.data[idx+3] = Math.abs( oimgd.data[idx+3] - imgd.data[idx+3] );
thisdiff = dimgd.data[idx ] + dimgd.data[idx+1] + dimgd.data[idx+2] + dimgd.data[idx+3];
if(thisdiff === 0 ){ dimgd.data[idx+3] = 0; }else{ dimgd.data[idx+3] = 255; pixeldiff++; }
rgbadiff += thisdiff;
}
}
dctx.putImageData( dimgd, 0, 0 );
// Registerstats
registerstats(
item[0],
tracedata.width,
tracedata.height,
(tracedata.width*tracedata.height),
svgstr.length,
tt,
rt,
pcont,
rgbadiff / ( tracedata.width * tracedata.height * 4 ),
Math.floor(pixeldiff*100 / ( tracedata.width * tracedata.height )),
JSON.stringify(item[1])
);
// Next item
timeoutid = setTimeout( processqueue, timeoutwait );
}
);
}else{// No drawmode
// Registerstats
registerstats(
item[0],
tracedata.width,
tracedata.height,
(tracedata.width*tracedata.height),
svgstr.length,
tt,
rt,
pcont,
'n/a',
'n/a',
JSON.stringify(item[1])
);
// Next item
timeoutid = setTimeout( processqueue, timeoutwait );
}// End of drawmode check
}// End of loadImage() callback
);// End of loadImage()
}else{// No more images to process
stopprocessing();
//document.getElementById('logdiv').innerHTML += JSON.stringify(stats);
}// End of item check
}// End of processqueue()
function stopprocessing(){
clearTimeout(timeoutid); timeoutid = 0;
totaltime = Date.now() - totaltime;
alert('Time elapsed: '+totaltime+' ms.');
}
function registerstats(filename,w,h,area,svglength,tracetime,rendertime,pathcnt,rgbadiff,pixeldiff,options){
var tableref = document.getElementById('logtable');
var newrow = tableref.insertRow(-1);
newrow.innerHTML =
'<td>'+rowid+'</td>'+
'<td>'+filename+'</td>'+
'<td>'+w+'</td>'+
'<td>'+h+'</td>'+
'<td>'+area+'</td>'+
'<td>'+svglength+'</td>'+
'<td>'+tracetime+'</td>'+
'<td>'+rendertime+'</td>'+
'<td>'+pathcnt+'</td>'+
'<td>'+rgbadiff+'</td>'+
'<td>'+pixeldiff+'</td>'+
'<td>'+options+'</td>';
rowid++;
}
function backtopng(svgstr,callback){
var nc = document.getElementById('newcanvas'); nc.innerHTML = '';
var img = document.createElement('img');
img.onload = function(){
nc.width=img.width;
nc.height=img.height;
var ctx = nc.getContext('2d');
ctx.drawImage( img, 0, 0 );
callback(ImageTracer.getImgdata(nc));
};
img.setAttribute('src','data:image/svg+xml;base64,'+btoa(svgstr));
}
function onload_init(){
var k = Object.keys(ImageTracer.optionpresets), s='';
for(var i=0; i<k.length; i++){
s += '<label><input type="checkbox" id="ocb'+i+'" value="1" '+(i<6?'checked="true"':'')+' ><b>'+k[i]+'</b> : '+JSON.stringify(ImageTracer.optionpresets[k[i]])+'</label><br/>';
}
document.getElementById('ocbcontainer').innerHTML = s;
}
</script>
</head>
<body style="background-color:rgb(32,32,32);color:rgb(255,255,255);font-family:monospace;" onload="onload_init()" >
<noscript style="background-color:rgb(255,0,0);color:rgb(255,255,255);font-size: 250%;">Please enable JavaScript!</noscript>
<form id="testcontroller">
<h1>Test images</h1>
<table id="itable">
<tbody>
<tr>
<td><label><input type="checkbox" id="icb1" value="1" checked="true">1.png</label><br><img src="testimages/1.png"></td>
<td><label><input type="checkbox" id="icb2" value="1" checked="true" >2.png</label><br><img src="testimages/2.png"></td>
<td><label><input type="checkbox" id="icb3" value="1" checked="true" >3.png</label><br><img src="testimages/3.png"></td>
<td><label><input type="checkbox" id="icb4" value="1" checked="true" >4.png</label><br><img src="testimages/4.png"></td>
</tr>
<tr>
<td><label><input type="checkbox" id="icb5" value="1" checked="true" >5.png</label><br><img src="testimages/5.png"></td>
<td><label><input type="checkbox" id="icb6" value="1" checked="true" >6.png</label><br><img src="testimages/6.png"></td>
<td><label><input type="checkbox" id="icb7" value="1" checked="true" >7.png</label><br><img src="testimages/7.png"></td>
<td><label><input type="checkbox" id="icb8" value="1" checked="true" >8.png</label><br><img src="testimages/8.png"></td>
</tr>
<tr>
<td><label><input type="checkbox" id="icb9" value="1" checked="true" >9.png</label><br><img src="testimages/9.png"></td>
<td><label><input type="checkbox" id="icb10" value="1" checked="true" >10.png</label><br><img src="testimages/10.png"></td>
<td><label><input type="checkbox" id="icb11" value="1" checked="true" >11.png</label><br><img src="testimages/11.png"></td>
<td><label><input type="checkbox" id="icb12" value="1" checked="true" >12.png</label><br><img src="testimages/12.png"></td>
</tr>
<tr>
<td><label><input type="checkbox" id="icb13" value="1" checked="true" >13.png</label><br><img src="testimages/13.png"></td>
<td><label><input type="checkbox" id="icb14" value="1" checked="true" >14.png</label><br><img src="testimages/14.png"></td>
<td><label><input type="checkbox" id="icb15" value="1" checked="true" >15.png</label><br><img src="testimages/15.png"></td>
<td><label><input type="checkbox" id="icb16" value="1" checked="true" >16.png</label><br><img src="testimages/16.png"></td>
</tr>
</tbody>
</table>
<h1>Settings</h1>
<label><input type="checkbox" id="cbox0" value="1" checked="true">Draw SVG</label><br>
<div id="ocbcontainer"></div>
<label><input type="checkbox" id="ocbx" value="1" >Custom Options 1:</label><input type="text" id="custom1input" value="" style="width:40em" ><br>
<label><input type="checkbox" id="ocby" value="1" >Custom Options 2:</label><input type="text" id="custom2input" value="" style="width:40em" ><br>
Example Custom Options:<br>{"ltres":1,"qtres":1,"pathomit":8,"colorsampling":true,"numberofcolors":16,"mincolorratio":0.02,"colorquantcycles":3,"scale":1,"simplifytolerance":0,"roundcoords":1,"lcpr":0,"qcpr":0,"desc":true,"viewbox":false,"blurradius":0,"blurdelta":20}<br>
<label><input type="text" id="repeatinput" value="1">Repeats</label><br>
<button id="startbutton" type="button" onclick="startprocess()" >START</button>
<button id="stopbutton" type="button" onclick="stopprocessing()" >STOP</button>
</form>
<h1>Result (if Draw SVG is active)</h1>
<table id="itable">
<thead>
<tr><th>Traced SVG</th><th>Original raster</th><th>SVG rendered as raster</th><th>Difference</th></tr>
</thead>
<tbody>
<tr>
<td><div id="svgcontainer" class="imgcontainer"></div></td>
<td><canvas id="originalcanvas" class="imgcontainer"></canvas></td>
<td><canvas id="newcanvas" class="imgcontainer"></canvas></td>
<td><canvas id="diffcanvas" class="imgcontainer"></canvas></td>
</tr>
</tbody>
</table>
<h1>Measurements</h1>
<div id="logdiv">
<table id="logtable">
<thead>
<tr>
<th>RowID</th>
<th>Filename</th>
<th>width (pixels)</th>
<th>height (pixels)</th>
<th>area (pixels)</th>
<th>SVG string length (bytes)</th>
<th>Tracing time (ms)</th>
<th>Rendering time (ms)</th>
<th>Nr. of paths</th>
<th>RGBA difference (cummulative RGBA difference / (area*4))</th>
<th>Different pixels (%)</th>
<th>Options</th>
</tr>
</thead>
<tbody id="logtbody">
</tbody>
</table>
</div>
</body></html>