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 :

[débutant] Traitement d'image: WMF ou bmp?


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2006
    Messages : 122
    Par défaut [débutant] Traitement d'image: WMF ou bmp?
    Bonjour à tous,

    j'ai parcouru quelques sujet du forum et je suis tombé sur un truc que je ne connaissai pas... les WMF.

    J'ai fait un projet ou je dois faire tourner une image, la translater. Tous ces calcul demande un certain temps (avec un bmp). J'ai créé un .WMF avec l'image que je souhaite traiter. Comment faire pour la tourner, la translater, faire un zoom? Existe t-il un tutoriel dessus?

    Est-ce que les calcul seront moins long?

    Merci pour votre aide.

  2. #2
    Membre Expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Par défaut
    Il ne faut pas confondre les deux formats : ce n'est pas du tout la même chose.

    Le format BMP, ou Bitmap, permet de stocker des informations de type pixel pour l'image : à chaque point de l'image est associée une couleur et une seule. Ainsi, une ligne sera contenue dans le fichier comme une suite de point de même couleur.

    Le format WMF, ou Windows MetaFile, permet de stocker des informations de type vectoriel sur l'image : l'image est constituée d'objet avec leur couleur, leurs coordonnées, ... Ainsi, une ligne sera contenue dans le fichier comme deux points avec leur coordonnées, ainsi que la couleur à utiliser et le type de pinceau.

    Effectuer une rotation sur une image de type Bitmap demande du temps : chaque pixel doit subir la transformation et être déplacé.
    Pour une image vectorielle, c'est très rapide : il suffit d'appliquer la rotation à chaque coordonnée. Reprenons l'exemple de la ligne, disons d'une taille de 100 pixels. En bitmap, cela fera 100 points à déplacer. En vectoriel, seulement deux (les deux extrémités).

    Mais une image vectorielle n'est pas adaptée pour tout. Il faut donc choisir le format adapté avant d'aller plus loin.

    Dessin en point par point ? bitmap
    Dessin par formes et objets ? vectoriel

    @++

  3. #3
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Zoomer, Tourner, Translater, c'est possible avec n'importe quoi avec les API Windows. La procedure qui nous intéresse s'appelle SetWorldTransform, voici son prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function SetWorldTransform(DC: HDC; const p2: TXForm): BOOL;
    Le paramètre DC attend un "Device Context", c'est une sorte de Handle (un identifiant), un nombre entier unique que windows attribue à tout ce qui peut représenter une surface de dessin. D'habitude, c'est une valeur que l'on demande à windows comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    uses windows;
    ...
    var DC:HDC;
         UnHandleDeFenetre:HWnd;
    begin
      UnHandleDeFenetre:=0;
      DC:=GetDC(UnHandleDeFenetre);
    end;
    Ici, HWND, est un l'identifiant d'une fenètre (un entier en fait) que Windows attribue à chaque fenètre existante dans Windows (Pour le bureau, cette valeur vaut zéro). Quand tu crées une fiche, c'est une fenètre (TForm possède une propriété Handle que tu peux utiliser, les controles fenétrés dérivés de TWinControl aussi).

    Certains composants Delphi, possèdent un Handle de type HDC (tous les TGraphicControl en fait et les "surfaces de dessin" comme TCanvas et TMetaFileCanvas. C'est pratique : Delphi à déjà demandé à Windows de leur attribuer un identifiant unique afin de pouvoir dessiner dessus.

    Le paramètre TXForm, c'est un enregistrement déclaré comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TXFORM = packed record
        eM11: Single;
        eM12: Single;
        eM21: Single;
        eM22: Single;
        eDx: Single;
        eDy: Single;
      end;
    Le but du jeu avec ce paramètre, c'est de transformer x en x' et y en y', tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x' := x * eM11 + y * eM21 + eDx;  
    y' := x * eM12 + y * eM22 + eDy;
    Voici, selon la transformation que tu souhaites effectuer, voici quelques exemples de comment tu dois initialiser ces paramètres :
    Rotation
    eM11:=Cos(angle);
    eM12:=Sin(angle);
    eM21:=-Sin(angle);
    eM22:=Cos(angle);
    eDX:=0;
    eDY:=0;

    Zoom/Etirement
    eM11:=Facteur_de_Zoom_Horizontal;
    eM12:=0;
    eM21:=0;
    eM22:=Facteur_de_Zoom_Vertical;
    eDX:=0;
    eDY:=0;

    Translation
    eM11:=1;
    eM12:=0;
    eM21:=0;
    eM22:=1;
    eDX:=Translation_en_x;
    eDY:=Translation_en_y;
    Voici donc une procédure dont je me suis fendu qui va te permettre de transformer en Picasso du Delphi, celà fait appel a nos API Windows :
    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
    procedure Transforme(ABitmap1,ABitmap2:TBitMap;Parametres:TXFORM);
    var UnDeviceContext:HDC;
        MatriceXForm:TXFORM;
        ARect:TRect;
    begin
      //obtenir un contexte de périphérique sur le Bitmap à transformer
      UnDeviceContext:=ABitMap2.Canvas.Handle;
     
      //On met le mode graphique de notre Canvas en mode "Avancé"
      //Sinon, ça ne marche pas :/
      SetGraphicsMode(UnDeviceContext,GM_ADVANCED);
     
    //On efface le bitmap en le remettant en mode "Normal"
      with MatriceXForm do
      begin
        eM11:=1;
        eM12:=0;
        eM21:=0;
        eM22:=1;
        eDx:=0;
        eDy:=0;
      end;
      SetWorldTransform(UnDeviceContext, MatriceXForm);
      ARect:=Rect(0,0,ABitMap2.Width,ABitMap2.Height);
      ABitMap2.Canvas.Brush.Color:=clBlack; //ou clWhite si tu préfères
      ABitMap2.Canvas.FillRect(ARect);
     
      //Transformation des coordonnées du Canvas
      SetWorldTransform(UnDeviceContext, Parametres);
      //Le Canvas possède maintenant un nouveau sytème de coordonnées
      //On peut dessiner dessus :
      ABitMap2.Canvas.Draw(0,0,ABitMap1);
    end;
    En entrée, tu as donc ABitmap1 et en Sortie ABitMap2.

    Bien sur, on peu adapter la procedure pour qu'elle fonctionne avec des TMetafile (ce qui sous-entend l'utilisation de TMetaFileCanvas), ou directement des Canvas. Mais là, c'est un bon début.

    Bon dev

Discussions similaires

  1. [Video] Traitement image WMF
    Par lcristin dans le forum Multimédia
    Réponses: 0
    Dernier message: 04/09/2008, 11h17
  2. Traitement d'image BMP
    Par Hitonari dans le forum C++Builder
    Réponses: 13
    Dernier message: 27/05/2008, 23h36
  3. [débutant]traitement image, détection de contour
    Par seerauber dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 13/07/2007, 15h25
  4. [Débutant] Traitement d'images médicales
    Par fcgabaldo dans le forum Images
    Réponses: 45
    Dernier message: 24/05/2007, 16h19
  5. Réponses: 5
    Dernier message: 15/01/2005, 18h29

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