![]() |
![]() |
Web 2.0/HTML5 Rabat 2012-2013De $1Table des matières
Supports utilisés en cours
CSS 2 + quelques bouts de 3
Dernier exemple étudié avec zoom, rotation, etc...
TP1: installation de l'environnement de développement, premiers exercicesInstallation des logicielsDans ce TP vous commencerez par installer les outils WebStorm et Netbeans 7.3 beta sur vos machines, vous assurez que vous disposez de navigateurs webs récents. Etude des exemples vus en coursPrenez le temps de parcourir les exemples vus en cours, passez un peu de temps à regarder les sources, n'hésitez pas à les modifier pour voir... Passez au moins 30 minutes à explorer... Ecriture d'un formulaire HTML5Dans cet exercice, vous allez créer une page index.html qui contiendra un formulaire HTML5 que vous soumettrez à une Servlet par la suite, pour tester. On fera la partie Servlet plus tard... Pour le moment utilisez l'outil que vous voulez pour créer le formulaire HTML (webstorm, netbeans, etc). Je vous conseille d'utiliser aussi jsbin.com pour valider de petits exemples. Avec le menu jsbin/create milestone vous pouvez sauvegarder plusieurs versions de vos travaux. Copiez collez les URLs sinon ils seront perdus. Le formulaire devra permettre de saisir votre nom, prénom, age (avec type = number), date d'inscription, adresse (plusieurs champs: rue, code postal sur 6 chiffres avec attribut regexp et placeholder, ville, pays avec auto-complétion par champs <datalist>), email, home page, et un mot de passe dans deux champs séparés (pour valider). Vous utiliserez au maximum les possibilité des formulaires HTML5, c'est-à-dire: les types spécialisés email, tel, url, date, etc. Vous utiliserez aussi des règles CSS pour mettre en rouge les champs non valides, les attributs pour indiquer des valeurs exemples et des regexps pour valider le code postal. Vous utilisez comme dans l'exemple présent sur la page des Exemples HTML5 vus en cours l'API de validation des formulaires pour vérifier que les passwords sont bien identiques. Une fois que la page fonctionne, vous écrirez une Servlet ou un bout de code PHP qui récupère les éléments du formulaire et les affiche dans une page de réponse. Le but de cet exercice est de vous faire jouer au maximum avec les formulaires HTML5. Intégration de la géolocalisationVous rajoutere dans le formulaire un bouton permettant de récupérer la longitude et la latitude de la positon courante. Vous afficherez ces valeurs dans un champs du formulaire de l'exercice précédent qui se remplira automatiquement. Vous afficherez dans un second temps la position sur une carte google map. Soumettez le formulaire et affichez la longitude et la latitude reçue par le serveur. Maintenant, inspirez-vous de l'exemple proposé sur la page des exemples et qui utilise le reverse geocoder de google map pour transformer la longitude et la latitude en adresse. Utilisez cet exemple pour pré-remplir le formulaire avec une option "trouver l'adresse à partir de ma position". Exercices avec la vidéoOn veut maintenant pouvoir ajouter une image à son formulaire, sa photo... Soit en la choisissant via un bouton, soit en faisant un drag'n'drop. On veut voir une preview de la photo dans la page. On verra plus tard comment l'envoyer au serveur. On veut aussi pouvoir la capturer à partir de la vidéo. Vous vous inspirerez des exemples pour intégrer une image dans votre formulaire. Exercices avec le dessin dans un canvasOn veut pouvoir enregistrer une signature avec la souris en dessinant dans un canvas. Vous ajouterez à votre formulaire un canvas et du code javascript pour pouvoir dessiner une signature à l'intérieur. Regardez les exemples pour vous en inspirer. Regardez les différents tutoriaux pour voir comment récupérer le contenu du canvas sous la forme d'une image. Rajouter des styles via CSS pour bien présenter la page de formulaireAidez-vous des exemples CSS2 donnés au début de ce TP pour styler votre formulaire et lui donner une apparence un peu plus sympathique. Notamment, j'aimerais bien que vous utilisiez des bordures pour séparer les différentes parties du formulaire: la partie adresse/géolocalisation, la partie nom, prénom, password, email, la partie image/signature, etc. Par la suite, dans le TP2 nous reprendrons la page de ce formulaire pour utiliser les nouveaux tags de structure de HTML5 (<footer><header><article><section> etc.) TP2 : découverte d'un logiciel de dessinTélécharger l'archive à étudierToutes les sources de ce TP sont dans cette archive (4Mbytes). Dézippez-la, vous devriez avoir un répertoire "Paint_HTML5_Multi_Tutorial". Et à l'intérieur des sous-répertoires step1, step2, etc... qui correspondent à chaque étape dans ce document. Ouvrez donc ce répertoire avec l'outil WebStorm (menu file/open directory). Vous devriez donc pouvoir étudier et exécuter facilement les diverses versions du petit programme de dessin sur lequel nous allons travailler. Step 1 : le paint le plus simple !Allez dans le répertoire"step 1". Vous pouvez tester cet exemple en ouvrant paint.html dans votre navigateur. Remarquez ces lignes en tête du fichier : /div[5]/div[2]/pre, reference to undefined name 'syntax'Le DOCTYPE est le tout nouveay ultra-simple DOCTYPE de HTML5 DOCTYPE, yeah ! Si vous ecrivez n'importe quoi avant la déclaration du DOCTYPE, IE9 ne considérera plus le fichier comme du HTML5, et cet exemple ne fonctionnera pas ! L'élément<canvas> de la page sera ignoré. Les autres navigateurs cependant tolèrent qu'on puisse avoir des choses avant le DOCTYPE, pas la série des Internet Explorers... Ensuite, dans le fichier, on délcare une feuille de style CSS et quelques scripts JavaScript. Oui, dans cette partie du TP on utilise jQuery pour la manipulation du DOM et pour la gestion des événements. HTML5 proposes la méthode document.querySelector(...) qui supporte des sélécteurs du DOM similaires à ceux de jQuery mais c'est plus long à écrire que $(...), etjQuery utilises querySelector en interne... /div[5]/div[2]/pre, reference to undefined name 'syntax'Le fichier paint.js contient le code de la partie "dessiner quand la souris bouge" du programme de paint, alors que utils.js contient juste une fonction utilitaire pour récupérer correctement la position de la souris dans le <canvas>. Lorsque le document est entièrement chargé (et le DOM prêt), on crée un objet Paint, qui contient la majeure partie des fonctionnalités écrites en JavaScript. Oui, ici on fait du JavaScript objet. On verra qu'en JavaScript, une fonction est un objet, une variable un attribut et une fonction dans une fonction: une méthode ! Le $(document).ready(function() {.....}); est une manière d'exécuter un bout de code uniquement quand le DOM est prêt. C'est une méthode proposée par jQuery pour remplacer les <body onload=...> et autres document.addActionListener("load", init());... /div[5]/div[2]/pre, reference to undefined name 'syntax'Le paramètre ("canvasMain") est l'Id du tag <canvas> que vous trouverez un peu plus loin dans la page, dans la partie "HTML" : /div[5]/div[2]/pre, reference to undefined name 'syntax'Regardons maintenant le code de l'objet PaintObject dans le fichier paint.js ... Tout d'abord on voir qu'on récupère une référence sur le canvas, et aussi sur le contexe associé à ce canvas. Ce contexte contient les méthodes et propriétés pour dessiner dans le canvas. /div[5]/div[2]/pre, reference to undefined name 'syntax'On ajoute aussi un écouteur pour les mouvements souris sur le canvas (là c'est fait avec jQuery) : /div[5]/div[2]/pre, reference to undefined name 'syntax'this.mouseListener est une méthode de PaintObject qui dessine une ligne à chaque déplacement souris, depuis la position précédente à la position courante : /div[5]/div[2]/pre, reference to undefined name 'syntax'Remarquez que pour dessiner une ligne on déclare un chemin avec mainContext.beginPath(), on se place le curseur à une position pour "poser le crayon" (moveTo), on trace une ligne depuis cette position jusqu'à une autre (lineTo), et on ferme le chemin (closePath). Le chemin est dessiné réellement par l'appel de mainContext.stroke(). "stroke" = en mode fil de fer, "fill" = en mode remplissage. Dans notre cas on dessine en fil de fer et l'apparence est définie par la valeur courante de mainContext.strokeStyle, par défaut c'est la couleur noire. Attention : si vous oubliez de fermer le chemin (pas de closePath), alors à chaque mouvement de la souris on redessine le chemin en entier et ce chemin contiendra toutes les lignes depuis le début ! En effet: mainContext.stroke() dessine tous les ordres de dessin depuis l'appel de context.beginPath() ... si un beginPath() est appelé alors qu'un chemin a déjà été commencé, il est ignoré. Remarquez aussi comment nous calculons la taille du canvas en fonction de la taille de la fenêtre du navigateur. On aurait pu le faire à l'aide d'une règle CSS avec des pourcentages sur les propriétés width et height du canvas, mais malheureusement cela "grossit" aussi le contenu du canvas et produisant des gros carrés comme lorsqu'on grossit une image. Ainsi il est préférable d'ajuster la taille du canvas depuis du JavaScript : /div[5]/div[2]/pre, reference to undefined name 'syntax'Step 2 : ajout des événements mouseUp, mouseMove, mouseDown, création d'un objet pour le dessinAllez dans le dossier "step 2". Vous pouvez tester cet exemple en ouvrant paint.html dans votre navigateur. Cette fois-ci on ne dessine que lorsque le bouton de la souris est enfoncé. On a aussi séparé le code qui effectue le dessin du code d'initialisation du PaintObject. Le fichier drawingtools.js contiendra dorénavant les "objets de dessin" comme le crayon, lignes, rectangles, cercles etc... alors que paint.js s'occupe juste de créer les contextes, déclarer les événements etc. Encore une fois on utilise jQuery pour les événements (paint.js): /div[5]/div[3]/pre, reference to undefined name 'syntax'Voici le contenu du fichier drawingtool.js avec simplement in outil qui dessine en mode "crayon". Remarquez les trois écouteurs pour les événements souris: /div[5]/div[3]/pre, reference to undefined name 'syntax'Step 3 : ajout d'un second canvas transparent superposé au canvas principal, pour dessiner des "lignes élastiques"Allez dans le répertoire "step 3" directory. Vous pouvez tester cet exemple en ouvrant paint.html dans votre navigateur. Cet exemple montre une utilisation très intéressante des canvas: leur utilisation en "overlay" ou si vous préférez, comme des "calques photoshop". En utilisant des propriétés CSS de positionnement relatif et en donnant à la propriété z-index de chaque canvas une valeur différente on peut choisir lequel est devant l'autre. Par défaut les canvas sont transparents. Si on efface une partie d'un canvas à l'aide de la méthode context.clearRect(x, y, width, height) alors on pourra "voir à travers cette partie". On va utiliser cet effet pour dessiner des lignes "élastiques" (des lignes qui suivent la souris) dans un canvas transparent, le "front canvas", placé devant le canvas normal (le "main canvas"). Pour animer la ligne qu'on trace quand la souris bouge, on efface le canvas, on dessine la ligne, on efface le canvas, on dessine la ligne à la nouvelle position, etc... Ajout d'un canvas au-dessus de l'autre: Cette opération est réalisée dans paint.js : /div[5]/div[4]/pre, reference to undefined name 'syntax'Ajout d'un outil "ligne" dans drawingtools.js On déclare un tableau qui va contenir les différents outils (pencil, line, etc) : /div[5]/div[4]/pre, reference to undefined name 'syntax'Et on a modifié la gestion des événements souris pour qu'on appelle le bon écouteur sur l'outil courant. /div[5]/div[4]/pre, reference to undefined name 'syntax'...remarquez que dans drawingtools.js, dans l'outil "ligne", on ne dessine que dans le front canvas, et juste avant de dessiner la ligne élastique, on efface le contenu de ce canvas, ce qui donne l'illusion que la ligne est animée et qu'elle suit la souris: /div[5]/div[4]/pre, reference to undefined name 'syntax'Dans le fichier paint.html , on a jouté quelques spans pour pouvoir choisir les différents outis dans un menu sur la droite de l'écran: /div[5]/div[4]/pre, reference to undefined name 'syntax'Et dans paint.js on détecte les clicks souris sur ces spans : /div[5]/div[4]/pre, reference to undefined name 'syntax'Petit problème : comment conserver la ligne dans le dessin final quand on relâche le bouton de la souris ? Step 4 : dessiner le contenu du front canvas dans le main canvas quand on relâche la souris en mode ligneAllez dans le répertoire step 4. Vous pouvez tester cet exemple en ouvrant paint.html dans votre navigateur. Cette fois on va conserver la ligne qu'on est en train de dessiner dans le dessin final, lorsqu'on relâche le bouton de la souris. On va détecter sur le font canvas l'événement mouseUp et on va juste dessiner le front canvas dans le main canvas. La fonction de dessin d'image permet en effet de prendre comme paramètre une image mais aussi une vidéo ou un canvas ! Dans paint.js cela se passe dans la méthode drawFrontCanvasOnMainCanvas() de PaintObject. On utilise mainContext pour dessiner le front canvas dans le "main canvas", juste après on efface le contenu du front canvas avec le frontContext. /div[5]/div[5]/pre, reference to undefined name 'syntax'Et on appelle cette méthode depuis l'écouteur d'événements mouseUp() dans l'outil "ligne" : /div[5]/div[5]/pre, reference to undefined name 'syntax'Step 5 : ajout d'outils pour dessiner des rectangles et des cerclesAllez dans le répertoire step 5. Vous pouvez tester cet exemple en ouvrant paint.html dans votre navigateur. Cette fois-ci, nous avons suivi une méthode similaire à l'ajout de lignes élastiques, mais pour ajouter des outils de dessin de cercles et de rectangles. Vous pouvez les étudier dans le fichier drawingtools.js. Regardez en parallèle les sites contenant des tutoriaux sur les canvas (ou le cours) pour voir comment fonctionnent les méthodes de tracé de cercles ou de rectangles. Remarquez aussi qu'en ayant conçu intelligemment notre petit programme, le framework très simple permet de rajouter facilement des fonctions pour dessiner du texte, des images, etc. Step 6 : utilisation des styles de dessin, de nouveaux champs input HTML5 (color, range)Allez dans le répertoire step 6. Vous pouvez tester cet exemple en ouvrant paint.html dans votre navigateur. Cette fois-ci on a ajouté des nouveaux champs input dans la page, pour choisir la couleur et l'épaisseur du trait. Vous pourrez une fois testé, remplacer les <input class="color"/> par des vrais champs html5 de type color comme indiqué dans les commentaires. /div[5]/div[7]/pre, reference to undefined name 'syntax'On a utilisé un <input type="range"... /> pour sélectionner l'épaisseur du trait. Pour la selection de couleurs, on a utilisé un "polyfill", un champ <input class="color" /> qui fonctionne avec la librairie jscolor.js . Si vous utilisez un navigateur qui supporte <input type="color" /> il est préférable d'utiliser la version native. Modifiez juste le code et voyez que cela marche toujours. Vous venez de faire la connaissance avec la manière dont certaines librairies de "rétro compatibilité" comme modernizr fonctionnent pour donner à de vieux navigateurs la possibilité de faire fonctionner des pages utilisant des nouveautés de HTML5. Dans paint.js on gère les valeurs de ces champs qui vont affecter les styles de dessin (dans mainCanvas et dans frontCanvas) : /div[5]/div[7]/pre, reference to undefined name 'syntax'Ces valeurs sont "globales" et tout dessin fait avec stroke ou fill par les contextes les prendra en compte. Step7 : travail à faire par vous, ajout de nouvelles fonctions !Dans cette étape on vous demande de rajouter:
Vous pouvez vous inspirer de cet exemple: http://mathieumiollan.nodester.com/ TP3 : découverte des web sockets HTML5Pour ce TP vous aurez besoin d'un micro serveur qui gère les web sockets. On va utiliser NodeJS un serveur web très populaire en ce moment pour les applications multi-participantes HTML5. Il est écrit en Python mais il embarque l'interpréteur JavaScript V8 de Chrome. Le code applicatif côté serveur n'est ni du PHP, ni du Java, mais du ... JavaScript !
Etude d'un programme de chatWe will use the NodeJS web serverNodeJS est un serveur très très minimal par défaut mais on peut l'étendre en lui ajoutant des "modules". Exemple de modules que nous allons utiliser:
Installation de NodeJSSous windows c'est assez compliqué à cause de certains modules qui nécessitent une recompilation à la volée. Pour ce TP au lieu d'installer NodeJS depuis le site officiel, puis utiliser la commande "npm" (Node Package Manager), qui télécharge les modules un par un, vous allez directement installer les logiciels qui vous ont été donnés sur la clé USB au début des TPs:
Une fois tout ceci installé, ouvrez une fenêtre DOS et tapez "node --version", cela devrait afficher Test d'une première application NodeJS
Sauvez le et exécutez la commande suivante : node test.js
Ouvrez cet URL dans votre navigateur ! Vous devriez avoir : Vous venez d'exécuter votre première application NodeJS ;-) Test de l'application de chatAllez dans le répertoire où vous avez dézippé ChatNowJs.zip. Exécutez la commande : "node simpleChat_server.js", et ouvrez http://localhost:8080 dans votre navigateurr. Ouvrez deux onglets sur cet URL, vous devez avoir un champ de saisie dans chaque page. Tapez quelque chose, cela devrait apparaitre dans l'autre fenêtre (les deux sont en réalité des clients connectés au même serveur de WebSockets ). Etude de l'application de chatDeux fichiers tout petits à étudier !
Ouvrez ces fichiers avec un éditeur : ouch que c'est... petit ! Oui, on utilise ici la notion d'objets distribués, le code client qui tourne dans le navigateur appelle du code qui tourne dans le serveur et inversement. Pas de réseau au milieu ! En fait si... mais on fait comme si il n'y en avait pas ! Le module NodeJS qui fait ceci est magique, il s'appelle NowJS ! NowJS définit une "poche magique" appelée "now" : en fait une variable JavaScript que l'on manipule depuis le code qui tourne sur le client, dans le navigateur, et qui contient les variables et méthodes et objets partagés entre le client et le serveur distant. Le serveur peut utiliser une variable "everyone.now" pour définir et utiliser les variables et méthodes partagées. Par exemple, côté serveur on définit la fonctionn Serveur : /div[6]/div[3]/pre, reference to undefined name 'syntax'Appel par un des clients (voir simpleChat.html) : /div[6]/div[3]/pre, reference to undefined name 'syntax'Ainsi un clic sur le bouton "send" dans la page exécute Client : /div[6]/div[3]/pre, reference to undefined name 'syntax'Et cette fonction, localisée côté client, va juste afficher dans la page le texte du message reçu ! De la même manière, une variable déclarée côté client comme: /div[6]/div[3]/pre, reference to undefined name 'syntax'Peut être récupérée directement par le serveur à l'aide de Serveur : /div[6]/div[3]/pre, reference to undefined name 'syntax'A l'aide de ce paradigme, NowJS permet de développer très rapidement des applications collaboratives avec des WebSockets. Remarquez que les objets sont envoyés tels quels, pas en XML ou en JSON ! (Ils sont en réalité transformés en JSON en coulisse). TP5 : etudier la partie multi-participants du Paint (steps 7 et 8)
On ajoute la partie "chat" au programme de paintAllez dans le répertoire "step 7". Arrêtez NodeJS si il tourne encore. Regardez le fichier server.js : /div[7]/div/pre, reference to undefined name 'syntax'Ce code est similaire à celui du chat que nous avons étudié précédemment, à part que cette fois-ci nous utilisons le module "express" de NodeJS pour créer le serveur HTTP (13 premières lignes). Express permet de servir correctement des pages HTML qui incluent des fichiers JavaScript, des images ou des feuilles de style CSS. En effet, par défaut, ce que faisait l'exemple du chat, c'est uniquement servir un fichier html tout bête. Là, express saura envoyer les bons types Mime (content/html, application/javascript, text/css) lorsqu'il servira les différents fichiers. Exécutez la commande suivante : "node server.js", et ouvrez "http://localhost" dans votre navigateur. Vous devriez voir le même programme s'exécuter que dans l'étape "step 6", mais avec en plus un chat en bas de la page ! REMARQUE: Pour ceux qui ont un Mac ou qui sont sous Linux, ou ceux qui veulent faire fonctionner les exemples avec Node 0.8.x et pas le node 0.6.x, sachez que le module NowJS n'est plus compatible avec le module "express". On pourra simplement utiliser un module semblable à "express", le module "connect", voici le code qui va bien. Si vous travaillez avec le NodeJS qui vous a été donné, n'en faites rien ! /div[7]/div/pre, reference to undefined name 'syntax'FIN DE LA REMARQUE Ouvrez deux onglets avec le même URL, testez le chat... A la fois le paint et le chat devraient fonctionner. Dans la prochaine étape, nous utiliserons le canal du chat pour transférer les ordres de dessin. Regardez le code source maintenant. Nous avons isolé le code JavaScript du chat dans le fichier chat.js, et nous avons ajouté le champ de saisie du chat dans la page paint.html. On utilise un <div> pour afficher les messages. Voici les additions au fichier paint.html : /div[7]/div/pre, reference to undefined name 'syntax'Remarquez que paint.html inclut un fichier now/now.js file qui est servi par NodeJS, ce fichier ne fait pas partie du projet, il est envoyé par le serveur, par son module NowJS. Le fichier now.js est en réalité localisé dans le répertoire node_modules/now dans le répertoire step 7. Sans ce répertoire node_modules, il serait impossible de faire fonctionner notre application. De même, si on ouvre paint.html en tant que file://, cela ne peut pas non plus fonctionner. Remarquez qu'on initialise le chat qu'une fois que le DOM est prêt, dans la fonction $(document).ready() de jQuery. C'est la manière de jQuery d'implémenter le <body onload=...> Et voilà les quatre lignes à la fin du fichier paint.html, pour le chat, ce sont les mêmes qu'on avait dans l'exemple du chat tout seul: /div[7]/div/pre, reference to undefined name 'syntax'Voici le code qui gère le click sur le bouton, et qui envoie le texte entré dans le champs de saisie. C'est le même que dans le chat tout seul, il est situé dans le fichier chat.js: /div[7]/div/pre, reference to undefined name 'syntax'Step 8 : Brodacaster les ordres de dessinAllez dans le répertoire "step 8". Arrêtez NodeJS si il tourne encore. Exécutez le programme comme pour le step 7. Coté serveur : on broadcaste les ordres de dessin, sauf à l'envoyeurCette fois-ci, sans rien toucher au code du chat, on a rajouté juste une simple méthode appelable depuis les clients, pour broadcaster les ordres de dessin. Les ordres de dessin sont des objets JavaScript qui contiendront tout ce qu'il faut pour que le récepteur puisse reproduire le dessin quand il recevra l'ordre. Ainsi, si quatre personnes sont connectées, et que la première trace une ligne, les trois autres recevront un objet paintCommand comme {type:line, x1:20, y1:50, x2:123, y2:240}, il suffira de tester paintCommand.type pour tracer une ligne de (paintCommand.x1, paintCommand.y1) jusqu'au pixel (paintCommand.x2, paintCommand.y2)
Serveur (fichier server.js) : /div[8]/div/pre, reference to undefined name 'syntax'On utilise aussi une autre feature très pratique du module NowJS : la possibilité d'exclure quelqu'un lors du broadcast: ici l'expéditeur. La partie En effet, si un client dessine une ligne, elle est déjà dessiné sur son écran, pas la peine qu'il recoive son propre message pour dessiner une ligne déjà dessinée. C'est la seule différence avec le chat où on renvoit les messages à tout le monde y compris à l'expéditeur. Envoi des ordres de dessinDans le client, l'envoi des ordres de dessin est situé dans chaque drawing tool (crayon, ligne, cercle, etc). Regardons juste l'outil "ligne" dansle fichier drawingtools.js : /div[8]/div[2]/pre, reference to undefined name 'syntax'On a ajouté une méthode Une fois construit, on envoie cet objet au serveur pour qu'il le broadcaste, en appelant la méthode Traitement des ordres de dessin qu'on reçoit du serveurPremièrement, on a définit dans le fichier paint.html une méthode appelable par le serveur: now.processPaintCommand (paintCommand) . As it is defined as a method of the now object, it is callable by the server code. /div[8]/div[3]/pre, reference to undefined name 'syntax'Ainsi, chaque fois que le serveur appelle processPaintCommand() chez les clients connectés, cette méthode appelera à son tour paint.processPaintCommand(paintCommand), une méthode de l'objet paint, localisée dans le fichier the paint.js. Elle reproduit le dessin correspondant à l'ordre reçu: /div[8]/div[3]/pre, reference to undefined name 'syntax'C'est un concept très simple: je reçois l'ordre de dessiner une ligne, je trace une ligne ! En fait, il y a une toute petite complication concernant les propriétés du dessin, si on est en train de dessiner en vert et qu'on reçoit l'ordre de dessiner en rouge, il faudra changer momentanément la couleur pour du rouge, puis remettre comme c'était avant, en vert !!!! On appelle cela "changer les contextes"... voici au final ce que l'on fait quand on reçoit un ordre de dessin:
Pour la sauvegarde et la restauration, on utilise les méthodes save() et restore() du contexte des canvas, elles sont dans l'API des canvas. Ces méthodes permettent de sauvegarder sur une pile plusieurs contextes consécutifs et de les dépiler. Vous pouvez aussi regarder comment nous avons traité les ordres de dessin pour les différents outils implémentés (rectangle, cercle, etc). Utilisation de la webcam pour dessiner avec l'image courante de la webcam et la transmettreJuste pour le fun on a ajouté la possibilité de dessiner des rectangles avec pour contenu l'image courante de la webcam. Ceci ne marche qu'avec Opera ou Chrome. Initialiser l'API getUserMediaComme dans les exemples du cours HTML5 concernant la webcam, on a ajouté une ligne pour initialiser la webcam dans le fichier paint.html, et on a mis le code JavaScript propre à la webcam dans le fichier webcam.js /div[8]/div[4]/div/pre, reference to undefined name 'syntax'Voici le fichier webcam.js. L'élément d'id "output" est un tag <video> situé lui aussi dans la page paint.html, c'est lui qui affiche la vidéo de la webcam, sur la droite de l'écran. /div[8]/div[4]/div/pre, reference to undefined name 'syntax'Principe d'utilisation de la webcam :
and you are done ! Ces lignes suffisent à afficher la webcam dans la page. Peindre avec des images en provenance de la vidéo de la webcamLike we did earlier for other tools, we added a 'webcam' drawing tool in the drawintools.js file : /div[9]/pre, reference to undefined name 'syntax'We just draw the live video stream current displayed image with a call to the drawImage method of a context object. In that cas, we draw elastic rectangles filled with a live image using the frontContext object. Sending live images as base64 picturesThe trick here is to draw the current video frame into an offscreenCanvas of the size of the rectangle we are drawing, then get its content as a base64 image, broadcast the image with position, size, etc. to other clients... We use the offScreenCanvas.toDataURL("image/png") method in order to get the canvas content as a png imaghe encoded in base64. WebSockets are HTTP based so we can only send text ! And base64 is a text String! So... we added several lines in our webcam drawing tool in order to grab and send the live pictures : /div[9]/div/pre, reference to undefined name 'syntax' |
Powered by MindTouch Deki Open Source Edition v.8.08 |