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 :

remplissage de zones de couleur avec scanline


Sujet :

Delphi

  1. #21
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    A Gilber Geyer
    J'ai essayé de déplacer ma souris aussi rapidement que je le pouvais et je n'ai pas vu que cela remplissait 2 pays ...
    En fait, je me suis mal exprimé : c'est quand on passe sur les deux pays(Maroc et Algérie) plusieurs fois assez rapidement.(ci-joint l'image du problème).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Aplication.ProcessMessages;
    Cela ne change rien non plus!!!

    A ShaiLeTroll,
    par Gilbert Geyer
    je n'ai absolument rien compris sur son fonctionnement.
    Moi non plus...
    Images attachées Images attachées  

  2. #22
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Je viens d'ajouter les deux types mais j'ai les mêmes messages d' [Erreur] ... : Type Record, Object ou Class requis.
    Ah, ce n'est pas les types qui te manque mais peut-être juste une faute de syntaxe, essaye en ajoutant explicitement le déréférencement ^ ou sans le with ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with PEMRExtFloodFill(@pEMFR)^ do // déréférencement explicite
     if crColor = ColorToRGB(PColor(lpData)^) then
       crColor := ColorToRGB(clYellow);
     
    ...
     
            with PEMRSETTEXTCOLOR(@pEMFR)^ do // déréférencement explicite
              if crColor = ColorToRGB(PColor(lpData)^) then
                crColor := ColorToRGB(clYellow);

    ou SANS le with :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if PEMRExtFloodFill(@pEMFR).crColor = ColorToRGB(PColor(lpData)^) then
       PEMRExtFloodFill(@pEMFR).crColor := ColorToRGB(clYellow);
     
    ...
     
            if PEMRSETTEXTCOLOR(@pEMFR)^.crColor = ColorToRGB(PColor(lpData)^) then
                PEMRSETTEXTCOLOR(@pEMFR)^.crColor := ColorToRGB(clYellow);

    Citation Envoyé par Basile le disciple Voir le message
    Citation Envoyé par Gilbert Geyer Voir le message
    je n'ai absolument rien compris sur son fonctionnement.
    Moi non plus...
    @Basile ?
    C'est toi qui as pourtant évoqué l'utilisation de fichier EMF et d'image vectorielle, je ne fais que suivre dans cette voie en proposant un code orienté EMF et non BMP, normalement en terme de performance, cela sera bien meilleure !
    Je pensais que tu étais familier du fonctionnement des MetaFile puisque c'est le format que tu as choisi pour tes images
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #23
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    Par ShaiLeTroll :
    Je pensais que tu étais familier du fonctionnement des MetaFile puisque c'est le format que tu as choisi pour tes images
    Tout ce que je sais, c'est qu'une image vectorielle ne change pas trop quand on zoome dessus et que c'est un metafile!!! Sinon, c'est tout.

  4. #24
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-salut,

    Basile : ... (Maroc et Algérie)
    OK, vu, et entre temps j'ai réussi à éviter ce pb ainsi :

    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 TfrmAfrique1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    var i: integer;
    begin
      col := getPixel(bmpmemoire.Canvas.Handle, x, y);
      if col=colPrec then EXIT;
      bmp.Assign(bmpmemoire); Paintbox1.Invalidate;
      for i := 0 to max do
      begin
        if (col = tab[i]) then
        begin
          fond(bmp);
          break;
        end else if col <> clblue then bmp.Assign(bmpmemoire);
      end;
      Paintbox1.Invalidate;
      colPrec:=col;
    end;
    ... avec var colPrec: TColor à ajouter parmi les variables globales
    ... et à initialiser en ajoutant colPrec:=clWhite; dans le FormCreate.

    ShaiLeTroll : ... peut-être juste une faute de syntaxe...
    Ok, je vais essayer.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #25
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-salut,

    Basile: Tout ce que je sais, c'est qu'une image vectorielle ne change pas trop quand on zoome dessus et que c'est un metafile!!! Sinon, c'est tout.
    Pour l'agrandissement le vectoriel c'est le top...
    Mais on peut aussi agrandir un BitMap sans agrandir la pixellisation avec la méthode XBR, et si ça t'intéresse dis le et je posterai un zip de démo.
    Pour l'instant je vais voir le problème de syntaxe de ShaiLeTroll.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #26
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-salut,

    A ShaiLeTroll : j'ai testé les deux variantes de syntaxe comme suit :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    unit uAfrique2;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ExtCtrls;
    
    type
      TfrmAfrique2 = class(TForm)
        PaintBox1: TPaintBox;
        Image1: TImage;
        procedure FormCreate(Sender: TObject);
        procedure PaintBox1Paint(Sender: TObject);
        procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
        col: TColor;
        tmpMF: TMetaFile;
        function ConvertMetaFileToYellow(MetaFile: TMetaFile; ExcludeColor: TColor): boolean; 
      public
        { Déclarations publiques }
      end;
    
    var
      frmAfrique2: TfrmAfrique2;
    
    implementation
    
    {$R *.dfm}
    
    procedure TfrmAfrique2.FormCreate(Sender: TObject);
    begin
      DoubleBuffered := true;
      ClientWidth := Image1.Picture.Width;
      ClientHeight := Image1.Picture.Height;
      Image1.Visible := false; // ou SendToBack();
    
      Paintbox1.Align := AlClient;
      tmpMF := TMetaFile.Create();
      col:= RGB(250,254,222); // couleur des mers entourant l'Afrique
    end;
    
    procedure TfrmAfrique2.PaintBox1Paint(Sender: TObject);
    begin
      tmpMF.Handle := CopyEnhMetafile(Image1.Picture.MetaFile.Handle, nil); // normalement tmpMF libéra la copie
      ConvertMetaFileToYellow(tmpMF, col);
      Paintbox1.Canvas.Draw(0, 0, tmpMF);
    end;
    
    procedure TfrmAfrique2.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      col := getPixel(Image1.Picture.MetaFile.handle, x, y);
      PaintBox1.Invalidate();
    end;
    
      type PEMRExtFloodFill = ^TEMRExtFloodFill;
    {$EXTERNALSYM tagEMREXTFLOODFILL}
      tagEMREXTFLOODFILL = record
        emr: TEMR;
        ptlStart: TPoint;
        crColor: COLORREF;
        iMode: DWORD;
      end;
      TEMRExtFloodFill = tagEMREXTFLOODFILL;
    {$EXTERNALSYM EMREXTFLOODFILL}
      EMREXTFLOODFILL = tagEMREXTFLOODFILL;
    
    type PEMRSetTextColor = ^TEMRSetTextColor;
    {$EXTERNALSYM tagEMRSETTEXTCOLOR}
      tagEMRSETTEXTCOLOR = record
        emr: TEMR;
        crColor: COLORREF;
      end;
      TEMRSetTextColor = tagEMRSETTEXTCOLOR;
    {$EXTERNALSYM EMRSETTEXTCOLOR}
      EMRSETTEXTCOLOR = tagEMRSETTEXTCOLOR;
    
    // This function is called from EnumEnhMetaFile in the ConvertMetaFileToYellow procedure
    function EnumCallBack_SetYellowColor(DC: HDC; var pHTable: THandleTable; var pEMFR: TEnhMetaRecord; nObj: integer; lpData: pointer): integer; stdcall;
    var crColor: COLORREF;
    begin
      case pEMFR.iType of
        EMR_CREATEPEN:
          begin
            with PEMRCreatePen(@pEMFR).lopn do
              if lopnColor = ColorToRGB(PColor(lpData)^) then
                lopnColor := ColorToRGB(clYellow);
          end;
    
        EMR_EXTCREATEPEN:
          begin
            with PEMRExtCreatePen(@pEMFR).elp do
              if elpColor = ColorToRGB(PColor(lpData)^) then
                elpColor := ColorToRGB(clYellow);
          end;
    
        EMR_EXTFLOODFILL:
          begin
            with PEMRExtFloodFill(@pEMFR)^ do // déréférencement explicite
              if crColor = ColorToRGB(PColor(lpData)^) then
                crColor := ColorToRGB(clYellow);
           { if PEMRExtFloodFill(@pEMFR).crColor = ColorToRGB(PColor(lpData)^) then
              PEMRExtFloodFill(@pEMFR).crColor := ColorToRGB(clYellow); }
          end;
    
        EMR_CREATEBRUSHINDIRECT:
          begin
            with PEMRCreateBrushIndirect(@pEMFR).lb do
              if lbColor = ColorToRGB(PColor(lpData)^) then
                lbColor := ColorToRGB(clYellow);
          end;
    
        EMR_SETTEXTCOLOR, EMR_SETBKCOLOR:
          begin
            with PEMRSETTEXTCOLOR(@pEMFR)^ do // déréférencement explicite
              if crColor = ColorToRGB(PColor(lpData)^) then
                crColor := ColorToRGB(clYellow);
           { if PEMRSETTEXTCOLOR(@pEMFR)^.crColor = ColorToRGB(PColor(lpData)^) then
              PEMRSETTEXTCOLOR(@pEMFR)^.crColor := ColorToRGB(clYellow); }
          end;
    
        EMR_BITBLT,
          EMR_STRETCHBLT,
          EMR_STRETCHDIBITS,
          EMR_MASKBLT,
          EMR_PLGBLT: begin
          // TODO: change integrated image to gray scale...
          end
      end;
    
      if DC <> 0 then
        PlayEnhMetaFileRecord(DC, pHTable, pEMFR, nObj);
    
      Result := 1;
    end;
    
    function TfrmAfrique2.ConvertMetaFileToYellow(MetaFile: TMetaFile; ExcludeColor: TColor): boolean;
    var
      R: TRect;
    begin
      R := Rect(0, 0, Metafile.Width, MetaFile.Height);
      Result := EnumEnhMetaFile(0, MetaFile.Handle, @EnumCallBack_SetYellowColor, @ExcludeColor, R);
    end;
    
    procedure TfrmAfrique2.FormDestroy(Sender: TObject);
    begin
      tmpMF.Free;
    end;
    
    end. //////////////////////////////////////////////////////////////
    ... la compilation passe dans les deux cas de syntaxes ... mais les mers de couleur col:= RGB(250,254,222) entourant l'Afrique sur la carte ne changent pas de couleur alors qu'elles devraient passer au jaune. !!! ???

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #27
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Je suppose que si tu debug avec une couleur fixe c'est que le OnMouseMove ne fonctionne pas !

    Est-ce que EnumCallBack_SetYellowColor est appelée ?
    Est-ce que tu rentres dans l'un des cases ?

    Je vais essayer de le coder en C++Builder XE3, si cela se trouve le code de Forum Embarcadero était incomplet
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #28
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    C'est parfait, ça marche!
    Merci infiniment!!

    Par Gilber Geyer -->
    Mais on peut aussi agrandir un BitMap sans agrandir la pixellisation avec la méthode XBR, et si ça t'intéresse dis le et je posterai un zip de démo.
    Avec plaisir...
    Merci aussi pour les réponses de ShaiLeTroll malgré leurs difficultés pour un petit basile de disciple de 14 ans.

  9. #29
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    J'ai regardé en C++Builder
    l'Image contient
    1 EMR_HEADER
    2 EMR_SELECTOBJECT (un 1er en BLACK_BRUSH et un 2nd en WHITE_BRUSH)
    1 EMR_BITBLT
    881 EMR_SETDIBITSTODEVICE (tient 881 bloc pour 882 pixel )
    1 EMR_EOF

    Ce qui me fait penser que ce n'est pas une image vectorielle mais un tas de ligne BMP dans un fichier EMF (c'est bien pour cela qu'il est aussi gros, en vrai vectoriel, ça ferait à peine 100Ko mais pas 2Mo)

    The EMR_SETDIBITSTODEVICE record specifies a block transfer of pixels from specified scanlines of a source bitmap to a destination rectangle.
    A mon avis, le zoom sur cette image est aussi mauvais que sur un BMP

    Pour Info, même si sur cette image cela n'a aucun effet

    Code c++ : 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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    //---------------------------------------------------------------------------
     
    void __fastcall TVCLManipForm::BtnLoadMetaFileClick(TObject *Sender)
    {
      delete FMFWorking;
      FMFWorking = NULL;
     
      delete FMFSource;
      FMFSource = NULL;
     
      if (OpenPictureDialog->Execute())
      {
        FMFSource = new TMetafile();
        FMFSource->LoadFromFile(OpenPictureDialog->FileName);
     
        FMFWorking = new TMetafile();
     
        PaintBoxMetaFile->Invalidate();
      }
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TVCLManipForm::PaintBoxMetaFilePaint(TObject *Sender)
    {
      if (FMFSource && FMFWorking)
      {
        FMFWorking->Handle = (NativeUInt)CopyEnhMetaFile((HENHMETAFILE)FMFSource->Handle, NULL); // normalement FMFWorking libéra la copie
        ConvertMetaFileToYellow(FMFWorking, RGB(250,254,222));
        PaintBoxMetaFile->Canvas->Draw(0,0, FMFWorking);
      }
    }
     
    //---------------------------------------------------------------------------
    int CALLBACK EnumCallBack_SetYellowColor(
      /*_In_*/  HDC hDC,
      /*_In_*/   HANDLETABLE *lpHTable,
      /*_In_*/   const ENHMETARECORD *lpEMFR,
      /*_In_*/   int nObj,
      /*_In_*/   LPARAM lpData
    );
     
    //---------------------------------------------------------------------------
    bool __fastcall TVCLManipForm::ConvertMetaFileToYellow(TMetafile *Metafile, TColor ExcludeColor)
    {
      TRect R = Rect(0, 0, Metafile->Width, Metafile->Height);
      return EnumEnhMetaFile(0, (HENHMETAFILE)Metafile->Handle, EnumCallBack_SetYellowColor, &ExcludeColor, &R);
    }
     
    //---------------------------------------------------------------------------
    int CALLBACK EnumCallBack_SetYellowColor(HDC hDC, HANDLETABLE *lpHTable, const ENHMETARECORD *lpEMFR, int nObj, LPARAM lpData)
    {
      COLORREF ExcludeColor = ColorToRGB(*(PColor)lpData);
      COLORREF YellowColor = ColorToRGB(clYellow);
      OutputDebugStringW(IntToStr((__int64)lpEMFR->iType).c_str());
     
      switch (lpEMFR->iType)
      {
        case EMR_CREATEPEN:
        {
          if ((PEMRCreatePen(lpEMFR))->lopn.lopnColor == ExcludeColor)
            (PEMRCreatePen(lpEMFR))->lopn.lopnColor = YellowColor;
          break;
        }
     
        case EMR_EXTCREATEPEN:
        {
          if (((PEMRExtCreatePen)lpEMFR)->elp.elpColor == ExcludeColor)
            ((PEMRExtCreatePen)lpEMFR)->elp.elpColor = YellowColor;
          break;
        }
     
        case EMR_EXTFLOODFILL:
        {
          if (((PEMRExtFloodFill)lpEMFR)->crColor == ExcludeColor)
            ((PEMRExtFloodFill)lpEMFR)->crColor = YellowColor;
          break;
        }
     
        case EMR_CREATEBRUSHINDIRECT:
        {
          if (((PEMRCreateBrushIndirect)lpEMFR)->lb.lbColor == ExcludeColor)
            ((PEMRCreateBrushIndirect)lpEMFR)->lb.lbColor = YellowColor;
          break;
        }
     
        case EMR_SETTEXTCOLOR, EMR_SETBKCOLOR:
        {
          if (((PEMRSETTEXTCOLOR)lpEMFR)->crColor == ExcludeColor)
            ((PEMRSETTEXTCOLOR)lpEMFR)->crColor = YellowColor;
          break;
        }
     
        case EMR_BITBLT :
        {
          OutputDebugStringW(("BITBLT : " + IntToStr((__int64)((PEMRBITBLT)lpEMFR)->crBkColorSrc)).c_str());
          break;
          break;
        }
     
        case EMR_STRETCHBLT :
        case EMR_STRETCHDIBITS :
        case EMR_MASKBLT :
        case EMR_PLGBLT :
          break;
     
        case EMR_SELECTOBJECT:
        {
          OutputDebugStringW(("SELECTOBJECT : " + IntToStr((__int64)(PEMRSELECTOBJECT(lpEMFR))->ihObject)).c_str());
          break;
        }
      }
     
      if (hDC)
        PlayEnhMetaFileRecord(hDC, lpHTable, lpEMFR, nObj);
     
      return 1;
    }
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #30
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    ShaiLeTroll :Je suppose que si tu debug avec une couleur fixe c'est que le OnMouseMove ne fonctionne pas !

    Est-ce que EnumCallBack_SetYellowColor est appelée ?
    Est-ce que tu rentres dans l'un des cases ?
    1) EnumCallBack_SetYellowColor n'est appelée qu'une seule fois au lancement.
    2) Au lancement on passe par le Case of EMR_BITBLT, ... , EMR_PLGBLT situé la fin de EnumCallBack_SetYellowColor
    3) C'est effectivement le OnMouseMove qui ne fonctionne pas et plus exactement le col := getPixel(Image1.Picture.MetaFile.handle, x, y) car le showmessage(ColorToString(col)) placé ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TfrmAfrique2.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      col := getPixel(Image1.Picture.MetaFile.handle, x, y);
      showmessage(ColorToString(col));
      if Col=colCible then PaintBox1.Invalidate();
    end;
    ... m'affiche un $FFFFFFFF quels que soient les X,Y de la carte or les couleurs de base des divers pays sont des "presque-blancs de valeurs différentes" !!!

    4) A propos de :
    Pour Info, même si sur cette image cela n'a aucun effet ... Code C++
    Pour info, comme je suis nul en C++ tu aurais pu en faire l'économie, mais merci quand-même.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  11. #31
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut Agrandissements BitMaps avec XBR
    Re-bonjour,

    A propos de :
    ... la méthode XBR, et si ça t'intéresse dis le et je posterai un zip de démo.
    Basile : Avec plaisir...
    Voici un aperçu ainsi que le ZIP :

    A+.

    P.S : Sur la miniature ci-après : A gauche le petit dessin, et à droite le même dont les Width et Height ont été agrandis par un facteur de 10.
    Tu verras le code utilise également les Scanlines.

    EDIT : Oups, j'ai oublié de mettre à jour un truc dans le code du ZIP:
    Dans l'unit uDemoV4 remplacer la function ImgFile_To_Bmp(const nomFichierImg: string): tBitMap qui date de 2012 par la function BMP24fromFile(const nomFichierImg: string): tBitMap; dont le code se trouve en page 1 de la présente discussion, message #12 du 19/05/2013, 16h23
    (la version de 2012 est moins bonne en cas d'utilisation d'un fichier *.jpg)
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  12. #32
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    Excusez-moi pour le retard de ma réponse mais j'ai eu une semaine très chargée et j'ai pas trop eu le temps de vous répondre cette semaine!!

    Par Gilber Geyer -->
    Voici un aperçu ainsi que le ZIP :
    Merci beaucoup, le projet est super intéressant mais il est vachement compliqué et j'ai pas compris grand chose. Par contre, le rendu est vraiment parfait!!!

  13. #33
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Basile : ... le projet est super intéressant mais il est vachement compliqué et j'ai pas compris grand chose. Par contre, le rendu est vraiment parfait!!!
    Bin, s'il y a des trucs que tu n'as pas compris, tu peux poser des questions ....

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  14. #34
    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 : 54
    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 430
    Points
    28 430
    Par défaut
    Bonjour,

    il y a tout de même plus simple à mon avis

    1) utiliser du vectoriel ne veux pas spécialement dire un metafile :

    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
     
    procedure TForm1.FormPaint(Sender: TObject);
    const
      Afrique : array[0..19, 0..1] of Integer = (
       (160,  30),
       (260,  25),
       (270,  60),
       (330,  80),
       (330,  60),
       (410,  80),
       (475, 190),
       (520, 230),
       (565, 220),
       (470, 356),
       (477, 430),
       (386, 563),
       (322, 575),
       (270, 435),
       (280, 390),
       (246, 322),
       (245, 278),
       (112, 274),
       ( 48, 194),
       ( 64, 119)
      );
    var
      Index: Integer;
      x, y : Integer;
      Scale: Single;
    begin
      Scale := 1/2;
      with Canvas do
      begin
        x := Round(Scale * Afrique[High(Afrique), 0]);
        y := Round(Scale * Afrique[High(Afrique), 1]);
        MoveTo(x, y);
        for Index := Low(Afrique) to High(Afrique) do
        begin
          x := Round(Scale * Afrique[Index, 0]);
          y := Round(Scale * Afrique[Index, 1]);
          LineTo(x, y);
        end;
      end;
    end;
    les points donnés viennent d'une approximation à partir d'une image de l'Afrique et de la position de la souris dans PaintBrush On peut mettre plus ou moins de points selon le niveau de détail souhaité

    on peut aussi dessiner ça dans un TBitmap et on obtient une image classique à la taille voulue en jouant sur Scale.

    On peut aussi évidemment remplir cette forme en créant un polygone !

    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
     
    procedure TForm1.FormPaint(Sender: TObject);
    const
      Afrique : array[0..19, 0..1] of Integer = (
       (160,  30),
       (260,  25),
       (270,  60),
       (330,  80),
       (330,  60),
       (410,  80),
       (475, 190),
       (520, 230),
       (565, 220),
       (470, 356),
       (477, 430),
       (386, 563),
       (322, 575),
       (270, 435),
       (280, 390),
       (246, 322),
       (245, 278),
       (112, 274),
       ( 48, 194),
       ( 64, 119)
      );
    var
      Index: Integer;
      x, y : Integer;
      Scale: Single;
      Poly : array of TPoint;
    begin
      Scale := 1/2;
      Setlength(Poly, Length(Afrique));
      for Index := Low(Afrique) to High(Afrique) do
      begin
        Poly[Index].x := Round(Scale * Afrique[Index, 0]);
        Poly[Index].y := Round(Scale * Afrique[Index, 1]);
      end;
      with Canvas do
      begin
        Brush.Color := clRed;
        Polygon(Poly);
      end;
    end;
    2) le plus simple pour savoir sur quelle région se trouve la souris est de créer un bitmap 32bits dans lequel on dessine chaque région avec une couleur égale à son indexe dans le tableau des régions : Brush.Color := Index, il suffit alors de lire le pixel en x, y pour savoir quelle région est concernée Regions[Bitmap.Canvas.Pixels[x,y]]...on utilisera un index spéficique pour le fond (-1 par exemple ... attention à Regions[-1] !).
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  15. #35
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Paul TOTH : il y a tout de même plus simple à mon avis.
    utiliser du vectoriel ne veux pas spécialement dire un metafile :
    Cela dépend car Basile a très bien pu se simplifier le problème en choisissant une carte de l'Afrique existante, avec les frontières de pays, en metafile (ou convertie en metafile avec un logiciel de dessin)
    et sur lesquels il a remplacé les aplats de couleur par des "presque blancs" ... ce qui a conduit au code retenu.

    A noter que ceci a permis d'éviter d'avoir à récupérer manuellement, à la souris, les points des nombreuses frontières par approximation à partir d'une image de l'Afrique.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  16. #36
    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 : 54
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Bonjour,


    Cela dépend car Basile a très bien pu se simplifier le problème en choisissant une carte de l'Afrique existante, avec les frontières de pays, en metafile (ou convertie en metafile avec un logiciel de dessin)
    et sur lesquels il a remplacé les aplats de couleur par des "presque blancs" ... ce qui a conduit au code retenu.

    A noter que ceci a permis d'éviter d'avoir à récupérer manuellement, à la souris, les points des nombreuses frontières par approximation à partir d'une image de l'Afrique.

    A+.
    oui mais comme explique Shai, son metafile n'est en fait qu'un bitmap, il n'a aucun intérêt

    j'ai fait mon exemple rapidement avec 20 points, mais le format SVG qui n'est pas bien compliqué à lire donne toutes les cartes que l'on veux

    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  17. #37
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    A Paul TOTH
    Merci beaucoup pour les réponses mais j'ai déjà mes cartes et je n'ai pas trop bossé les régions... Jusque là, je gère les collisions avec ptinrect et intersectrect. Comme le dit Gilbert Geyer, ça marche très bien avec sa méthode. Un petit exemple avec, cette fois l'Europe + la carte :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls,axctrls,JPEG;
     
    type
      TForm1 = class(TForm)
        PaintBox1: TPaintBox;
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
        procedure PaintBox1Paint(Sender: TObject);
        procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormDestroy(Sender: TObject);
        procedure Edit1Change(Sender: TObject);
      private
        { Déclarations privées }
        bmp,bmpmemoire : TBitmap;
        col,colprec : TColor;
        procedure fond(bitmap : TBitmap;color : TColor);
        function TripletoColor(RGBTriple :  pRGBTriple) : TColor;
        function BMP24fromFile(const nomFichierImg: string): tBitMap;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
    const
       Europe : array[0..37] of string = ('Russie','Biélorussie','Ukraine','Moldavie','Roumanie','Bulgarie','Macédoine','Grèce','Finlande','Estonie','Lettonie','Lituanie','Pologne','Slovaquie','Hongrie','Croatie','Bosnie Herzegovine','Serbie','Monténégro','Albanie','Suède','Norvège','Danemark','Allemagne','République Tchèque','Autriche','Slovénie','Suisse','Italie','Islande','Irlande','Royaume-Uni','Pays-Bas','Belgique','Luxembourg','France','Espagne','Portugal');
       tab : array[0..37] of TColor = ($98316F,$983170,$98306F,$97316F,$98316E,$98326F,$99316F,$97306E,$993271,$98316D,$982F6F,$96316F,$962F6E,$982F70,$982F71,$982E6F,$982E70,$982E71,$9A2E70,$9A306E,$9A316E,$9A2F6E,$9A2E6E,$982E6D,$982F6D,$98306D,$992F6D,$99306D,$99316D,$9A2F6D,$9A306D,$9A316D,$992E6D,$9A2E6D,$99326F,$98326E,$983270,$98326D);
       max : integer = 37;
     
    implementation
     
    {$R *.dfm}
     
    function TForm1.BMP24fromFile(const nomFichierImg: string): tBitMap; // ajouter axCtrls et Jpeg dans le uses pour TOleGraphic , pas besoin de GIFImage
    const FormatsSupportes = '.BMP.DIB.GIF.ICO.JIF.JPG.WMF.EMF';
    var OleGraphic: TOleGraphic; FS: TFileStream; ext: string;
      JPEGImage: TJPEGImage; img: tImage; pl: tPanel;
    begin
      if not FileExists(nomFichierImg) then begin
        showMessage(nomFichierImg + ' : n''existe pas'); Result := nil; EXIT;
      end;
      ext := UpperCase(ExtractFileExt(nomFichierImg));
      if (ext = '') or (pos(ext, FormatsSupportes) = 0) then
      begin showMessage(ext + ' = Format non supporté par BMP24fromFile');
        Result := nil; EXIT;
      end;
      if ext = '.BMP' then begin
        Result := tBitmap.create;
        Result.PixelFormat := pf24Bit;
        Result.LoadFromFile(nomFichierImg);
        EXIT;
      end;
      if ext = '.JPG' then begin
        try
          JPEGImage := TJPEGImage.Create;
          Result := TBitmap.Create;
          Result.PixelFormat := pf24Bit;
          try // test de chargement
            JPEGImage.LoadFromFile(nomFichierImg);
            JPEGImage.DIBNeeded;
            Result.Assign(JPEGImage);
          finally
            JPEGImage.Free;
          end;
        except
          Result := nil;
        end;
        EXIT;
      end;
      OleGraphic := TOleGraphic.Create;
      FS := TFileStream.Create(nomFichierImg, fmOpenRead or fmSharedenyNone);
      img := tImage.Create(pl); //<- petit inconvénient : nécessite un AOwner
      // et on peut ignorer l'[Avertissement] ... La variable 'pl' n'est peut-être pas initialisée
      // ça marche quand-même.
      try
        OleGraphic.LoadFromStream(FS);
        img.Picture.Assign(OleGraphic);
        Result := tBitmap.create;
        with Result do
        begin PixelFormat := pf24Bit;
          Width := img.Picture.Width;
          Height := img.Picture.Height;
          Canvas.Draw(0, 0, img.Picture.Graphic);
        end;
      finally
        fs.Free;
        img.free;
        OleGraphic.Free;
      end;
    end; // BMP24fromFile
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     DoubleBuffered := true;
      bmpmemoire := BMP24fromFile('C:\Users\valentin\Desktop\géoval\europe.EMF');
      ClientWidth:=bmpmemoire.Width;
      ClientHeight:=bmpmemoire.Height;
      PaintBox1.Width := bmpmemoire.Width;
      PaintBox1.Height := bmpmemoire.Height;
      bmp := TBitmap.Create;
      bmp.Assign(bmpmemoire);
      colprec:=clwhite;
    end;
     
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    begin
      Paintbox1.Canvas.Draw(0,0,bmp);
    end;
     
    procedure TForm1.fond(bitmap : TBitmap;color : TColor);
    var y : integer;
        p : pRGBTriple;
    begin
        bitmap.PixelFormat := pf24Bit;
        p := bitmap.ScanLine[bitmap.Height - 1];
        for y := 0 to bitmap.Width * bitmap.Height - 1 do
        begin
          if tripletocolor(p) = col then
          begin
            p^.rgbtBlue := getBvalue(color);
            p^.rgbtGreen := getGvalue(color);
            p^.rgbtRed := getRvalue(color);
          end;
          inc(p);
        end;
    end;
     
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
      var i : integer;
    begin
      col := getPixel(bmpmemoire.Canvas.Handle, x, y);
      if col=colPrec then EXIT;
      bmp.Assign(bmpmemoire); Paintbox1.Invalidate;
      for i := 0 to max do
      begin
        if (col = tab[i]) then
        begin
          Caption:=europe[i];
          fond(bmp,clblue);
          break;
        end else
        begin
         if col <> clblue then bmp.Assign(bmpmemoire);
         Caption:='Form1';
         end;
      end;
      Paintbox1.Invalidate;
      colPrec:=col;
    end;
     
    function TForm1.TripletoColor(RGBTriple : PRGBTriple) : TColor;
    begin
      result:=rgb(RGBTriple.rgbtRed,RGBTriple.rgbtGreen,RGBTriple.rgbtBlue);
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      bmp.Free;
      bmpmemoire.Free;
    end;
     
     
    procedure TForm1.Edit1Change(Sender: TObject);
    var i : integer;
    begin
      For i:=0 to max do
      begin
        if Edit1.Text = europe[i] then
        begin
          bmp.Assign(bmpMemoire);
          col:=tab[i];
          fond(bmp,clgreen);
          Paintbox1.Invalidate;
        end;
      end;
    end;
     
    end.
    Le redimensionnement n'est pas trop important puisque la reconnaissance des pays ne se fait pas par les frontières mais par la couleur de la zone correspondant au pays.

    Merci encore pour les suggestions. C'est très gentil de votre part!!!

    A Gilbert Geyer, je vais cibler ce qui me bloque vraiment et je vous poserais la question!
    Fichiers attachés Fichiers attachés

  18. #38
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Paul TOTH : j'ai fait mon exemple rapidement avec 20 points, mais le format SVG qui n'est pas bien compliqué à lire donne toutes les cartes que l'on veut
    OK, merci pour l'info, c'est bon à savoir pour le cas où ... et il ne resterait alors plus qu'à savoir lire le format SVG.

    Basile : je vais cibler ce qui me bloque vraiment et je vous poserai la question !
    OK, selon la question il y aura certainement l'un des participants qui donnera une bonne réponse.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  19. #39
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Je rejoins Paul sur son approche tout en précisant que si on a du vectoriel... on a plus besoin de bitmap
    A la place on va créer des régions et utiliser PtInRegion, FillRegion, FrameRegion.

    ps : si on ne dispose que d'un bitmap, mais qu'il ne contient que deux couleurs, créer la région n'est pas très compliqué à l'aide de ScanLine, ligne par ligne et CreateRectRgn/CombineRgn.

  20. #40
    Membre actif Avatar de Basile le disciple
    Homme Profil pro
    étudiant Centrale Supélec
    Inscrit en
    Avril 2013
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : étudiant Centrale Supélec

    Informations forums :
    Inscription : Avril 2013
    Messages : 147
    Points : 279
    Points
    279
    Par défaut
    Bonjour tout le monde,

    j'ai beaucoup regardé le programme de gilber Geyer et j'ai réussi à me répondre moi même à mes questions sauf pour ça :

    j'ai remarqué que l'on pouvait enregistrer son travail mais je n'ai pas compris comment! Voici, je suppose, le bout de code qui permet d'enregistrer :

    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 TFrmDemoMain.btnSaveBitmapClick(Sender: TObject);
    const nf = 'XBR_Redimensionné.bmp';
    var nfc: string;
    begin
      with SavePictureDialog1 do begin
        Filter := 'Fichier *.bmp|*.bmp)';
        if FN = '' then FileName := nf else
        begin
          nfc := extractFileName(FN);
          nfc := ChangeFileExt(nfc, '.bmp');
          FileName := 'Redimensionné_' + nfc;
        end;
        if Execute then begin
          imgResized.Picture.Bitmap.SaveToFile(FileName);
        end;
      end;
    end;

    et aussi, comment avez-vous réussi à faire progresser la ProgressBar?
    Et je n'ai pas trop compris la procédure sablier.
    Sinon, tout ce que je n'ai pas compris, c'est des maths mais c'est pas de mon niveau(de basile).

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [AC-97] Zone de Liste avec couleur sur les lignes
    Par Dewey12 dans le forum IHM
    Réponses: 3
    Dernier message: 07/10/2011, 17h42
  2. Réponses: 2
    Dernier message: 23/10/2009, 12h55
  3. zone de liste avec aperçu couleur
    Par estebandelago dans le forum IHM
    Réponses: 4
    Dernier message: 08/06/2007, 16h16
  4. Zone de liste avec 2 couleurs differentes
    Par uloaccess dans le forum Access
    Réponses: 2
    Dernier message: 02/11/2005, 18h10
  5. pb couleur avec Scanline
    Par bobymaw dans le forum C++Builder
    Réponses: 6
    Dernier message: 10/05/2004, 23h25

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