IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Différence entre Image.Canvas et Image.Picture.BitMap.Canvas


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Différence entre Image.Canvas et Image.Picture.BitMap.Canvas
    Bonsoir à toutes et à tous,

    A force de chercher d'où viennent les dysfonctionnements que j'observe dans mon application de traitement d'images, je commence sérieusement à m'embrouiller.

    Pouvez-vous me dire quelle est la différence entre un "Image.Canvas" et un "Image.Picture.BitMap.Canvas" ou me donner un lien l'expliquant.

    NOTA : dans mon application que j'avais développée initialement avec DELPHI 6, j'ai commis quelques confusions, prenant l'un pour l'autre sans que n'apparaisse le moindre problème !

    Merci de votre aide.

    Pierre

  2. #2
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Je crois bien que, dans ce cas précis, les deux Canvas pointent au même endroit.

    Sinon, dans la logique, Canvas du picture serait le canvas de l'image stockée dans Picture, tandis que l'autre serait le canvas du composant Image, qui peut être différent de l'image stockée (redimensionnée, etc.)

    Je me souviens avoir lu un tuto pour modifier le canvas d'un TImage sans modifier l'image qu'il contient ... Je ne sais malheureusement plus ou il se trouve.

    Bonne chance

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Sous Delphi 6 :

    TImage.Canvas retourne le Canvas de TImage.Picture.Bitmap en créant le Bitmap s'il n'existe pas ou en retournant un exception si l'image contient autre chose qu'un Bitmap (JPEG, ...)

    Il faudrait vérifier le code de Lazarus pour voir s'il réagit de même.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci mick605 et Paul Toth pour ces précisions.

    Vu les confusions que j'ai faites dans mon logiciel DELPHI, ce doit être plus que vrai. La transposition sous Lazarus donnant le même comportement, ce doit être aussi vrai dans Lazarus (ce qui serait logique).

    Je voudrais profiter de ce fil pour poser une autre question au sujet du Canvas qui m'a toujours posé des problèmes sémantiques.

    Pour moi, dans la série TImage, TPicture, TBitMap, TCanvas, les points qui définissent l'image à traiter sont dans le BitMap et uniquement dans le bitMap. et, selon moi, le Canvas n'est autre chose que le nom de la boîte à outils permettant de modifier le contenu du BitMap.

    Dans la littérature, on parle de dessiner dans le Canvas, ce qui voudrait dire que le Canvas est un autre endroit de stockage de l'image. Cela va à l'encontre de l'idée que je m'en fait.

    Pouvez-vous m'éclaircir les idées.

    Merci de votre aide.

    Pierre

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Pour moi, le Canvas d'un objet est la représentation graphique visuelle de l'objet. Beaucoup de composants graphiques (voire tous) ont des canvas: les boutons, les Forms, etc... De ce que je comprends, le canvas du TImage est le rendu visuel du composant TImage. Le cas spécial pour TImage est que son canvas pointe sur le canvas de l'image qu'il contient.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  6. #6
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par wormful_sickfoot Voir le message
    Pour moi, le Canvas d'un objet est la représentation graphique visuelle de l'objet. ...
    Cette définition me convient bien aussi. Cependant, concrètement, c'est quoi l'objet en question? Cet objet, c'est une image ; et elle stockée physiquement où ? Pour moi, c'est dans le BitMap.

    Quand je dis que Canvas est une boîte à outils pour modifier le BitMap, c'est parce qu'on utilise les méthodes de Canvas pour modifier le BitMap. Mais peut-être que je me trompe ?

    Cordialement.

    Pierre

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Cette définition me convient bien aussi. Cependant, concrètement, c'est quoi l'objet en question? Cet objet, c'est une image ; et elle stockée physiquement où ? Pour moi, c'est dans le BitMap.

    Quand je dis que Canvas est une boîte à outils pour modifier le BitMap, c'est parce qu'on utilise les méthodes de Canvas pour modifier le BitMap. Mais peut-être que je me trompe ?

    Cordialement.

    Pierre
    Le Canvas est un moyen de dessiner.

    Si tu as un Bitmap derrière le Canvas, les données sont en effet stockées dans un Bitmap, et pour peu que ce bitmap soit associé à un TImage il est de plus affiché sur le Canvas de son parent : Canvas.Draw(0,0,Bitmap);

    Le Canvas d'une fiche est un accès à l'écran, celui-ci n'est pas persistant, exemple sur le OnClick d'une fiche tu peux dessiner un rectangle sur son canvas...si tu redimensionnes la fiche ou fait passer une autre fenêtre devant, le rectangle ne sera pas redessiné, c'est pourquoi on fait ce genre de chose dans OnPaint car il faut le redessiner aussi souvent que nécessaire.

    Avec l'imprimante c'est encore plus frappant tu peux utiliser le même code pour dessiner sur une fiche ou imprimer sur Printer.Canvas (il faut juste préparer l'impression avant avec BeginDoc etc...).

    En fait le Canvas vient directement des fonctions GDI de Windows (graphics device interface) qui permet d'utiliser les mêmes fonctions graphiques sur différents device.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci Paul pour ces éclaircissements.

    Cordialement.

    Pierre

  9. #9
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Ceci dit, ta définition n'est pas complètement fausse non plus, ce n'est pas incompatible : on peut effectivement le voir comme une "boîte à outils" permettant de manipuler des images. Comme l'explique Paul, sous Windows, TCanvas est un objet qui "encapsule" les fonctions GDI de Windows, permettant ainsi de s'affranchir de "mettre les mains dans le cambouis" en restant dans le cadre de la programmation objet (jusqu'au jour où le presse-papiers ne marche plus... )

    Sous Lazarus, le concept a bien sûr été étendu, puisque l'objet TCanvas fera appel aux fonctions GDI sous Windows, mais aussi aux fonctions Gnome sous Linux, Quartz sous Mac OS, et ainsi de suite. Là, on voit bien l'intérêt de la programmation orientée objet : elle permet clairement de s'affranchir d'une connaissance technique pointue de l'implémentation. Quel que soit l'environnement, les méthodes et propriétés publiques de TCanvas resteront les mêmes, c'est "magique" ! Mais ce n'est pas facile à implémenter, donc le respect s'impose vis-à-vis des développeurs de Lazarus. Quelques bugs encore présents sont bien naturels, compte-tenu de l'ambition du projet.

    Maintenant, s'agissant de TImage.Canvas vs TImage.Picture.Bitmap.Canvas, j'aurais moi-même appris quelque chose. Je ne savais pas que le premier n'était qu'une copie du deuxième. Il faut dire que je ne me suis jamais vraiment intéressé au composant TImage au point de jeter un oeil sur son code source.

  10. #10
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par CapJack Voir le message
    ... Mais ce n'est pas facile à implémenter, donc le respect s'impose vis-à-vis des développeurs de Lazarus. Quelques bugs encore présents sont bien naturels, compte-tenu de l'ambition du projet. ...
    Ce qui m'étonne, c'est que les "anomalies" que j'ai rencontrées sont somme toute assez basiques et comme Lazarus existe déjà depuis pas mal d''années, on aurait pu penser que cela était réglé.

    Maintenant, lorsqu'on suit le cheminement à travers toutes les unités, on s'aperçoit que "sous le capot", c'est vraiment très compliqué.

    De toutes façons, je respecte énormément ces personnes qui s'investissent dans de tels projets.

    Une anecdote qui m'a couté toute une journée avant de trouver par coup de bol la solution (mais ça foire aussi bien avec DELPHI 6 que Lazarus) :

    Dans une procédure, où je fais du flou local à l'aide de la lecture/écriture de Pixels[X, Y], l'image est transmise par un "Sender: TObject", j'encadre toutes mes opérations de :

    with TImage(Sender).Picture.BitMap, Canvas

    et j'ai une instruction :

    L:= Width qui en débogage me donne la bonne valeur.

    Dans ces conditions, le résultat est catastrophique.

    J'ai remplacé cette instruction par :

    L:= TImage(Sender).Picture.BitMap.Width

    et par miracle, tout fonctionne bien !!

    Je ne pensais pas que la simple "lecture" d'une valeur puisse mettre à mal tout le traitement. Je n'ai rien compris, mais ça marche.


    Cordialement.

    Pierre

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with TImage(Sender).Picture.BitMap, Canvas
    L:= Width; // Width de BitMap ou Canvas ?
    attention aux ambigüités dans les with...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  12. #12
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par ChPr Voir le message
    [I]Une anecdote qui m'a couté toute une journée avant de trouver par coup de bol la solution (mais ça foire aussi bien avec DELPHI 6 que Lazarus) : ...
    C'est une des raisons qui me pousse a ne pas utiliser l'instruction with

    Citation Envoyé par CapJack
    Maintenant, s'agissant de TImage.Canvas vs TImage.Picture.Bitmap.Canvas, j'aurais moi-même appris quelque chose. Je ne savais pas que le premier n'était qu'une copie du deuxième.
    Enfin, ce n'est pas vraiment une copie, c'est simplement que les pointeurs pointent au même endroit ...

  13. #13
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with TImage(Sender).Picture.BitMap, Canvas
    L:= Width; // Width de BitMap ou Canvas ?
    attention aux ambigüités dans les with...
    Je suis bien d'accord qu'il y a ambiguïté. Ce qui me surprend, c'est que mon instruction n'est qu'une lecture qui plus est donne le même valeur avec ou sans le "with". Par ailleurs le dysfonctionnement n'est pas dû au traitement postérieur (je l'ai supprimé) mais à cette instruction en elle même ??

    Cordialement.

    Pierre

  14. #14
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Enfin, ce n'est pas vraiment une copie, c'est simplement que les pointeurs pointent au même endroit ...
    Oui oui, j'avais bien compris, je me suis mal exprimé, je voulais dire "copie du pointeur".
    Dans ma pauvre vieille caboche, les pointeurs ont tendance à se dé-référencer automatiquement aussi !

  15. #15
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with TImage(Sender).Picture.BitMap, Canvas
    L:= Width; // Width de BitMap ou Canvas ?
    attention aux ambigüités dans les with...
    à ma connaissance les Canvas n'ont pas de largeur
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #16
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    alors j'ai dit une bêtise...

    il m'est arrivé (je ne retrouve pas la référence) que le compilo se paume dans le stockage d'une référence, à la faveur d'un with, peut-être : il finissait par écraser le registre où il conservait l'adresse : ça peut être une piste de recherche, en trace dans la fenêtre CPU. (l'ajout de code de débugage à la recherche du problème pouvant qui plus est fournir un code asm différent)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  17. #17
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    à ma connaissance les Canvas n'ont pas de largeur
    Avec Lazarus 0.9.30 et Windows XP (je suppose q'avec Linux c'est pareil), les instructions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      L:= Image.Picture.Bitmap.Canvas.Width;
      L:= Image.Canvas.Width;
    se compilent et s'exéctent sans sourciller !!!

    Je ne suis pas allé voir ce que ça donnait en interne.

    Cordialement.

    Pierre

  18. #18
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    En effet, après vérification le TCanvas de Lazarus possède une largeur, mais ce n'est pas le cas de celui de Delphi, même en XE2
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. [Débutant] Manipulation d'images : intégrer une image dans une image
    Par noscollections dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2014, 11h51
  2. comment mesurer la différence entre 2 images
    Par shawty dans le forum Imagerie
    Réponses: 1
    Dernier message: 19/10/2007, 10h58
  3. Calcul de la différence entre 2 images
    Par hanane78 dans le forum Images
    Réponses: 6
    Dernier message: 28/09/2007, 23h40
  4. Faire la différence entre texte et photos sur une image
    Par NiuAge dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 23/02/2007, 23h45
  5. Différence entre deux images
    Par Mookie dans le forum 2D
    Réponses: 3
    Dernier message: 13/04/2006, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo