Maison > interface Web > js tutoriel > Pourquoi mon canevas `drawImage()` renvoie-t-il des données vides ou ne parvient-il pas à restituer, et comment puis-je le réparer en utilisant `onload` et CORS ?

Pourquoi mon canevas `drawImage()` renvoie-t-il des données vides ou ne parvient-il pas à restituer, et comment puis-je le réparer en utilisant `onload` et CORS ?

Patricia Arquette
Libérer: 2024-12-12 21:03:13
original
980 Les gens l'ont consulté

Why is my Canvas `drawImage()` returning empty data or failing to render, and how can I fix it using `onload` and CORS?

CanvasContext2D drawImage() Énigme : Onload et CORS

En tentant de peindre une image sur un canevas avant de récupérer son dataURL, les utilisateurs peuvent rencontrer un problème où le retour les données apparaissent vides, ressemblant à une chaîne remplie de caractères « A ». De plus, l'ajout du canevas au document peut ne pas parvenir à restituer l'image, alors qu'aucune erreur n'est signalée dans la console.

Résolution du problème

La racine du problème réside dans la nature asynchrone de l'image. chargement. Pour le résoudre, il faut utiliser le gestionnaire d'événements onload du élément pour exécuter l'opération de peinture uniquement une fois le chargement de l'image terminé.

// Create a new image
var img = new Image();

// Define a function to execute after the image has loaded
img.onload = function() {
  var canvas = document.createElement('canvas');
  canvas.width = img.width;
  canvas.height = img.height;
  var context = canvas.getContext('2d');
  context.drawImage(img, 0, 0);

  // Now you can retrieve the dataURL
  var dataURL = canvas.toDataURL();
  doSomething(dataURL);
};

// Set the image source
img.src = "http://somerandomWebsite/picture.png";
Copier après la connexion

CORS et récupération de données

Pour que les méthodes context.toDataURL() et context.getImageData fonctionnent correctement, l'image la ressource doit être récupérée d’une manière compatible avec toutes les origines. Sinon, le canevas devient « entaché », bloquant toute tentative de récupération de données de pixels.

Si l'image provient du même serveur que votre script, il n'y a aucun problème. Cependant, si l'image réside sur un serveur externe, il est crucial de s'assurer que le serveur autorise l'accès multi-origine en définissant les en-têtes CORS appropriés. De plus, la propriété img.crossOrigin doit être définie sur « use-credentials » pour les demandes authentifiées ou sur « anonymous » pour les demandes anonymes.

Il est important de noter que les en-têtes CORS sont définis côté serveur. L'attribut d'origine croisée indique uniquement l'intention du client d'accéder aux données d'image à l'aide de CORS. Contourner les restrictions CORS n'est pas possible si la configuration du serveur l'interdit.

Dans certains scénarios, certaines images peuvent être hébergées sur votre serveur tandis que d'autres peuvent nécessiter CORS. Pour gérer cela, envisagez d'utiliser le gestionnaire d'événements onerror, qui est déclenché lorsque l'attribut cross-origin est défini sur « anonyme » sur un serveur qui ne prend pas en charge CORS.

function corsError() {
  this.crossOrigin = "";
  this.src = "";
  this.removeEventListener("error", corsError, false);
}

img.addEventListener("error", corsError, false);
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal