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

 Delphi Discussion :

Appliquer un masque cadre sur un Timage !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut Appliquer un masque cadre sur un Timage !
    Bonjour à toutes et à tous,

    J'ai une procédure qui permet d'appliquer un masque cadre (filtre) sur un Timage.

    Cette procédure fonctionne si auparavant, je crée le gif avec couleur transparente, sinon le mask se superpose à l'image.

    Y a t'il une méthode plus fiable ?

    Merci d'avance pour l'aide éventuelle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure DrawTransparent(FileGif: string; Dest: TBitmap);
    var
      Gif: TGifImage;
    begin
      Gif := TGifImage.Create;
      try
        Gif.LoadFromFile(FileGif);
        Gif.Images[0].Draw(Dest.Canvas, Dest.Canvas.ClipRect, True, False);
      finally
        Gif.Free;
      end;
    end;
    Utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TFormtest2.BmaskClick(Sender: TObject);
    begin
     
     if not Bdimagegif.Execute then exit
        else begin
     
    DrawTransparent(Bdimagegif.filename, Imagesource1.Picture.bitmap);
    end;
    Exemple du rendu avec le gif dont le fond est transparent !

    Le premier mask est standard, le 2ième est transparent au milieu !

    @+,

    Cincap

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Bonjour,

    Il te faut utiliser la procédure CopyRect et la propriété CopyMode du Canvas pour réaliser cela.
    Cela devrait donner aux ajustements près (en particulier pour le GifImage) 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
     
    procedure DrawTransparent(FileGif: string; Dest: TBitmap);
    var
      Gif: TGifImage;
      R: TRect;
    begin
      Gif := TGifImage.Create;
      try
        Gif.LoadFromFile(FileGif);
     
        Dest.Canvas.CopyMode := cmSrcAnd;
        R := Rect(0, 0, Dest.Width, Dest.Height);
        Dest.Canvas.CopyRect(R, Gif.Picture.Bitmap.Canvas, R);
      finally
        Gif.Free;
      end;
    end;
    --
    Philippe.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    @ Ph. B., merci pour ta réponse, voici l'erreur dans la procédure modifiée :

    [Erreur] Unit1.pas(99): Identificateur non déclaré : 'Picture'
    [Erreur] Unit1.pas(99): Type Object ou Class requis
    [Erreur] Unit1.pas(104): '.' attendu(e) mais ';' trouvé(e)
    [Erreur fatale] Project1.dpr(5): Impossible de compiler l'unité utilisée 'Unit1.pas'
    A noter qu'au chargement de l'image source (bmp, jpg), j'applique un resize.

    J'ai enlever le picture et cela fonctionne sauf que le mask se trouve en haut à droite de l'image principale et non sur toute l'image ! mais elle est bien devenue transparante !
    @+,

    Cincap

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Citation Envoyé par cincap Voir le message
    A noter qu'au chargement de l'image source (bmp, jpg), j'applique un resize.
    Il faut jouer sur le 1° argument Rect qui correspond à la destination, le 2° Rect définit la partie de la source à copier. Dans mon exemple, j'ai mis les mêmes valeurs...
    --
    Philippe.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    @ Ph. B., j'avais testé ceci mais sans succès puisque mon imagesource1 est l'image de destination:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    try
        Gif.LoadFromFile(FileGif);
     
        Dest.Canvas.CopyMode := cmSrcAnd;
        R := Rect(0, 0, form1.imagesource1.picture.bitmap.width, form1.imagesource1.picture.bitmap.height);
     
        Dest.Canvas.CopyRect(R, Gif.Bitmap.Canvas, R);
      finally
        Gif.Free;
      end;
    Mon code 1er fonctionnait sur la totalité de l'image mais non transparent.
    Je cherche,

    @+,

    Cincap

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Utilises StretchDraw dans ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dest.Canvas.StretchDraw(ARect, Gif.Picture.Graphic);
    En définissant correctement les valeurs de ARect...
    --
    Philippe

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    Désolé Philippe, des erreurs à la compilation.

    A titre d'information, tu trouveras le projet en attache pour faire tes essais avec 4 masks.

    Car le masque peut être aussi inversé (bord blanc et milieu noir ou bord noir et milieu blanc) comme dans l'excellent logiciel Photofiltre d'Antonio.

    @+,

    Cincap
    Fichiers attachés Fichiers attachés

  8. #8
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Bonsoir,

    Citation Envoyé par cincap Voir le message
    Cette procédure fonctionne si auparavant, je crée le gif avec couleur transparente, sinon le mask se superpose à l'image.

    Y a t'il une méthode plus fiable ?
    Si l'emploi d'un .gif n'est pas obligatoire pour toi, j'utiliserais plutôt l'API MaskBlt qui fonctionne avec un BMP-source, un BMP-destination et un Masque-monochrome.

    Il y a aussi PlgBlt (un peu plus compliqué) qui peut faire la même chose et qui, de plus, permet beaucoup d'autres effets comme des rotations, etc...

    NB: Ces 2 APIs sont très rapides.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    Bonjour à toutes et à tous,

    @ Caribensila, merci de ta réponse,

    Si l'emploi d'un .gif n'est pas obligatoire pour toi, j'utiliserais plutôt l'API MaskBlt qui fonctionne avec un BMP-source, un BMP-destination et un Masque-monochrome.
    En fait, j'utilise les deux ou trois masks du logiciel PhotoFiltre qui sont en gif donc si on sait le faire en Bmp, pas de problème, le membre Ph. B. a quand même lancé une bonne piste en utilisant le Gif, seul bémol je n'arrive pas à forcer le masque suivant les dimensions de la photo qui peuvent être aussi paramétrées suivant l'exemple en zip.

    Je n'ai jamais utilisé ta solution "PlgBlt" qui pourrait peut être aussi inversé les couleurs du mask pour soit faire un cadre noir ou blanc.

    Je vais voir si je m'en sort.

    @+,

    Cincap

  10. #10
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    Citation Envoyé par cincap Voir le message
    Bonjour à toutes et à tous,

    @ Caribensila, merci de ta réponse,



    En fait, j'utilise les deux ou trois masks du logiciel PhotoFiltre qui sont en gif donc si on sait le faire en Bmp, pas de problème, le membre Ph. B. a quand même lancé une bonne piste en utilisant le Gif, seul bémol je n'arrive pas à forcer le masque suivant les dimensions de la photo qui peuvent être aussi paramétrées suivant l'exemple en zip.

    Je n'ai jamais utilisé ta solution "PlgBlt" qui pourrait peut être aussi inversé les couleurs du mask pour soit faire un cadre noir ou blanc.

    Je vais voir si je m'en sort.

    @+,

    Cincap
    les GIF utilisent une transparence binaire (pas de canal alpha) si ton masque est trop petit par rapport à l'image de destination le résultat risque d'être assez moche.

    sinon j'ai un vieux code qui doit toujours fonctionner pour le dessin par transparence.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    @ Paul TOTH, merci de ta participation, je vais voir ton code et essayer de m'en sortir.

    Au fait, le module qui est disponible dans PhotoFiltre et programmé en Delphi, permet d'inverser la couleur du mask (il charge tous les formats).

    @+,

    Cincap
    Images attachées Images attachées  

  12. #12
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Si ça peut t'aider... Voir pièces jointes...
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    @ Whiler, merci de ta réponse, j'ai téléchargé le zip mais il manque des unités ! donc impossible de le compiler et d'analyser ta façon de faire.

    Je suis sur D6 !
    Sinon le résultat de ton Jpg, si c'est avec un mask gif non transparent c'est cela que je recherche.

    @+,

    Cincap

  14. #14
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    j'ai utilisé ton fichier Diffusion.gif....

    pour les unités... il suffit de faire le ménage... j'suis en XE2... donc, elles sont préfixées... si tu ne gardes que la fin de chaque unité, ça devrait le faire...

    Essaye avec ce uses...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, GIFImg, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, Buttons,
      ExtCtrls;

  15. #15
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Citation Envoyé par cincap Voir le message
    Au fait, le module qui est disponible dans PhotoFiltre et programmé en Delphi, permet d'inverser la couleur du mask (il charge tous les formats).
    NB: Avec les APIs MaskBlt et PlgBlt, il est inutile d'inverser les couleurs du masque puisqu'il suffit d'inverser les BMP-Source et BMP-Destination.

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    @ Whiler, j'ai modifié le uses et je sais maintenant compiler !

    J'ai chargé la même photo (pas d'erreur) et le même filtre que dans ton test et j'obtiens une erreur à mon avis à cause de Gifimage sous D6 qui n'a pas le même nom que sur XE2, au fait avec mon projet, c'est difficile de le modifier ?

    Erreur color table is empty
    Donc plantage.

    @ Caribensila, bien vu, j'en tiens compte.

    Le projet de Paul TOTH m'a l'air aussi concluant et didacticiel.

    @+,

    Cincap

  17. #17
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Citation Envoyé par cincap Voir le message
    Désolé Philippe, des erreurs à la compilation.
    J'ai téléchargé ton projet et regardé le code et j'ai changé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        //Dest.Canvas.CopyRect(R,Gif.Bitmap.Canvas, R);
        Dest.Canvas.StretchDraw(R, Gif.Images[0].Bitmap);
    Résultat en pièce jointe.

    Autres remarques diverses sur ce que j'ai vu (je suis maniaque sur le code !):
    1. Tu utilises des procédures dans la partie implémentation. J'en ferais soit des méthodes privées de la classe, soit des procédures "métiers" que je placerais dans une unité tierce
    2. Certaines parties du code doivent être encadrées par des tests "Define"
      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
      {$IFDEF SAVEPNG}
      procedure PNGToBMP(PNG : TPNGobject; BMP : TBitmap);
      begin
        BMP.Width := PNG.Width;
        BMP.Height:= PNG.Height;
        BMP.PixelFormat := pf24bit;
        BMP.Canvas.Draw(0,0,PNG);
      end;
      {$ENDIF}
      //...
        {$IFDEF SAVEPNG}
        PNG : TPNGObject;
        {$ENDIF}
      //...
              {$IFDEF SAVEPNG}
              if ext = '.png' then
              begin
                Png := TPNGObject.Create;
                try
                  { charge a partir du fichier }
                  png.LoadFromFile(Bdimage.FileName);
                  pngToBMP(png,BMP);
                  { BMP est prét }
                  bmpLoaded := true;
                finally
                  { liberation de PNG }
                  PNG.Free;
                end;
              end
              else
              {$ENDIF}
    3. Je remplacerais les variables globales de la partie implémentation par des propriétés de ta fiche.
    4. Tu peux remplacer ton code de test d'existence et de création de répertoire par ForceDirectories

    Bonne continuation...
    --
    Philippe.
    Images attachées Images attachées  

  18. #18
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    En faisant simplement ça...

    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
    procedure DrawTransparent(FileGif: string; Dest: TBitmap);
    var
      Gif: TGifImage;
      bmpSource, bmpMask: TBitmap;
      R: TRect;
    begin
      Gif       := TGifImage.Create;
      bmpSource := TBitmap.Create;
      bmpMask   := TBitmap.Create;
      try
        Gif.LoadFromFile(FileGif);
     
        bmpSource.Width  := Dest.Width;
        bmpSource.Height := Dest.Height;
        bmpSource.Canvas.Draw(0, 0, Dest);
     
        R := Rect(0, 0, Dest.Width, Dest.Height);
        bmpMask.Width  := Dest.Width;
        bmpMask.Height := Dest.Height;
        bmpMask.Canvas.StretchDraw(R, Gif.Bitmap);
     
        bmpSource.Canvas.CopyMode := cmSrcAnd;
        bmpSource.Canvas.CopyRect(R, bmpMask.Canvas, R);
     
        Dest.Canvas.CopyRect(R, bmpSource.Canvas, R);
     
      finally
        Gif.Free;
      end;
    end;
    J'ai le résultat que tu escomptes ? (Imagesource1.Transparent = True)
    Images attachées Images attachées  

  19. #19
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    Après les tests voulus, je n'ai pas tout à fait le résultat escompté avec les images filtres utilisées pour PhotoFiltre, même avec la dernière version de Whiler.

    Néanmoins je remercie tout le monde pour leurs suggestions.

    @+,

    Cincap

  20. #20
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Citation Envoyé par cincap Voir le message
    @ Caribensila, bien vu, j'en tiens compte.

    Le projet de Paul TOTH m'a l'air aussi concluant et didacticiel.
    L'avantage des masques monochromes est que tu t'affranchis de la couleur de transparence et que la technique est très riche de possibilités. Ca vaut le coup de la maîtriser, je pense...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Appliquer le masque de saisie sur un input commencant par
    Par Devilju69 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/02/2014, 19h15
  2. Réponses: 6
    Dernier message: 30/04/2012, 10h25
  3. Comment appliquer un masque sur un dossier (gestion des droit)
    Par pierrot10 dans le forum Administration système
    Réponses: 18
    Dernier message: 26/02/2009, 09h04
  4. Réponses: 9
    Dernier message: 16/11/2005, 11h32
  5. [Transparent] - Comment dessiner sur 2 TImage ?
    Par TOTO32 dans le forum Langage
    Réponses: 15
    Dernier message: 08/08/2004, 01h06

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