Lesen binärer Daten aus einem Bild und speichern Sie es mit JavaScript
Ich Lesen möchte, werden die binären Daten des Bildes und dann speichern Sie es wieder auf meine lokale Festplatte mit JavaScript.
Schrieb ich eine kleine demo, die zeigt das use-case. Zum Lesen der Datei benutze ich readAsBinaryString aus der File-Reader-API (HTML5), um die binären Daten.
Schreibe ich den Binär-string in einem textfield-Objekt, aus dem ich Lesen Sie dann die Daten erneut zu schreiben, in eine Datei. Wenn ich die Datei speichern meiner Bilder (getestet habe ich mehrere JPEG-Dateien) sind gebrochen, so dass Sie nichts sehen, nützlich.
Kann es sein, dass "readAsBinaryString" macht eine Bekehrung, die macht die binäre Daten falsch?
Haben Sie einen Blick auf meine demo-Anwendung, die ich gemacht Geige. Der Haupt-Teil beginnt hier:
reader.readAsBinaryString(file);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe getestet dieses code auf Ihrer fiddle und es hat funktioniert wie ein Charme:
Ich bin kein Experte auf dem neuen
HTML5 APIs
, aber ich werde versuchen zu erklären, etwas, was ich getan habe.1) ich habe gespart
PNG
auf der Festplatte. (Foto.png)2) Wenn Sie Linux haben, können Sie sehen den Inhalt der Datei in hexadezimal-format mit diesem Befehl
od -cx photo.png
. Wenn nicht, müssen Sie einige hexadezimal-editor.Den ersten Zeilen von Foto.png-Datei im hexadezimal-show so etwas wie dieses:
Jedes paar von zahlen in der zweiten Zeile stellen die hexadezimale Kodierung das symbol oben: 5089 ist die Kodifizierung der 211 S., 50 ist der hex-Wert für P und 89 für 211 (little-endian-Kodifizierung, die ersten zwei bytes kodiert, das zweite symbol, die letzten zwei kodiert, das erste symbol)
3) Anstelle der Lesen Sie die Datei als
binaryString
lese ich es als eineArrayBuffer
(es macht nicht die Kodierung Konvertierungen).4), Wenn die Datei gelesen wird, gestalte ich die
ArrayBuffer
in eineUint16Array
, und speichern Sie jeden Wert in einem array zu zeigen, decimal-Wert auf Ihre text-Bereich. Es zeigt die Werte als eine Liste von Dezimalzahlen, getrennt durch ein Komma.Die erste Dezimalzahl wird in diesem Fall 20617, die die dezimale Entsprechung für das 5089 hexadezimal.
5) Vor dem speichern der Datei, einige einfache code teilt die dezimal-Werte und fügen Sie Sie eine neue
Uint16Array
.Es funktionierte für mich... Es ist ein bisschen verwirrend und vermutlich auch jemand eine bessere & effizienter Umgang mit den APIs in einer anderen Art und Weise.