CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[JS] getImageData() fait crash mon code

Saygus5
Saygus5
Niveau 49
04 mai 2021 à 17:58:29

Bonsoir :-)

Comme dit dans le titre, j'ai un soucis avec getImageData()
J'ai juste fait ça pour l'instant, ça copie colle une <img> dans un canevas, puis je veux récupérer les données du canevas dans une var avec getImageData(), le soucis ligne 22

https://image.noelshack.com/fichiers/2021/18/2/1620143700-dark.png

Si je met l'alert avant elle s'affiche si je la met après elle ne s'affiche pas

Une idée pourquoi ? :svp:

Et aussi pourquoi il faut obligatoirement mettre drawImage() dans l'evnmt window.onload ? :svp:

Message édité le 04 mai 2021 à 17:59:43 par Saygus5
godrik
godrik
Niveau 30
04 mai 2021 à 18:44:27

Je ne suis pas un expert en web et javascript. Mais de ce que j'en comprends, plein de choses sont asynchrone dans le modele d'execution de code sur le web. En particulier quand la page se charge, les elements qui sont contenu dans la page, comme par exemple les images, sont charge de facon asynchrone.

Donc si tu essaye de faire le drawImage, j'imagine que le contenu du tag img n'est pas encore charge, donc tu copies certainement une image qui n'est pas encore charge, donc probablement une image de 0px par 0px.
La fonction window.onload est execute une fois que la page entiere est charge, image incluse. Donc quand la fonction onload execute, l'image sous jacente est charge et donc le drawimage copie ce que tu attends.

Pour le alert avant, apres, j'ai pas compris la question.

Encore une fois, je fais tres peu de web. Donc ce que ej dis est a prendre avec un grain de sel.

_S0uL
_S0uL
Niveau 9
04 mai 2021 à 19:04:28

