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

Composants VCL Delphi Discussion :

Probleme d'image temporaire


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut Probleme d'image temporaire
    Bonjour a tous,
    Je suis en train de realiser un filtre d'erosion sur une image et j'ai un petit probleme d'image temporaire.
    Je travaille sur deux images;
    la premiere (la source image321) est sur le canvas.
    la deuxieme (la destination image322) est aussi sur le canvas.
    lorsque je modifie l'image321 pour realiser une nouvelle image322 avec mon code dans une procedure. tous marche tres bien.

    L'idée est d'utiliser ce code dans une fonction, je ne peux donc pas utiliser image321 et image322. je passe donc un argument:

    soit le code suivant:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Function ImErode(ImgTemp1:TBitmap32): TBitmap32;
    var i, j, z: Integer;
    SizeStrel: Integer;
    ImgTemp:TBitmap32;
    maxValue, ValuePix: Integer;
    begin
            SizeStrel:=2;
            ImgTemp:=ImgTemp1;
            // X
            // O
            // X
            for i:=0 to ImgTemp1.Width-1 do
            begin
                    j:=SizeStrel DIV 2;
                    repeat
                            maxValue:=0;
                            for z:=-(SizeStrel DIV 2) to SizeStrel DIV 2 do
                            begin
                                    ValuePix:=Intensity(ImgTemp1.Pixel[i,j+z]);
                                    if ValuePix>maxValue then maxValue:=ValuePix;
                            end;
                            ImgTemp[i,j]:=maxValue*65793;
     
                            Inc(j);
                    until (j>=ImgTemp1.Height-1-SizeStrel DIV 2);
            end;
     
            //  XOX
            for j:=0 to ImgTemp1.Height-1 do
            begin
                    i:=SizeStrel DIV 2;
                    repeat
                            maxValue:=0;
                            for z:=-(SizeStrel DIV 2) to SizeStrel DIV 2 do
                            begin
                                    ValuePix:=Intensity(ImgTemp1.Pixel[i+z,j]);
                                    if ValuePix>maxValue then maxValue:=ValuePix;
                            end;
                            ImgTemp[i,j]:=maxValue*65793;
                            Inc(i);
                    until (i>=ImgTemp1.Width-1-SizeStrel DIV 2);
            end;
    ImErode:=ImgTemp;
    end;
     
    //la procedure qui appelle la fonction
    procedure TForm1.Button1Click(Sender: TObject);
    begin
            Image322.Bitmap:=ImErode(Image321.Bitmap);
    end;


    en fait, ce qui se passe c'est que le programme modifie l'image destination non pas a partir de l'image source mais a partir de la destination!
    donc comment puis je faire....
    j'espere que j'ai ete clair... merci....

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Ouille!

    Met les balises Code... C'est incompréhensible comme ça...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Désolé un petit oubli...

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Ben y a un truc bizarre dans ta fonction: Y a pas de Result !! Ta fonction ne renvoie rien...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  5. #5
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Il utilise le nom de la fonction : ImErode

    Je me suis fait la même remarque avant de voir ça... Mais peut-être que ça ne fontionnera que si tu utilises "Result" !

    Mais je pense que tu devrais plutôt faire une procédure, avec en paramètres ImgTemp1 et Destination passée en "var" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure ImErode(ImgTemp1:TBitmap32; var Destination: TBitmap32);
    begin
      ...
    end;
     
    //Appel de la procédure
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ImErode(Image321.Bitmap, Image322.Bitmap);
    end;
    Mea est trop forte, elle flotte : mea coule pas !

    Basically this boot sector (Win95) code is 32 bit extension for a 16 bit patch to an 8 bit boot sector originally coded for a 4 bit microprocessor, written by a 2 bit company, that can't stand 1 bit of competition.

    olance.developpez.com
    Servez-vous, profitez, abusez de la FAQ Delphi !!

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    ah zut c'est l'ancien code... j'ai modifié... encore désolé...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    J'ai tenté d'utiliser Result mais c'est exactement la meme chose. Pour la procedure il n'accepte pas l'utilisation de var car c'est un objet (peut etre un probleme avec l'utilisation de la bibliotheque G32).
    Bref, malgré vos efforts, le probleme est toujours le meme.
    En fait, si l'on regarde le code, on peut voir que je declare :

    Je modifie ensuite ImgTemp, mais pas ImgTemp1... Et j'ai comme l'impression que c'est la que sa plante. Lorsque je tape:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ImgTemp:=ImgTemp1;
    ImgTemp.clear; // pour mettre l'image en noir
    Le programme marche mais m'affiche une image noire... Alors qu'il devrait me faire une erosion de l'image ImgTemp1. Si j'enleve :
    Le programme plante car il n'a pas la taille de l'image... Bref, je suis dans la panade... si vous avez d'autres idées...

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 43
    Points : 52
    Points
    52
    Par défaut
    Le problème provient du fait que ImgTemp et ImgTemp1 pointent sur la même Image. N'oublie pas que ce sont des pointeurs.
    Pour avoir un ImgTemp dans lequel tu veux travailler indépendamment tu dois le créer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImgTemp:=TBitmap32.Create(Self);
    plutôt que
    Alors ton imgTemp a sa propre image qui sera l'image transformée de ImgTemp1.

    Je ne sais pas si je suis clair mais le principe est là à mon avis.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Je vois ce que tu veux dire. En fait, mes deux images avaient le meme pointeur. Bref, je vais essayer de recreer un objet TBitmap32... faut que je regarde ce qu'il faut definir. Car create(self) ne fonctionne pas avec Gr32....

  10. #10
    Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 43
    Points : 52
    Points
    52
    Par défaut
    Oui je n'ai pas l'unité contenant la classe TImage32 je crois. Je ne peux donc t'aider à ce niveau. Peut-etre est-ce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImgTemp:=TBitmap32.Create;
    Bon courage.

  11. #11
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    c'est normal que tu n'ai pas le résultat escompté.
    quand tu met au début de ton code
    c'est que tu fait pointer (désolé pour le terme, c'est une déformation professionnelle, les devloppeurs C me comprendront
    ImgTemp (ta var locale) sur l'objet que tu passe en parametre. Et comme les classe sont par référence, tu modifie directement ton objet passé en param.
    et quand tu met à la fin de ta fonction
    tu ne fait que renvoyé la référence (et donc l'objet passé en param) que tu a déja "érodé" dans ta fonction.
    pour régler ton pb il te faudra CREER une variable temporaire, y copier l"image passée en parametre, la modifié et la renvoyer directement comme résultat de ta fonction (sans la détruire, c le prcessus appelant qui doit la détruire).
    je m'explique :
    Ton code actuel ressemble à celà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Function ImErode(ImgTemp1:TBitmap32): TBitmap32; 
    var 
    ImgTemp:TBitmap32;  // ta var tempo
     
    begin 
            SizeStrel:=2; 
            ImgTemp:=ImgTemp1;  // ta var tempo récupère la réf passé en param
    // en fait ici tu ne fait rien c juste comme tu disait que ImgTemp pointe sur le meme objet que ImgTemp1 (parce que les classes sont passé par réf en delphi) ey du coup toute modif sur l'image pointé par ImgTemp modifiera ImgTemp1 et du meme coup l'iimage originale passée en param
    ...
    //ici tu érode ton image  ImgTemp et donc ImgTemp1
    puis tu la retourne comme résultat de la fonction 
            ImErode:=ImgTemp; // qui est égal d'"ailleeur à  ImgTemp1 
    end;
    PS. Que tu retourne "Result = " ou "ImErode:=" c'est la meme chose en delphi... "'NomDeFonc = " est identique à "Result=" ... sauf que Result peut être utilisé comme var temporaire dans ta fonction .. mais au niveau résultat c la meme chose.
    la solution
    il faut créer un objet temporaire ImgTemp dans la fonction, copier dedan l'image passée en param, puis le renvoyé en result

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    Function ImErode(ImgTemp1:TBitmap32): TBitmap32; 
    var 
    ImgTemp:TBitmap32;  // ta var tempo
     
    begin 
            SizeStrel:=2; 
    // je connait pas bien le constructeur de ton TBitmap32
    // on crée la varr tempo
            ImgTemp :=  TBitmap32.Create(...);
    //  on copie l'image .. je sais pas si ton TBitmap32 contient une fonction pour le faire
    // dans delphi TBitmap possede la fonction Assign
            ImgTemp.Assign(ImgTemp1);  // ta var tempo récupère une copie de l'image 
     
    // Vérifie ton objet TBitmap32 .. je connait pas son interface, normaement il doit y avoir une fonction pour y copier une image provenant d'un autre TBitmap32 
     
    //ici tu érode ton image  ImgTemp et donc la copie
    //puis tu la retourne comme résultat de la fonction 
            ImErode:=ImgTemp; 
    // comme tu retourne l'objet créé il faut pas le détruire en faisant 
    // un ImgTemp.Free  ! c la fonction apelante qui devra le faire
    end; 
     
    la fonction apelante devra être ainsi
     
    //Appel de la procédure 
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
       Image322.Bitmap := ImErode(Image321.Bitmap); 
    end
    où  Image322.Bitmap devra être une var globale du type TBitmap32 et qui devra être détruite.
    Attention à ne pas oublié: Chaque appel à  ImErode (qqchose) CREE une instance de TBitmap32  ImgTemp :=  TBitmap32.Create(...); donc faut pas oublier de les libérer
    voilà .. j'espère que ca te sera utile
    http://www.pocketmt.com GLCD Font Creator home site.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Excellent. Bon je suis amplement d'accord avec toi. J'etais justement en train d'essayer un assign... il y a bien cette fonction dans le GR32, le seul probleme, c'est que crashe encore...
    je despere pas, je vais bien trouver la solution... merci encore.

  13. #13
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Citation Envoyé par mIch°°
    Excellent. Bon je suis amplement d'accord avec toi. J'etais justement en train d'essayer un assign... il y a bien cette fonction dans le GR32, le seul probleme, c'est que crashe encore...
    je despere pas, je vais bien trouver la solution... merci encore.
    j'ai bien mentioné plus haut que je conaissait pas l'interface de ton TBitmap32. J'ai mis assign juste parce qu'elle est utilisée dans la VCL. Vérifie ton TBitmap32 il se pourrait que assign n'a absolument pas la fonction voulue (copie d'image). vérfie bien ta calsse il se pourrait qu'il y ait une autre fonction (BitBltCopy oy Copy ou autre chose .... ).
    http://www.pocketmt.com GLCD Font Creator home site.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    J'ai trouvé. Cela semble assez bizarre mais ca marche... En fait, il suffisait de faire un assign mais par contre il ne faut pas liberer l'image. Ce que je trouve assez etrange, mais bon ca marche... Merci encore a tous.

  15. #15
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    vérife plus haut mon post, je t"avais bien dit qu'il fallait pas libérer l'image. ce n'est qy'une fois que t'en a plus besoin que tu doit la libérer
    http://www.pocketmt.com GLCD Font Creator home site.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme d'images
    Par mahfout_i dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 22/03/2006, 16h21
  2. Probleme d'image
    Par Naruto_kun dans le forum ASP
    Réponses: 1
    Dernier message: 09/03/2006, 20h32
  3. probleme insertion images
    Par kojima dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/12/2005, 22h30
  4. probleme avec image reactive
    Par pit9.76 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 02/11/2005, 21h05
  5. [Upload] Probleme upload images
    Par yveslens dans le forum Langage
    Réponses: 6
    Dernier message: 22/08/2005, 09h42

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