1. #1
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut Trouver, découvrir une propriété non publiée

    Bonjour,

    aujourd'hui c'est un truc pas mal tordu (et qui me torture bien bien les méninges), alors je pose d'abord le contexte, comme ça vous pourrez y revenir facilement après avoir lu la question plus bas :

    La vie, de bas en haut, dans les deux cas :
    1- déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type  TFPCustomImage = class(TPersistent) // FPImage
    type  TLazIntfImage = class(TFPCustomImage) // intfGraphics
    var   DestIntfImage: TLazIntfImage; // mon projet / mon unité 
     
    //et dans mon code / ma procédure il y a
      DestCanvas := TLazCanvas.Create(DestIntfImage); // on cherche DestInfImage
    --start here et remonte--

    2- utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type  TFPCustomImage = class(TPersistent) // FPImage
    type  TFPPixelCanvas = class (TFPCustomCanvas) // FPPixlCanv
    type  TFPImageCanvas = class (TFPPixelCanvas) // FPImgCanvas
    type  TLazCanvas = class(TFPImageCanvas) // LazCanvas
    var   DestCanvas: TLazCanvas; // mon projet / mon unité 
     
    //et dans mon code / ma procédure il y a
      DestCanvas.Interpolation := ... // le mot "Interpolation" est introuvable dans TLazCanvas et dans ses ancêtres !?
    --start here et remonte--

    On notera qu'on part de deux points différents (TLazCanvas ci-dessus et TLazIntfImage pour le point 1) mais qu'on se retrouve à la même arrivée : TPersistent, par le biais des sacs de nœuds indémêlables.


    L'idée, l'action que je cherche à réaliser, c'est d'avoir des infos sur le filtre d'interpolation qui est en service au moment où StretchDraw est appelé.
    Dans le tuto du web, on lit ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      ...
      //Prepare the source
      SourceIntfImage := TLazIntfImage.Create(0, 0);
      SourceIntfImage.LoadFromBitmap(SourceBitmap.Handle, 0);
     
      // Execute the stretch draw via TFPSharpInterpolation
      DestCanvas.Interpolation := TFPSharpInterpolation.Create; // ça !
      DestCanvas.StretchDraw(0, 0, DestWidth, DestHeight, SourceIntfImage); // et son utilisation
     
      // Reload the image into the TBitmap
      ...
    où l'on voit bien la mise en place du filtre FPSharp, ok, mais j'ai quand même noté dans un coin de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      // si pas DestCanvas.Interpolation := TUnFiltre.Create,
      // DestCanvas.StretchDraw utilisera Mitchell par défaut (voir fpcanvas.inc ligne 720)
    et on peut lire dans fpcanvas.inc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    procedure TFPCustomCanvas.StretchDraw(x, y, w, h: integer; source: TFPCustomImage);
    var i : TFPCustomInterpolation;
        FreeInterpolation : boolean;
        IP : TFPCustomInterpolation;
    begin
      FreeInterpolation := not assigned (FInterpolation);
      if FreeInterpolation then
        IP := TMitchelInterpolation.Create ////////// <<<<<<<<<<<
      else
        IP := FInterpolation;
      try
        with IP do
          begin
          Initialize (source, self);
          Execute (x,y,w,h);
          end;
      finally
        if FreeInterpolation then
          IP.Free;
      end;
    end;
    Sauf que...
    Sauf que si je mets un ShowMessage(DestCanvas.Interpolation.ClassName); avant l'utilisation DestCanvas.StretchDraw(0, 0, DestWidth, DestHeight, SourceIntfImage); je me prends un SIGSEGV tellement sévère que même Ctrl-F2 ne rattrape pas l'EDI : il me faut tuer le process en mémoire en passant par une autre console (ouf, merci Linux !), le bureau est complètement bloqué, c'est du lourd, du très lourd, faites attention si vous voulez jouer avec ça !
    Impossible donc de connaître le filtre utilisé si je ne rajoute pas DestCanvas.Interpolation := TUnFiltre.Create; et si je mets ça, ça ne sert à rien ensuite de demander qui est le filtre.

    Voilà, je ne sais pas si c'est bien clair (pour moi ça l'est) : comment savoir si un filtre est prêt à être utilisé alors que je n'ai pas appelé la proc qui va le définir ?
    Car, in fine, il doit bien l'être, défini, ce filtre par défaut, puisqu'il fonctionne, puisque la proc fonctionne sans son appel et donne une image correspondant aux caractéristiques de Mitchell.

    Une idée, quelqu'un, quitte à aller bidouiller dans des .pas, .pp, .inc où je ne mets habituellement pas mon clavier ?

    Perso, je ne vois absolument pas quoi aller bidouiller, et comment : je ne vous en voudrai pas si vous donnez votre langue au chat, mais vous pourrez toujours me dire comment vous appréciez ma nouvelle petite (150x100) image de test, agrandie à 300x200 à gauche avec le filtre Sharp (appel en place), à droite avec Mitchell (appel à Sharp commenté, remarquez combien le damier est moche) :
    Nom : avec-sans_create.png
