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 :
--start here et remonte--
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
2- utilisation :
--start here et remonte--
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 !?
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 :
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
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 ...
et on peut lire dans fpcanvas.inc :
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)
Sauf que...
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 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) :
Merci,
Partager