2016-08-05 37 views
2

Ich habe ein Canvas-Element CA, wo ich einige ausgefallene Sachen aufzeichnen. Dann starte ich einen Filter über die ImageData IDA von Canvas CA und erstelle neue, modifizierte ImageData . Jetzt möchte ich, dass in eine Base64-Zeichenfolge ohne die Notwendigkeit eines zweiten Helfer-CanvasCB konvertiert werden kann.Erstellen von Base64-Daten aus HTML-Canvas ImageData ohne Canvas Element

Alles, was ich zu diesem Thema gefunden habe, zeigt eine ganze Leinwand, die in eine DatenURL umgewandelt wird. Ist es möglich ohne CB? Wie?

var CA = document.getElementById("CA"); 
 
var ctx = CA.getContext("2d"); 
 

 
ctx.beginPath(); 
 
ctx.fillRect(100, 100, 100, 100); 
 
ctx.stroke(); 
 
ctx.closePath(); 
 

 
var srcImg = ctx.getImageData(0, 0, CA.width, CA.height), 
 
    srcData = srcImg.data, 
 
    dstImg = ctx.createImageData(srcImg), 
 
    dstData = dstImg.data; 
 

 
for (var i=0, maxI=srcData.length; i<maxI; i+=4) { 
 
    //invert 
 
    if (srcData[i+3] > 0) {  
 
    dstData[i] = dstData[i+1] = dstData[i+2] = 255; 
 
    dstData[i+3] = 0; 
 
    } 
 
    else { 
 
    dstData[i] = dstData[i+1] = dstData[i+2] = 0;   
 
    dstData[i+3] = 255; 
 
    } 
 
} 
 

 
//how to create base64 from dstImg?? 
 
//... 
 

 
//just for visualization 
 
document.getElementById("CB").getContext("2d").putImageData(dstImg, 0, 0);
canvas { 
 
    border : 1px solid; 
 
}
<canvas id="CA" width="400" height="300"></canvas> 
 
<!-- I'd like to avoid this helper canvas CB --> 
 
<canvas id="CB" width="400" height="300"></canvas>

+1

Sie das Original '' Element klonen könnte, rufen '.clearRect() ',' .putImageData() ', 'clone.toDataURL()' – guest271314

+0

@ guest271314: Hey, danke für deine Hilfe. Das funktioniert in der Tat gut. Ich benutze 'CA.cloneNode (false);' dafür. Wenn du eine Antwort erstellen könntest, akzeptiere ich sie :) – Fidel90

Antwort

2

Sie könnten das Original <canvas> Element klonen, .putImageData(), clone.toDataURL()

var CA = document.getElementById("CA"); 
 
var ctx = CA.getContext("2d"); 
 

 
ctx.beginPath(); 
 
ctx.fillRect(100, 100, 100, 100); 
 
ctx.stroke(); 
 
ctx.closePath(); 
 

 
var srcImg = ctx.getImageData(0, 0, CA.width, CA.height), 
 
    srcData = srcImg.data, 
 
    dstImg = ctx.createImageData(srcImg), 
 
    dstData = dstImg.data; 
 

 
for (var i = 0, maxI = srcData.length; i < maxI; i += 4) { 
 
    //invert 
 
    if (srcData[i + 3] > 0) { 
 
    dstData[i] = dstData[i + 1] = dstData[i + 2] = 255; 
 
    dstData[i + 3] = 0; 
 
    } else { 
 
    dstData[i] = dstData[i + 1] = dstData[i + 2] = 0; 
 
    dstData[i + 3] = 255; 
 
    } 
 
} 
 

 
var clone = document.getElementById("CA").cloneNode(); 
 
var ctx = clone.getContext("2d"); 
 
ctx.putImageData(dstImg, 0, 0); 
 
var url = clone.toDataURL(); 
 
var img = document.createElement("img"); 
 
img.onload = function() { 
 
    document.body.appendChild(this); 
 
    console.log(url); 
 
} 
 
img.src = url;
canvas { 
 
    border: 1px solid; 
 
}
<canvas id="CA" width="400" height="300"></canvas>

+0

Toll, danke :) – Fidel90

+1

Btw: Wird 'clearRect()' wirklich benötigt oder ersetzt 'putImageData() 'den gesamten Inhalt, wie ich es erwarten würde? – Fidel90

+0

@ Fidel90 Ja, Sie sind richtig, siehe aktualisierten Beitrag. – guest271314