Lire des données binaires à partir d'une image et l'enregistrer avec JavaScript
Je veux lire les données binaires de l'image et de l'enregistrer puis de nouveau à mon disque local avec JavaScript.
J'ai écrit une petite démo qui montre que ce cas d'utilisation. Pour lire le fichier que j'ai utiliser readAsBinaryString de la Lecteur de Fichier API (HTML5) pour obtenir les données binaires.
J'écris la chaîne binaire dans un champ de texte à partir de laquelle je puis lisez à nouveau les données à écrire dans un fichier. Si j'ai enregistrer le fichier mes images (j'ai testé plusieurs fichiers Jpeg) sont cassés donc vous ne pouvez pas voir quelque chose d'utile.
Peut-il que "readAsBinaryString" fait une conversion qui rend les données binaires incorrect?
Pour avoir un coup d'oeil à ma version de démonstration de l'application, j'ai fait un violon. La partie principale commence ici:
reader.readAsBinaryString(file);
OriginalL'auteur Benny Neugebauer | 2014-02-01
Vous devez vous connecter pour publier un commentaire.
J'ai testé ce code sur votre violon et cela a fonctionné comme un charme:
Je ne suis pas un expert sur le nouveau
HTML5 APIs
, mais je vais essayer d'expliquer un peu ce que j'ai fait.1) j'ai sauvé un
PNG
sur le disque. (photo.png)2) Si vous avez Linux, vous pouvez voir le contenu du fichier au format hexadécimal avec cette commande
od -cx photo.png
. Si non vous avez besoin d'un éditeur hexadécimal.Les premières lignes de la photo.png en hexadécimal montrer quelque chose comme ceci:
Chaque paire de nombres de la deuxième ligne représentent le code hexadécimal de la codification du symbole ci-dessus: 5089 est la codification de 211 P, 50 est la valeur hexadécimale de P et 89 211 (petit-boutiste de la codification, les deux premiers octets de code pour le deuxième symbole, les deux derniers code pour le premier symbole)
3) au Lieu de lire le fichier comme un
binaryString
, je l'ai lu comme unArrayBuffer
(ça n'a pas de conversions de codage).4) Lorsque le fichier est lu, je transforme le
ArrayBuffer
dans unUint16Array
, et de stocker chaque valeur dans un tableau pour montrer sa valeur décimale sur votre zone de texte. Il montre les valeurs d'une liste de nombres décimaux séparés par des virgules.Le premier nombre décimal sera dans ce cas sera 20617, qui est l'équivalent décimal de la 5089 hexadécimal.
5) Avant d'enregistrer le fichier, un code simple divise les valeurs décimales et les ajouter à une nouvelle
Uint16Array
.Il a travaillé pour moi... C'est un peu déroutant et probablement quelqu'un aura une meilleure & approche plus efficace à l'aide de l'Api d'une autre manière.
Que Violon corrompt mon image sur enregistrer. Ceci est-il toujours travailler pour vous?
Je suis désolé Christian, je n'ai pas vu votre question, jusqu'à il y a quelques jours. Si vous regardez Benny le violon, vous verrez qu'il a un autre code js de celui que j'ai proposé. Si vous utilisez ce violon jsfiddle.net/ocqu253m/1 j'espère que vous trouverez cela fonctionne bien. Désolé c'est un peu tard 🙂
OriginalL'auteur dbermudez