É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.