Désolé j'ai supprimé mon message parce que j'ai testé ton code entre temps (n'hésite pas à coller ton code ici dans des balises <code></code> ou sur pastebin la prochaine fois pour que ce soit plus simple pour nous de tester). Si tu regarde ta console en ouvrant ta page tu verra peut être ça :

Uncaught DOMException: The operation is insecure. foo.html:15
    onload file:///home/matt/foo.html:15
    (Async: EventHandlerNonNull)
    <anonymous> file:///home/matt/foo.html:12

Si c'est le cas, ça vient sûrement du fait que tu ouvre ta page avec un lien file:///home/pseudo/dir/mapage.html. Le protocole file:// est considéré comme peu sécurisé par les navigateurs.

Chez moi, en lançant un petit serveur web sur le port 8000 dans le dossier où se trouve ce fichier, puis en me connectant à localhost:8000/<fichier.html> ça fonctionne très bien.

PS: je viens de capté que tu est sous windows, les chemins ont sûrement l'air un peu différent mais je pense que ce que je dis reste valable

Message édité le 04 mai 2021 à 19:07:23 par _S0uL
Shiba_the_Inu
Shiba_the_Inu
Niveau 85
04 mai 2021 à 19:13:44

Je ne suis pas expert non plus mais :

Il me semble que l'alert bloque la page tant que tu ne l'enlèves pas, donc si tu la mets après, comme l'a dit godrik je pense que 'limage ne doit pas être totalement chargée.

Pour le onload il semblerai que ce soit des vestiges de l'ancien Internet Explorer par rapport au chargement de pages, ça s'active quand tout le reste de la page a été chargé, donc pour ta question je ne sais pas, mais c'est peut être pour que le canvas se charge complètement afin de charger correctement ton image.

Enfin je dis ça, mais il ne me semble pas que ce soit obligatoire en fait.

Message édité le 04 mai 2021 à 19:14:45 par Shiba_the_Inu
_S0uL
_S0uL
Niveau 9
04 mai 2021 à 19:20:16

Et sinon, en regardant à droite à gauche, mettre une fonction sur window.onload n'est pas une très bonne pratique. Comme dit mon VDD c'est un vestige d'un ancien temps (IE < 11 :mort:). Une meilleur pratique serai de mettre un eventListener sur le "load" de img :

img.addEventListener('load', function() { /* code ici */ })

Mais bon, prends ce que je te dis avec des pincettes, je suis le 3e non expert qui te répond :lol:, j'ai juste trouvé ça en cherchant vite fait.

Saygus5
Saygus5
Niveau 49
04 mai 2021 à 19:43:03

L'alert c'était juste pour voir à quel moment mon code crashait justement, si l'alert ne s'affiche pas c'est qu'une ligne au dessus a un problème :ok:

Le 04 mai 2021 à 19:04:28 _S0uL a écrit :
Désolé j'ai supprimé mon message parce que j'ai testé ton code entre temps (n'hésite pas à coller ton code ici dans des balises <code></code> ou sur pastebin la prochaine fois pour que ce soit plus simple pour nous de tester). Si tu regarde ta console en ouvrant ta page tu verra peut être ça :

Uncaught DOMException: The operation is insecure. foo.html:15
    onload file:///home/matt/foo.html:15
    (Async: EventHandlerNonNull)
    <anonymous> file:///home/matt/foo.html:12

Si c'est le cas, ça vient sûrement du fait que tu ouvre ta page avec un lien file:///home/pseudo/dir/mapage.html. Le protocole file:// est considéré comme peu sécurisé par les navigateurs.

Chez moi, en lançant un petit serveur web sur le port 8000 dans le dossier où se trouve ce fichier, puis en me connectant à localhost:8000/<fichier.html> ça fonctionne très bien.

PS: je viens de capté que tu est sous windows, les chemins ont sûrement l'air un peu différent mais je pense que ce que je dis reste valable

En effet moi j'ai
Uncaught DOMException: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.,
Donc ouais c'est juste une problème de sécurité, bien chiant tout ça, je commençais tout juste à apprécier la simplicité du js :-(

Merci en tout cas, j'ai pas le reflexe d'aller voir dans la console j'aurais pu voir l'erreur tout seul :desole:

Concernant le window.onload, c'était juste par curiosité, merci pour vos réponses :hap:

_S0uL
_S0uL
Niveau 9
04 mai 2021 à 19:47:03

je commençais tout juste à apprécier la simplicité du js

:rire2:

Là en l'occurence c'est pas un soucis de JS mais le navigateur qui ne fait pas confiance au protocole utilisé (et il a bien raison). Par contre js n'est pas un langage simple, vraiment.

Saygus5
Saygus5
Niveau 49
04 mai 2021 à 19:51:46

Le 04 mai 2021 à 19:47:03 _S0uL a écrit :

je commençais tout juste à apprécier la simplicité du js

:rire2:

Là en l'occurence c'est pas un soucis de JS mais le navigateur qui ne fait pas confiance au protocole utilisé (et il a bien raison). Par contre js n'est pas un langage simple, vraiment.

Non je parlais pas du langage en lui même mais du fait que y'a juste à écrire sur notepad puis à actualiser sur le navigateur, c'est quand même plus cool que de recompiler du c à chaque modif :hap:

Bon sinon une solution temporaire que j'ai trouvé, c'est de ré-encoder l'image en base64 et de c/c son code dans l'html, c'est moche, mais ça marche :hap:

godrik
godrik
Niveau 30
04 mai 2021 à 19:56:00

sert la page html avec un serveur local pour retirer toute ces erreurs.

Shiba_the_Inu
Shiba_the_Inu
Niveau 85
04 mai 2021 à 20:12:18

Le 04 mai 2021 à 19:51:46 :

Le 04 mai 2021 à 19:47:03 _S0uL a écrit :

je commençais tout juste à apprécier la simplicité du js

:rire2:

Là en l'occurence c'est pas un soucis de JS mais le navigateur qui ne fait pas confiance au protocole utilisé (et il a bien raison). Par contre js n'est pas un langage simple, vraiment.

Non je parlais pas du langage en lui même mais du fait que y'a juste à écrire sur notepad puis à actualiser sur le navigateur, c'est quand même plus cool que de recompiler du c à chaque modif :hap:

Bon sinon une solution temporaire que j'ai trouvé, c'est de ré-encoder l'image en base64 et de c/c son code dans l'html, c'est moche, mais ça marche :hap:

Tu peux aussi faire ton code directement sur le navigateur pour tester certains trucs, même pas besoin de ré-actualiser.
Si tu veux des infos sur ton code un console.log suffirait, et tu peux ouvrir le mode développeur (ctrl màj k sur firefox) pour te balader dans les variables.
Par exemple faire windows (ou console.log(windows), canvas ou ctx par exemple et tu devrais avoir leurs infos en déroulant le menu.

Message édité le 04 mai 2021 à 20:14:32 par Shiba_the_Inu
Marav
Marav
Niveau 52
06 mai 2021 à 13:58:00

Salut, tu as toutes les informations nécessaires sur cet article :

https://developer.mozilla.org/fr/docs/Web/HTML/CORS_enabled_image

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment