2014-01-29 8 views
5

Wie der Titel sagt, habe ich eine Byte-Array für den Inhalt eines Bildes (kann jpeg oder png sein).Wie zeichne ein Bild auf der Leinwand von einem Byte-Array in JPEG-oder PNG-Format

ich, dass auf einer regulären Leinwand Objekt

<canvas id='thecanvas'></canvas> 

Wie kann ich das tun zeichnen wollen?


UPDATE ich versuchte, diese (unsuccesfully): (imgData ein PNG als Byte-Array gesendet wird, durch WebSockify an den Client "wie sie ist")

function draw(imgData) { 
    "use strict"; 

    var canvas = document.getElementById("myCanvas"); 
    var ctx = canvas.getContext("2d"); 
    var rdr = new FileReader(); 
    var imgBlob = new Blob([imgData], {type: "image/png"}); 
    rdr.readAsBinaryString(imgBlob); 

    rdr.onload = function (data) { 
     console.log("Filereader success"); 
     var img = new Image(); 
     img.onload = function() { 
      console.log("Image Onload"); 
      ctx.drawImage(img, 0, 0, canvas.width, canvas.height); 
     }; 
     img.onerror = function (stuff) { 
      console.log("Img Onerror:", stuff); 
     }; 
     img.src = "data:image/png;base64," + window.btoa(rdr.result); 
    }; 

} 

I immer img.onerror()

erreichen

Auch Nach dem Lesen der Datei mit einem HEX-Editor auf meinem Dateisystem kann ich sehen, dass das Byte-Array identisch mit der ursprünglichen Datei ist.

+0

Sie dies gesehen haben: http://stackoverflow.com/questions/12041851/converting-bytes-to-an-image-for-drawing-on-a-html5- Leinwand ? –

+0

@HaunsTM Nein! Vielen Dank. Ich untersuche das. Wenn das mein Problem löst, lösche ich die Frage – Ben

+0

Sie müssen uns ein wenig darüber erzählen, in welchem ​​Format Ihr Byte-Array ist: Ist es rohe Pixel und in diesem Fall, wie sind sie bestellt (RGB, RGBA, BGR etc.), wenn nicht, stellen sie ein kodiertes Bild dar und wenn ja, welche Kodierung (Base-64, Roh-komprimiertes JPEG/PNG)? – K3N

Antwort

5

Dieses Werk:

function draw2(imgData, coords) { 
    "use strict"; 
    var canvas = document.getElementById("myCanvas"); 
    var ctx = canvas.getContext("2d"); 

    //var uInt8Array = new Uint8Array(imgData); 
    var uInt8Array = imgData; 
    var i = uInt8Array.length; 
    var binaryString = [i]; 
    while (i--) { 
     binaryString[i] = String.fromCharCode(uInt8Array[i]); 
    } 
    var data = binaryString.join(''); 

    var base64 = window.btoa(data); 

    var img = new Image(); 
    img.src = "data:image/png;base64," + base64; 
    img.onload = function() { 
     console.log("Image Onload"); 
     ctx.drawImage(img, coords[0], coords[1], canvas.width, canvas.height); 
    }; 
    img.onerror = function (stuff) { 
     console.log("Img Onerror:", stuff); 
    }; 

} 
+0

Das funktioniert tatsächlich, aber was ist, wenn ich die Proportionen vom Originalbild beibehalten möchte? – Gera4463

+0

Fertig, können Sie die IMG messen und die Mathematik, Danke – Gera4463

+0

Ich entfernte die Breite/Höhe Attrs aus Leinwand und legte sie in der Onload-Methode vor dem Zeichnen des Bildes und skalierte das Bild richtig von 300x150 auf 640x480. Anfänglich wurde das Bild nur in 300x150 angezeigt, obwohl der Browser es für 640x480 hielt .: image.onload = function() { canvas.width = image.width; canvas.height = image.height; context.drawImage (image, 0,0, canvas.width, canvas.height); – Bob