Affichages : 75
Taille : 138,1 Ko

    Merci,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

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

    Informations forums :
    Inscription : mars 2005
    Messages : 2 883
    Points : 7 676
    Points
    7 676

    Par défaut

    Bonjour,
    La propriété par défaut est créée au moment de l'utilisation. Tu ne peux donc lui demander son nom avant. Alors essaye de sécuriser ton appel par un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if Assigned(DestCanvas.Interpolation)
    then S:=DestCanvas.Interpolation.ClassName
    else S:='Mitchell';
    Et si le getter interne plante (je n'ai pas trouvé le code qui fait remonter la propriété), il suffit de l'encadrer d'un try pour remonter son nom ou celui par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try
      if Assigned(DestCanvas.Interpolation) then // on doit pouvoir commenter cette ligne !
      S:=DestCanvas.Interpolation.ClassName;
    except
      S:='Mitchell';
    end;
    Delphi 5 Pro - Delphi 10.1 Berlin Starter Edition - CodeTyphon 6.15 sous Win 7 et 5.20 sous Ubuntu 14.04
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Bonsoir, grand gourou des machins emberlificotés

    J'ai donc fait comme tu le suggérais :
    Citation Envoyé par tourlourou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try
      if Assigned(DestCanvas.Interpolation) then // on doit pouvoir commenter cette ligne ! <- Ça ne risque pas ! Testé, 
      S:=DestCanvas.Interpolation.ClassName; // SIGSEGV sévère et quand je récupère l'EDI, c'est cette ligne qui est en surbrillance
    except
      S:='Mitchell';
    end;
    ShowMessage(S); // m'affiche une fenêtre vide :-(
    Bon, ben je crois que c'est plus ou moins mort, non ?

    Ou alors il faut intervenir dans fpcanvas.inc, par là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var i : TFPCustomInterpolation;
        FreeInterpolation : boolean;
        IP : TFPCustomInterpolation;
    begin
      FreeInterpolation := not assigned (FInterpolation);
      if FreeInterpolation then
        IP := TMitchelInterpolation.Create
      else
        IP := FInterpolation;
    mais je ne sais pas encore trop comment, d'autant plus qu'il est curieux, leur code, avec 3 variables dont 2 seulement sont utilisées, et je n'ai pas trouvé qui "préparait" FInterpolation...

    Tout est là (j'en ai enlevé pour alléger) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      TFPCustomCanvas = class(TPersistent)
      private
        FInterpolation : TFPCustomInterpolation;
      public
        property Interpolation : TFPCustomInterpolation read FInterpolation write FInterpolation;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 2 883
    Points : 7 676
    Points
    7 676

    Par défaut

    J'avais lu trop rapidement...

    Si on n'affecte pas DestCanvas.Interpolation, il crée à côté une méthode par défaut.

    Reste à tester (s'il est assigné) grâce à des if DestCanvas.Interpolation is TMachinInterpolation then S:='Machin'; : pas beau, mais efficace ?
    Delphi 5 Pro - Delphi 10.1 Berlin Starter Edition - CodeTyphon 6.15 sous Win 7 et 5.20 sous Ubuntu 14.04
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Responsable Delphi

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    février 2013
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2013
    Messages : 1 041
    Points : 12 023
    Points
    12 023
    Billets dans le blog
    33

    Par défaut

    Bonjour Jipété,

    Déjà, ton filtre est effectivement bien plus joli, et il n'y a même pas à regarder le damier pour s'en rendre compte .

    Ensuite, je n'essayerais pas de bidouiller les procédures en place, surtout quand elles utilisent des champs inaccessibles (car privés) comme FInterpolation. Faute de savoir si ce champ a été initialisé, c'est le plantage quasi assuré (d'où le test interne avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FreeInterpolation := not assigned (FInterpolation)
    ).

    L'accès à la propriété Interpolation sous la forme proposée me paraît problématique : je chercherais du côté d'un transtypage, mais en même temps, ne serait-ce pas modifier la classe ? Avec les 32° qui règnent dans ma région à 21 heures, j'avoue que je préfèrerais un petit programme à tester que des bouts de code qu'il faut que je lie entre eux ...

    Personnellement, je forcerais le filtre, y compris Mitchel. C'est le seul moyen simple et efficace que je vois pour maîtriser son existence et son application.
    Sinon, il faudrait réécrire l'unité en dérivant une classe de TFPCustomCanvas ou en modifiant cette classe pour rendre FInterpolation protected, par exemple. Franchement, ce serait prendre le risque inutile de voir quelqu'un souhaiter s'amuser avec elle .
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  6. #6
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Bonsoir les copains

    (t'as raison, Gilles, fait pas froid ce soir...)

    Partons à l'envers : l'idée, c'était de compléter cette magnifique ihm
    Nom : resampling.png
Affichages : 56
Taille : 99,1 Ko
    par la zone B tout en bas car, à l'heure actuelle je peux monter-descendre le curseur de zoom de l'image drag-n-dropée (merci Gilles !) mais je ne sais pas quel est le filtre utilisé (bon, oui, je m'en doute, on dirait du Sharp [le damier parfait] mais je n'ai aucune certitude car ce n'est pas la même manière de faire que pour les tests à propos desquels je vous ai bien pris la tête il y a 10 jours [merci Yves !], regardez le code du zoom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      with tmp do begin // tmp c'est un TBitmap
        Width  := pnl4images.Width; // le TImage imgDisplay est posé sur un TPanel et alClient
        Height := pnl4images.Height;
        Canvas.StretchDraw(rect(0,0,Width,Height), bmpOrigine);
        //imgDisplay.Picture.Bitmap.Assign(tmp); // pas bon pour les jpeg
        imgDisplay.Picture.Assign(tmp);
        Free;
      end;
    )
    Donc là c'est un TBitmap.Canvas.StretchDraw pur et dur sans notion d'interpolation, et j'envisageais de remplacer ça par l'autre manière de faire, celle dont j'ai mis l'extrait en début de discussion et qu'on peut retrouver sur le wiki.

    Ça n'est peut-être pas une bonne idée ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 2 883
    Points : 7 676
    Points
    7 676

    Par défaut

    Que droppes-tu ? Un objet, probablement un TImage ? Dont tu souhaites savoir quelle interpolation a été utilisée au StretchDraw pour resizer l'image de départ ?
    Or DestCanvas est l'objet qui dispose de l'information au moment du StretchDraw, puis il est libéré (dans le code du tuto) après l'avoir collé dans un Bitmap affecté ensuite au TImage.
    Je pense donc qu'on a perdu à partir de ce seul TImage la notion du filtre utilisé.
    Si c'est bien le schéma de ton appli, il faudra trouver un moyen de rendre cette information persistante, et attachée à l'objet droppé.
    Sinon, c'est que je me suis fourvoyé dans l'interprétation de ton problème, ou qu'il manque des informations pour analyser ton besoin et ses méthodes de résolution.
    Delphi 5 Pro - Delphi 10.1 Berlin Starter Edition - CodeTyphon 6.15 sous Win 7 et 5.20 sous Ubuntu 14.04
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Salut, Yves,
    Citation Envoyé par tourlourou Voir le message
    Que droppes-tu ? Un objet, probablement un TImage ?
    Non, bêtement un fichier pris depuis l'explorateur de fichiers (il y a son nom en bas à gauche -- et pour m'y retrouver, les noms de cette catégorie de fichiers, c'est plutôt les dimensions et autres, )

    Citation Envoyé par tourlourou Voir le message
    Dont tu souhaites savoir quelle interpolation a été utilisée au StretchDraw pour resizer l'image de départ ?
    va être utilisée par

    Citation Envoyé par tourlourou Voir le message
    Si c'est bien le schéma de ton appli, il faudra trouver un moyen de rendre cette information persistante, et attachée à l'objet droppé.
    Sinon, c'est que je me suis fourvoyé dans l'interprétation de ton problème, ou qu'il manque des informations pour analyser ton besoin et ses méthodes de résolution.
    En fait, dans la mesure où on peut s'en passer (c'était un petit plus, une espèce de cerise sur le gâteau), je crois bien qu'on va laisser tomber.

    Désolé pour le dérangement et bon dimanche,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Responsable Delphi

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    février 2013
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2013
    Messages : 1 041
    Points : 12 023
    Points
    12 023
    Billets dans le blog
    33

    Par défaut

    Citation Envoyé par Jipété Voir le message
    va être utilisée par
    Bonjour,

    C'est décidément ce qui me gêne. Du coup, je réitère : quand bien même, tu saurais en ayant farfouillé dans le code que le filtre utilisé par défaut est Mitchel, comme tu ne peux pas anticiper sur la nature réelle de la propriété Interpolation, tu devrais prendre les choses en main et décider du filtre.

    As-tu regardé du côté de BGRABitmap qui offre une ribambelle de possibilités de filtres et autres outils graphiques ?
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  10. #10
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 2 883
    Points : 7 676
    Points
    7 676

    Par défaut

    Tu souhaites donc savoir quelle interpolation va été utilisée par l'objet DestCanvas lors du StretchDraw déclenché par le zoom pour resizer l'image que tu viens d'ouvrir d'après le nom de fichier juste droppé ?

    J'imagine donc que l'objet DestCanvas :
    1- n'est pas local à la procédure qui applique le zoom et persiste d'un appel à l'autre (il n'est pas libéré).
    2- peut recevoir un filtre ou un autre, à tout moment (selon une liste à cocher ou cliquer ?)

    Si son interrogation directe ne fonctionne pas (reste à trouver pourquoi), un palliatif demeure de stocker l'information au moyen d'une variable globale dans le même événement qui colle le filtre choisi au DestCanvas (avec par défaut la valeur 'Mitchel').
    Delphi 5 Pro - Delphi 10.1 Berlin Starter Edition - CodeTyphon 6.15 sous Win 7 et 5.20 sous Ubuntu 14.04
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  11. #11
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Citation Envoyé par tourlourou Voir le message
    Tu souhaites donc savoir quelle interpolation va été utilisée par l'objet DestCanvas lors du StretchDraw déclenché par le zoom pour resizer l'image que tu viens d'ouvrir d'après le nom de fichier juste droppé ?
    Oui, sauf que je réalise tout d'un coup qu'il n'y a pas de DestCanvas clairement défini dans la proc de zoom, juste un appel à la fonction StretchDraw, comme montré hier à 22h13.

    Citation Envoyé par tourlourou Voir le message
    J'imagine donc que l'objet DestCanvas :
    1- n'est pas local à la procédure qui applique le zoom et persiste d'un appel à l'autre (il n'est pas libéré).
    2- peut recevoir un filtre ou un autre, à tout moment (selon une liste à cocher ou cliquer ?)
    Et quand je fais mes tests de filtres, j'utilise un DestCanvas, oui (local à la procédure), mais il s'agit bien de deux choses différentes, même si l'ihm peut induire en erreur car on voit les deux choses ensemble.
    Le point 2 c'est tout-à-fait ce sur quoi on a bossé il y a 10 jours. Et ça fonctionne tip-top.

    Le coup du zoom c'est un petit plus.

    Bonjour, Gilles,

    Décidément l'incompréhension règne en maître, dans cette discussion,
    Pour repartir de ta citation, je souhaite savoir quelle interpolation va être utilisée par StretchDraw pour resizer l'image de départ sans être obligé de farfouiller dans le code pour la bonne et simple raison que si le code change un jour, et que les gens de Lazarus décident d'utiliser Lanczos par défaut au lieu de Mitchell, j'aurai l'air bien couillon avec mon StaticText indiquant encore et toujours "Filtre utilisé : Mitchell".
    C'est tout.

    Mais encore une fois, ce n'est vraiment pas important et, en ce qui concerne les compos BGRA, j'avais jeté un œil viteuf', ils n'ont pas plus que ce que j'ai avec ext_interpolation et le .pas trouvé dans Double Commander, alors bon.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  12. #12
    Membre averti

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 204
    Points : 436
    Points
    436

    Par défaut

    Salut d'après ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    procedure TFPCustomCanvas.StretchDraw(x, y, w, h: integer; source: TFPCustomImage);
    var i : TFPCustomInterpolation;
        FreeInterpolation : boolean;
        IP : TFPCustomInterpolation;
    begin
      FreeInterpolation := not assigned (FInterpolation);
      if FreeInterpolation then
        IP := TMitchelInterpolation.Create
      else
        IP := FInterpolation;
      try
        with IP do
          begin
          Initialize (source, self);
          Execute (x,y,w,h);
          end;
      finally
        if FreeInterpolation then
          IP.Free;
      end;
    L'affectation de Mitchell est donc faite dynamiquement et en locale. Tu n'as aucun contrôle dessus et tu ne pourras pas retrouver cette informations après le lancement de la procedure. Pour ma part je me prendrais pas la tête je désignerai d'embler moi même le filtre par défaut que je souhaiterai utilisé. Lanzcos à la place de Mitchell par exemple. De plus si il y a changement dans le code dans source de fpc tu t'en balance.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  13. #13
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Salut,
    Citation Envoyé par BeanzMaster Voir le message
    Pour ma part je me prendrais pas la tête je désignerais d'emblée moi-même le filtre par défaut que je souhaiterais utilisé. Lanzcos à la place de Mitchell par exemple.
    Comment ?
    En intervenant dans la proc, alors ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    procedure TFPCustomCanvas.StretchDraw(x, y, w, h: integer; source: TFPCustomImage; filter: TFPCustomInterpolation); // ajout là ?
    var i : TFPCustomInterpolation;
        FreeInterpolation : boolean;
        IP : TFPCustomInterpolation;
    begin
      FreeInterpolation := not assigned (FInterpolation);
      if FreeInterpolation then
    //    IP := TMitchelInterpolation.Create // commenter ici ?
        IP := filter.Create  // rajouter ça ?
      else
        IP := FInterpolation;
      try
        with IP do
          begin
          Initialize (source, self);
          Execute (x,y,w,h);
          end;
      finally
        if FreeInterpolation then
          IP.Free;
      end;
    On est bien d'accord que c'est pas mieux que d'essayer de faire remonter l'info sur le filtre utilisé, dans un cas comme dans l'autre faut mettre les mains dans le cambouis jusqu'aux coudes

    C'est bien d'avoir participé, merci à toi, mais je répète encore une fois que ce n'est pas grave pas important et qu'on peut laisser tomber,
    Terrible, cette chaleur,

    Maintenant, ce qui est curieux, c'est cette var i : TFPCustomInterpolation; inutilisée dans la proc, et qui fait penser à une boucle sur une... liste de filtres d'interpolation ! Tiens donc !
    Faudrait leur poser la question à eux ! (nan j'déconn')
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #14
    Membre averti

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 204
    Points : 436
    Points
    436

    Par défaut

    Je pensais plutôt ici :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with tmp do begin // tmp c'est un TBitmap
        Width  := pnl4images.Width; // le TImage imgDisplay est posé sur un TPanel et alClient
        Height := pnl4images.Height;
        Canvas.Interpolation := monfiltrepardefault // si j'ai pigé elle existe cette propriété non ?
        Canvas.StretchDraw(rect(0,0,Width,Height), bmpOrigine);
        //imgDisplay.Picture.Bitmap.Assign(tmp); // pas bon pour les jpeg
        imgDisplay.Picture.Assign(tmp);
        Free;
      end;
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  15. #15
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Je pensais plutôt ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with tmp do begin // tmp c'est un TBitmap
        Width  := pnl4images.Width; // le TImage imgDisplay est posé sur un TPanel et alClient
        Height := pnl4images.Height;
        Canvas.Interpolation := monfiltrepardefault // si j'ai pigé elle existe cette propriété non ?
        Canvas.StretchDraw(rect(0,0,Width,Height), bmpOrigine);
        //imgDisplay.Picture.Bitmap.Assign(tmp); // pas bon pour les jpeg
        imgDisplay.Picture.Assign(tmp);
        Free;
      end;
    Bien vu !
    Je n'avais pas imaginé une seule seconde que cette construction pourrait compiler, puisque je partais du tuto où il est question d'un DestCanvas qui est un TLazCanvas et pas un TBitmap.Canvas...
    Alors oui, en remontant très haut dans les sources à coups de Ctrl-Clic, on se retrouve, en partant de l'un comme de l'autre, au sommet avec TFPCustomCanvas = class(TPersistent) !
    Tout ça n'est qu'un énorme plat de spaghettis tout bien embrouillés, comment peut-on s'y retrouver...

    Bon, je vais étudier cette découverte, d'autant plus qu'à l'extrême limite, pour ne pas bidouiller dans le fichier officiel, je peux très bien me faire une copie sous un autre nom de la procédure StretchDraw dans une unité à moi, où je pourrai la triturer selon mon bon vouloir, hé hé hé !

    Bien joué, BM
    Vais réfléchir à tout ça,

    EDIT : presque tout barré, le lendemain...
    Lire la raison dans le post suivant /EDIT
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    Citation Envoyé par Jipété Voir le message
    pour ne pas bidouiller dans le fichier officiel, je peux très bien me faire une copie sous un autre nom de la procédure StretchDraw dans une unité à moi, où je pourrai la triturer selon mon bon vouloir, hé hé hé !
    Vous avez vu, j'ai tout barré dans mon précédent post !
    Car si, oui, ça compile, ça ne sert à rien de mettre un filtre là puisque ensuite le StretchDraw met le sien à la place. Testé et vérifié.

    La seule option qui reste c'est celle quotée ci-dessus.

    Allez, bonne journée,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  17. #17
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 2 883
    Points : 7 676
    Points
    7 676

    Par défaut

    Plus je lis, moins je comprends... Je m'emmêle entre des notions de Bitmap, StretchDraw natif (du BitMap ?) et à la sauce interpolation ; objet TLazCanvas ou TLazIntfImage ; etc.

    Récupérer le nom de la méthode d'interpolation assignée à un TLazCanvas fonctionne sans problème.

    Si au final, ton seul souhait est de maîtriser la méthode d'interpolation par défaut du TBitMap.StretchDraw, qui est clairement locale et volatile, il suffit de l'imposer en l'assignant à la propriété Interpolation, comme l'ont suggéré Gilles et BeanzMaster, ce qui est infiniment plus simple que de redéfinir une méthode.

    En outre, vu son code, le StretchDraw ne redéfinit pas la méthode s'il y en a une assignée : si c'est ce que tu observes, mets-nous un code qui le démontre (ou le laisse supposer).
    Delphi 5 Pro - Delphi 10.1 Berlin Starter Edition - CodeTyphon 6.15 sous Win 7 et 5.20 sous Ubuntu 14.04
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  18. #18
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 654
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 654
    Points : 7 765
    Points
    7 765

    Par défaut

    J'ai beau dire qu'on va fermer le bistrot, y en a toujours un qui vient remettre une pièce dans le juke-box,

    Citation Envoyé par tourlourou Voir le message
    Plus je lis, moins je comprends... Je m'emmêle entre des notions de Bitmap, StretchDraw natif (du BitMap ?) et à la sauce interpolation ; objet TLazCanvas ou TLazIntfImage ; etc.
    C'est normal, tout est emberlificoté...

    Citation Envoyé par tourlourou Voir le message
    Si au final, ton seul souhait est de maîtriser la méthode d'interpolation par défaut du TBitMap.StretchDraw, qui est clairement locale et volatile, il suffit de l'imposer en l'assignant à la propriété Interpolation, comme l'ont suggéré Gilles et BeanzMaster, ce qui est infiniment plus simple que de redéfinir une méthode.
    C'est ce que j'ai cru aussi, mais non : hier soir tard j'ai tenté ça dans mon suivi du trackbar de zoom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      with tmp do begin // tmp c'est un TBitmap
        Width  := pnl4images.Width; // le TImage imgDisplay est posé sur un TPanel et alClient
        Height := pnl4images.Height;
        Canvas.Interpolation := TMitchellInterpolation.Create; // ajout suite post BeanzMaster
        Canvas.StretchDraw(rect(0,0,Width,Height), bmpOrigine);
        imgDisplay.Picture.Assign(tmp);
        Free;
      end;
    et comme dit ce matin, aucune influence sur le rendu de l'image zoomée.

    Que dire de plus ? Que je peux bien lui passer n'importe quel filtre, c'est ensuite StretchDraw qui prend la main avec ses paramètres et paf !

    Citation Envoyé par tourlourou Voir le message
    En outre, vu son code, le StretchDraw ne redéfinit pas la méthode s'il y en a une assignée : si c'est ce que tu observes, mets-nous un code qui le démontre (ou le laisse supposer).
    Voir ci-dessus.

    - - -
    Bon, de toute façon, je suis en train de tout repenser : je vais être obligé d'utiliser, pour le curseur de zoom, la même mécanique d'interpolation que celle utilisée pour les tests des filtres, l'idée derrière tout ça étant que je veux pouvoir zoomer une image que j'ai volontairement resamplée avec tel ou tel filtre (pour voir leurs effets, comment ils bossent, etc.), mais sans que le filtre de zoom ne rajoute ses propres distorsions !
    L'écueil est là.

    Et tout ça pour au bout du compte maîtriser parfaitement les logiciels d'édition d'images et le choix de ces filtres de resampling car, je l'ai vu au cours de mes pérégrinations sur le web, on peut facilement se retrouver avec des artefacts en formes de cercles concentriques du plus mauvais effet dans l'image finale, et il se trouve qu'encore tout récemment, en regardant des plaques de verre numérisées, je suis tombé sur ces cercles concentriques !
    Nom : artefacts_dans_ciel.jpg
Affichages : 28
Taille : 18,7 Ko
    (bon, là j'ai forcé le contraste pour bien les montrer, mine de rien c'est du ciel qu'on voit, là...)

    Plaques numérisées par un boulet inculte ? Nobody knows, mais surtout je ne veux pas que ça m'arrive, et c'est pourquoi je veux maîtriser ces filtres !

    Tout est dit, au boulot !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  19. #19
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 418
    Points : 3 798
    Points
    3 798

    Par défaut

    salut,

    pas simple de comprendre ce que tu veut faire.

    bon l'interpolation est une propriété public de TCustomCanvas donc par conséquence de TCanvas .
    quand Tu lis StretchDraw on vois bien que si on ne lui a rien assigné il crée lui même le filtre TMitchelInterpolation.Create
    qu'il détruit lui même a la sortie ce qui veut dire qu'il passe forcement par un objet decendant de TFPCustomInterpolation

    pour changer le filtre il faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      CanVas.Interpolation := GetClass(ClassName).create 
      CanVas.StretchDraw(....);
      CanVas.Interpolation.free;
    il est vrai que je trouve la programmation hasardeuse sur ce coup là
    ils auraient mieux fait de creer le filtre dans le create du canvas mais bon ce n'est que mon opinion
    maintenant tu peut te servir autrement du TFPCustomInterpolation

    par exemple tu peut creer une fonction resize

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Procedure Resize(source : TFPCustomImage;Dest : TFPCustomCanvas;Filter : TFPCustomInterpolation);
    begin
      With  Filter do 
      begin
          Initialize (source, dest);
          Execute (x,y,w,h); 
      end;
    end;
    PS : en réponse après tes écrits

    C'est ce que j'ai cru aussi, mais non : hier soir tard j'ai tenté ça dans mon suivi du trackbar de zoom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      with tmp do begin // tmp c'est un TBitmap
        Width  := pnl4images.Width; // le TImage imgDisplay est posé sur un TPanel et alClient
        Height := pnl4images.Height;
        Canvas.Interpolation := TMitchellInterpolation.Create; // ajout suite post BeanzMaster
        Canvas.StretchDraw(rect(0,0,Width,Height), bmpOrigine);
        imgDisplay.Picture.Assign(tmp);
        Free;
      end;
    et comme dit ce matin, aucune influence sur le rendu de l'image zoomée.

    Que dire de plus ? Que je peux bien lui passer n'importe quel filtre, c'est ensuite StretchDraw qui prend la main avec ses paramètres et paf !
    c'est normal que tu ne voies pas de différence et heureusement dans ce cas là tu lui passe le même Filtre que par défaut :
    change de filtre et normalement tu verras une différence
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

Discussions similaires

  1. Recupération d'une propriété non publique
    Par Edenia dans le forum C#
    Réponses: 4
    Dernier message: 23/06/2011, 14h28
  2. Réponses: 2
    Dernier message: 10/02/2010, 14h40
  3. Une propriété tableau publiée !
    Par jpppaps dans le forum Delphi
    Réponses: 7
    Dernier message: 24/03/2007, 23h36
  4. [TFiler, TWriter] Propriété non publiée : Ancestor kesako ?
    Par phplive dans le forum Composants VCL
    Réponses: 5
    Dernier message: 13/07/2005, 14h34

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