afficher une image jpeg sur un canvas

Bonjour,
Je dois afficher une image jpeg sur un canvas de 150x150, le code ci dessous est utilis pour charger l’image sauf qu’elle ne s’affiche pas.
ce code est copi dans Open de canvas.

dim f as FolderItem dim p as Picture f = GetFolderItem("Pictures").Child("fullmoon.jpg") p = f.OpenAsPicture Canvas1.Backdrop = p
si j’ai compris, Pictures dsigne le folder qui contient l’image.

Votre chemin n’existe pas…

f = Specialfolder.Pictures.Child("fullmoon.jpg")[

http://documentation.xojo.com/index.php/SpecialFolder

[quote]Votre chemin n’existe pas…

f = Specialfolder.Pictures.Child(“fullmoon.jpg”)[[/quote]

Aprs l’ajout de cette ligne, l’image est charge dans le canvas, a lexcution elle disparait dans un clignotement incessant de canvas.
Je n’ai pas trouv de tutoriel dans ce sens.

[quote=113052:@Djamel AIT AMRANE]Après l’ajout de cette ligne, l’image est chargée dans le canvas, a l’exécution elle disparait dans un clignotement incessant de canvas.
Je n’ai pas trouvé de tutoriel dans ce sens.[/quote]

A moins que vous ayez du code en plus dans le Paint event du Canvas, je ne vois pas comment après que l’image ait été affichée, elle puisse disparaître dans un clignotement. Ou alors vous avez du code ailleurs qui joue sur la propriété “.Visible” du Canvas ?

Pour vérifier ce qui arrive, essayez d’ajouter fullmoon.jpg au projet, et de le mettre comme backdrop dans l’inspector. Si le même phénomène de clignotement se manifeste, ça ne peut pas être ce court bout de code.

J’ai vrifi partout, le code se trouve uniquement dans lvnement Paint de canvas, l’image est charge a partir de la racine C:\.
via Canvas1.BackDrop.
le format jpg est il rellement tolr par un canvas sous windows ?

[quote=113122:@Djamel AIT AMRANE]J’ai vérifié partout, le code se trouve uniquement dans l’événement Paint de canvas, l’image est chargée a partir de la racine C:\.
via Canvas1.BackDrop.
le format jpg est il réellement toléré par un canvas sous windows ?[/quote]

Il y a quelque chose qui ne vas pas. Dans votre premier post, vous dites avoir le code dans Open. Et c’est bien. Après vous dites qu’il est dans Paint. Cela ne semble pas une bonne idée. Lorsque vous changez le backdrop cela déclenche Pain qui charge une nouvelle fois, vous avez une référence circulaire.

Placez le code dans Open, cela devrait fonctionner.

Avez-vous seulement essayé de placer l’image en backdrop dans l’inspecteur, come je vous le conseillais ? Vous devriez la voir s’afficher sans histoire. Et, oui, JPG fonctionne parfaitement dans un canvas sous Windows.

Ci joint captures ecran du code open ainsi que l’apparence du canvas charg :


C’est quoi l’objet qui est derrière le canvas qui contient la lune ?

Enfin, pour faire court:

  1. Nouveau projet
  2. Ajout Canvas
  3. Ajout code qui charge l’image
  4. Exécution

Si cela marche (et ça marche), alors cherche ce qui vient perturber le fonctionnement du canvas.

Par ailleurs, qu’avez-vous mis dans l’évènement Paint (oui, il y en a undans le canvas cnvlu…

Enfin, pour le testing, mettre des images dans le dossier… Images, oui, pourquoi pas, il faut bien les mettre quelque part. En revanche, il serait plus judicieux de les mettre ailleurs. C’est toi qui défini ce ailleurs (Application Support par exemple; cela dépend du logiciel / de ce que fait le logiciel, de si les images seront “livrées” avec le logiciel, etc.)

Sinon, il y a aussi la solution bateau de mettre l’image dans le Backdrop du canvas.

Une action simple qui laisse l’image en permanence sa place. Si c’est le seul besoin.

[quote]C’est quoi l’objet qui est derrière le canvas qui contient la lune ?

Enfin, pour faire court:

Nouveau projet
Ajout Canvas
Ajout code qui charge l’image
Exécution

Si cela marche (et ça marche), alors cherche ce qui vient perturber le fonctionnement du canvas.

Par ailleurs, qu’avez-vous mis dans l’évènement Paint (oui, il y en a undans le canvas cnvlu…

Enfin, pour le testing, mettre des images dans le dossier… Images, oui, pourquoi pas, il faut bien les mettre quelque part. En revanche, il serait plus judicieux de les mettre ailleurs. C’est toi qui défini ce ailleurs (Application Support par exemple; cela dépend du logiciel / de ce que fait le logiciel, de si les images seront “livrées” avec le logiciel, etc.)[/quote]

Bonjour,
J’ai suivi vos conseils, j’ai chargé l’image via cnvlune.backdrop.
l’image est bien présente sur le canvas, mais a l’exécution n’apparait que le feuille vide.
Concernant l’événement paint de canvas, dois-je mettre quelque chose dedans ?

Concernant l’événement paint de canvas, dois-je mettre quelque chose dedans ?
Quoi ? Il ne devrait même pas apparaître.
Tout code placé dans l’event Paint est exécuté qutant de fois que l’OS demande à l’application de rafraîchir le Canvas. Donc, pour éviter les mouvement d’images (flickering), il faut éviter de mettre du code de là.

C’est quoi l’objet qui est derrière le canvas qui contient la lune ?

un objet posé dans un autre subit l’influence de cet autre. C’est peut-être lui qui inter-agit.

Canvas1.Backdrop = p

Stocke (dans le marbre) l’image p dans le Backdrop du Canvas.

Tiens, pourquoi: Canvas1 ?
(sous-entendu pourquoi pas cnvlune ?)

Comme déjà dit: l’image, si elle est visible à un moment (lors du chargement), doit l’être justqu’à ce qu’elle soit effacée / remplacée par une autre. Dans ce cas, la lune disparaît parce que le code, quelque part l’enlève.
C’est là que se situe le problème.

Je répète la question:
Mais que fait donc l’onjet situé dessous le canvas qui contient la lune sur l’une des copies d’écran (on voit bien les carrés d’agrandissement/réduction du Canvas et un Objet dessous le canvas).)

Si un Canvas est posé sur un autre contrôle, chaque fois que ce controle est redessiné, le Canvas subira une demande de rafraîchissement. [Quelqu’un peut confirmer ?]

Le canvas fonctionne de la manire suivante.

Le Backdrop est toujours affich, et tous ce qui est dessin va apparaitre au dessus.
Quand on veut simplement afficher une image sans se poser de question et faire d’autre chose, le Backdrop suffit, on n’utilise pas l’venement Paint. C’est le plus simple.

Sinon, pour dessiner sur un Canvas, il faut utiliser l’venement PAINT qui va tre appel chaque fois qu’il y a besoin de rafraichir l’image (par exemple quand une fentre tait cach et qu’elle revient au premier plan).
Et oui, le fait de dessiner sur un Canvas peut entrainer un scintillement (surtout si on efface le canvas pour redessiner).
Pour viter un scintillement, une solution est de dessiner sur un image interne et d’afficher cette image directement sans effacer.
Mac et Windows, ne ragissent pas exactement pareil pour l’affichage.

[quote]Tiens, pourquoi: Canvas1 ?
(sous-entendu pourquoi pas cnvlune ?)[/quote]
je n’ai qu’un seul canvas, il s’agit de cnvlune qui est un carr de 160 de cot.
cnvlune est pos sur la feuille il n’interfere avec aucun autre controle.
Ce que je ne comprends pas, pourquoi l’image se charge correctement dans cvnlune ensuite elle disparait a lexcution.

cnvlune est pos sur la feuille
Quelle feuille ? Si tu veux dire la fentre: OK. Mais ce nest pas ce que limage montre ! Cest quoi ce rectangle noir au dessousde la lune ?
En plus, la copie dcran montre clairement que limage a t attribue au Canvas qui a t charg dans le projet.
Je commance y perdre mon latin (qui a 45 ans dge, sans plus aucune pratique depuis).
Elle a deux noms: fullmoon.jpg et fullmoon160x160.jpg (je suppose).

je n’ai qu’un seul canvas, il s’agit de cnvlune qui est un carr de 160 de cot.
Je veux bien, mais le code dit:

Canvas1.Backdrop = p

En plus, si le code est plac dans le Canvas (vnement Open), utilise:

Me.Backdrop = p

Dans ce cas, il nest nul besoin de donner le nom du Canvas. Lorsque tu parles quelquun tu dis Je dsire" et pas "Djamel dsire (image amusante dcrivant le pourquoi.

Si tu veux vraiment tre sr de toi (comprendre comment a marche), ce stade, tu nas quune chose faire: crer un projet de test avec seulement le Canvas et le code qui charge et affiche limage.

Cela va te prendre moins de cinq minutes et tu auras compris (si a marche, sinon, mon chat est pilote de formule 1).

Bien, aprs quelques minutes, voici lemplacement dun projet faisant a et a marche trs bien:

Disponible l (23KB): Projet de test.

propos: le dossier Images (sous Windows XP) se nomme Mes images.

Merci pour le test, sauf que je l’ai dj fait afin de prvenir toute interaction avec autre chose.
A moins que je me suis mal exprim, mon but c’est d’afficher la lune aprs une action.
Est ce normal que la fentre apparaisse vide aprs excution ?
Si oui, je dois donc ajouter une action dclenche par un bouton “afficher lune” par exemple.

Non, ce n’est pas normal. Sauf que :slight_smile:

A mon avis, l’explication est simple. Tu charges ton image partir d’un fichier. Tu mets l’image dans le backdrop. Ca s’affiche.
Ensuite, ta mthode se termine. L’image est supprime de la mmoire. L’image se retire de l’affichage.
C’est un peu les inconvnients du mode objet. Il y a beaucoup de liens et des fois des petites surprises comme a.

Donc si tu veux que a marche :

  • Tu te cres une proprit picture “MonBackdrop” dans la fenetre.
  • Ensuite, quand la mthode est appele. et si “MonBackdrop” est nil. Tu charge la proprit avec l’image contenu dans le fichier.
  • Tu place la proprit dans le Backdrop du Canvas.
  • Quand la mthode est finie, la proprit existe toujours donc ton image aussi.

Sinon, quand tu poses des questions, a serait bien que tu ne nous laisse pas dans le brouillard. Tu mets des copies de ton code. et tu expliques exactement ce que tu fais. On perdrait moins de temps deviner…

dim f as FolderItem dim p as Picture f= Specialfolder.Pictures.Child("fullmoon.jpg") p = f.OpenAsPicture Cnvlune.Backdrop = p

ce bout de code a t plac dans lvnement Open de cnvlune, l’image est place dans un rep situ a la racine c:\Rep\fullmoon160x160.jpg.
A ce stade; via le browser de Backdrop, je cherche l’image fullmoon160x160.jpg que je charge et qui prend place dans le cnvlune,
qui se prsente comme sur la capture cran poste plus haut : “la lune charge” .
franchement, compar a vb6, cette affaire n’est apparemment pas simple.
Je suis oblig de le faire car je suis entrain de convertir vb6 en xojo.

voila ce que je voulais en image :

A partir de la, paint se charge de faire le reste, crer un ombre afin se simuler la phase de la lune.

Merci a tous pour vos diverses contributions.

Je t’ai dj rpondu sur ton pb :slight_smile:

Tu ne dois pas passer par un

dim p as Picture

Car c’est une variable temporaire qui disparait la fin de la mthode.

Il faut utiliser une Picture qui est une proprit de la fentre.

[quote=113738:@Djamel AIT AMRANE]voila ce que je voulais en image :

A partir de la, paint se charge de faire le reste, créer un ombre afin se simuler la phase de la lune.

Merci a tous pour vos diverses contributions.[/quote]
Je disais bien que quelque chose se trouvait sous le Canvas qui affiche la lune.

Par ailleurs:
mon projet affiche l’image et elle ne disparaît pas, sauf si tu quittes l’application… Elle n’est pas visible dans l’IDE parce que ta question était que tu charges l’image depuis le dossier Images (de Windows).
Ceci, si j’ai bien compris, ce qui n’est pas sûr.

Par ailleurs, si on veut voir des femmes nues, libre à toi, mais pas tout le monde. On sais où les trouver; alors, s’il te plait, évite de nous en donner. Des mineur(e)(s) peuvent consulter le forum.

Merci.