CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • French Days
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • French Days
  • RetourHigh-Tech
    • French Days
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • 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
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet résolu : [JS] getImageData() fait crash mon code

DébutPage précedente
1
Page suivantePage suivante
Saygus5 Saygus5
MP
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://www.noelshack.com/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
MP
Niveau 22
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
MP
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
MP
Niveau 60
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
MP
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
MP
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
MP
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
MP
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
MP
Niveau 22
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
MP
Niveau 60
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
MP
Niveau 29
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

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment