2014-02-27 13 views
5

Ich habe ein PNG-Objekt, das ich mit node-png erstellt habe, und entsprechend der Dokumentation ist es ein "readable and writable Stream".nodejs: konvertiere pngjs stream in base64

Ich möchte das PNG-Objekt zu base64 konvertieren und es über socket.io an den Client senden, wo ich die Zeichenfolge in ein Bild src platzieren.

Ich habe viele Dinge ausprobiert, aber es scheint, dass es nicht trivial ist, einen Stream in eine Zeichenfolge zu konvertieren.

Wie kann ich das erreichen?

Beachten Sie, dass die Daten im Knoten und nicht im Dateisystem erstellt werden.

Danke!

Antwort

11

Danke für die Hilfe. Hier ist, was habe ich für zukünftige Leser (this helped too):

 png.pack(); 
     var chunks = []; 
     png.on('data', function(chunk) { 
      chunks.push(chunk); 
      console.log('chunk:', chunk.length); 
      }); 
     png.on('end', function() { 
       var result = Buffer.concat(chunks); 
       console.log('final result:', result.length); 
       io.sockets.emit('image', result.toString('base64')); 
      }); 
+2

erwähnenswert, dass die String-Verkettung anstelle des Drückens chunks Sie ungerade Ergebnisse gibt, wenn Sie w/Bilder, die speziell zu tun hat. Danke dafür! –

1

Sie wollen nicht, um den Strom in einen String, aber seine lesbaren Brocken konvertieren:

stream.on('readable', function() { 
    var string = stream.read().toString('base64'); 

    // send through websocket 
}); 

Sie können dies durch den Strom läuft für die kompletten Daten auch tun:

var data = ''; 

stream.on('readable', function() { 
    data += stream.read().toString('base64'); 
}); 
stream.on('end', function() { 
    console.log(data); 
}); 

Hängt wenn der Client das vollständige PNG-Bild benötigt, oder wenn es in Ordnung ist, einzelne Blöcke zu haben.

Wenn Sie jedoch interessiert sind, wie dies in einem praktischen Beispiel aussehen könnte (mit dem Bild von HTML5 Drag & Drop) können Sie messenger.