Étant donné une page de navigateur existante avec des images, y a-t-il un moyen d'obtenir les octets d'un élément
en utilisant Javascript?
Je ne vois aucune méthode dans HTMLImageElement
qui permettrait d'obtenir un tableau d'octets à partir de l'image élément.
J'ai essayé l'approche suivante mais celle-ci renvoie un tableau d'octets vide.
var img = document.querySelector('.my_image'); var body = document.querySelector('body'); var canvas = document.createElement('canvas'); canvas.height = img.height; canvas.width = img.width; var context = canvas.getContext('2d'); context.drawImage(img, 0, 0); body.appendChild(canvas); var imageBytes = context.getImageData(img.width, img.height, 1, 1).data; console.log(imageBytes);
3 Réponses :
J'ai trouvé une autre contribution sur StackOverflow avec la même intention.
Voici le code pertinent:
var url; var canvas = document.createElement("canvas"); var img1=document.createElement("img"); function getBase64Image(){ url = document.getElementById("fileUpload").value; img1.setAttribute('src', url); canvas.width = img1.width; canvas.height = img1.height; var ctx = canvas.getContext("2d"); ctx.drawImage(img1, 0, 0); var dataURL = canvas.toDataURL("image/png"); alert("from getbase64 function"+dataURL ); return dataURL; }
Cette solution télécharge à nouveau l'image. Cela rendrait le code plus lisible si vous renommiez p
en url
.
Existe-t-il un moyen d'obtenir les octets d'un élément
en utilisant Javascript?
![]()
Pas vraiment, mais vous pouvez utiliser
fetch()
:(async () { const arrayBuffer = await (await fetch("img-url")).arrayBuffer(); })();Cela ne devrait pas retélécharger l'image car elle est toujours en cache.
Merci, cela fonctionne avec es5 js: fetch (img.src) .then (response => response.arrayBuffer ()). Then (buf => {console.log (buf);}); code >
Le code js suivant récupérera une image d'un élément
existant en tant que base64 sans re-télécharger l'image ( en supposant qu'il y a un image avec le sélecteur donné sur la page et qu'il n'y a pas de violation de cors de toile , ce qui sera le cas lorsque vous cliquerez sur le bouton Exécuter ci-dessous ):
<img src="http://placekitten.com/40/40">
var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); var img = document.querySelector('img'); canvas.height = img.naturalHeight; canvas.width = img.naturalWidth; context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight); var base64String = canvas.toDataURL(); console.log(base64String);
REMARQUE: l'exécution de ce code directement à partir de l'extrait de code échouera avec un message d'erreur indiquant un violation de plusieurs domaines . Si vous le copiez sur votre propre serveur, vous obtiendrez le contenu encodé en base64. Si vous ne pouvez pas éviter le problème interdomaine, vous devrez utiliser la solution @ DPardal . Cela fonctionne également sur un domaine tiers si, par exemple, vous injectez au script quelque chose comme le sélénium.