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

C++Builder Discussion :

zoomer et agrandir image en builder


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 23
    Par défaut zoomer et agrandir image en builder
    Salut
    SVP
    comment faire un zoom d'une image et l'agrandir en builder c++
    Merci

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Il y a une seule chose "rapide" (à développer) et qui est relativement moche : la propriété Stretch d'un TPicture ou la fonction StretchDraw (du TCanvas il me semble mais à vérifier).

    Autre solution : coder toi même un algorithme de redimensionnement...ça doit se trouver en pseudo code assez facilement via .

    Mais si les résultats graphiques de la première te conviennent, et j'en doute, garde la première

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Comme je te l'ai dit, il existe plusieurs solutions qui dépendent de ce que l'on doit faire.

    Voici un exemple qui suppose :
    a) une TForm (ici Form1),
    b) un TMainMenu avec les rubriques :
    - Fichier (Ouvrir, Quitter)
    - Zoom (In ShortCut = F5, Out ShortCut = F6)
    c) une TOpenPictureDialog

    Les mécanismes apportés sont les suivants :

    - Zoom in et zoom out (depuis un menu ou leur shortcut).
    Lorsque Zoom <= 1.0 l'image se positionne en haut à gauche de la fenêtre.
    Lorsque Zoom > 1.0, l'image peut être repositionnée dans la fenêtre, ce qui est très utile !
    - Repositionnement de l'image dans la fenêtre avec le bouton droit de la souris.
    Ce déplacement n'est possible que lorsque le facteur zoom est plus grand que 1.0.

    Explications pour les trois bitmaps.

    - Image ne fait que contenir l'image source.
    - Bitmap sert à copier le résultat dans la fenêtre.
    - Temp est utilisé lorsque le facteur zoom est > 1.0.
    Avec ma version BCB3 Pro, le StretchDraw décroche en fonction du facteur zoom et de la dimension
    de la fenêtre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double Zoom = 1.0;
    TPoint Org = Point(0,0);
    TPoint Scroll;
    bool MoveFlag = false;
    Graphics::TBitmap *Image = new Graphics::TBitmap;
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
    Graphics::TBitmap *Temp = new Graphics::TBitmap;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::Ouvrir1Click(TObject *Sender)
    {
    if(OpenPictureDialog1->Execute())
        {
        Image->LoadFromFile(OpenPictureDialog1->FileName);
        Org = Point(0,0);
        Zoom = 1.0;
        DrawBitmap();
        }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::Quitter1Click(TObject *Sender)
    {
    Close();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    delete Image;
    Image = NULL;
    delete Bitmap;
    Bitmap = NULL;
    delete Temp;
    Temp = NULL;
    Action = caFree;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
    DrawBitmap();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormResize(TObject *Sender)
    {
    DrawBitmap();
    }
    Méthode membre de TForm1, à déclarer en public
    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
    void __fastcall TForm1::DrawBitmap()
    {
    TRect S;
    TRect D;
    TCanvas *B;
    TCanvas *T;
    int w;
    int h;
    if((Image != NULL) && (Bitmap != NULL) && (Temp != NULL))
        {
        int we = ClientWidth;
        int he = ClientHeight;
        if(Bitmap->Width != we) Bitmap->Width = we;
        if(Bitmap->Height != he) Bitmap->Height = he;
        B = Bitmap->Canvas;
        T = Temp->Canvas;
        B->Pen->Mode = pmCopy;
        B->Pen->Style =psSolid;
        B->Brush->Color = Color;
        B->Brush->Style = bsSolid;
        B->FillRect(Rect(0, 0, we, he));
        if(Zoom < 1.0)
            {
            Org = Point(0,0);
            w = Image->Width * Zoom;
            h = Image->Height * Zoom;
            D = Rect(0,0, w, h);
            S = Rect(0,0, Image->Width, Image->Height);
            B->StretchDraw(D, Image);
            }
        else
            {
            if(Zoom == 1.0)
                {
                Org = Point(0,0);
                B->Draw(0,0, Image);
                }
            else
                {
                Temp->Width = we / Zoom;
                Temp->Height = he / Zoom;
                T->Brush->Color = Color;
                T->Brush->Style = bsSolid;
                T->FillRect(Rect(0,0, Temp->Width, Temp->Height));
                T->Draw(-Org.x, -Org.y, Image);
                B->StretchDraw(Rect(0,0,we,he), Temp);
                }
            }
        Canvas->Draw(0,0,Bitmap);
        }
    }
    OnClick du menuItem ZoomIn
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::ZoomIn(TObject *Sender)
    {
    Zoom = Zoom * 2;
    DrawBitmap();
    }
    OnClick du Menuitem ZoomOut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::ZoomOut(TObject *Sender)
    {
    Zoom = Zoom / 2;
    DrawBitmap();
    }
    Méthodes pour le repositionnement de l'image dans la fenêtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    if(Button == mbRight)
        {
        if(Zoom > 1.0)
            {
            MoveFlag = true;
            Scroll = Point(X,Y);
            Cursor = crSizeAll;
            }
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    if(MoveFlag)
        {
        Org = Point(Org.x + Scroll.x - X, Org.y + Scroll.y - Y);
        Scroll = Point(X,Y);
        DrawBitmap();
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    if(MoveFlag)
        {
        MoveFlag = false;
        Cursor = crArrow;
        }
    }
    A plus !

  4. #4
    Membre averti
    Inscrit en
    Février 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 23
    Par défaut remerciment
    merci bien

  5. #5
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 37
    Par défaut
    Bonjour,

    henderson ton programme de zoom marche très bien, mais moi j'aurais voulu que mon Bitmap contienne l'image entièrement zoomer et pas uniquement la partie afficher. Comment faire ?

    Merci

  6. #6
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 37
    Par défaut
    J'ai mis ce bout de code dans mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Graphics::TBitmap *Bitmap  = new Graphics::TBitmap;
     
        if ( Zoom != 1.0 )
           {
           if ( Bitmap->Width  != l_origine->Width  ) Bitmap->Width  = l_origine->Width  * Zoom;
           if ( Bitmap->Height != l_origine->Height ) Bitmap->Height = l_origine->Height * Zoom;
     
           Bitmap->Canvas->StretchDraw(Rect(0, 0, Bitmap->Width * Zoom, Bitmap->Height * Zoom), l_origine);
           Image1->Picture->Bitmap->Assign(Bitmap);
           }
        else
           Bitmap->Assign(l_origine);
    Ca marche bien si j'ai fait un zoom = 2.0, mais si je passe à 4.0 ca plante : "Espace insufisant pour traiter cette commande".

    Quelqu'un sait il faire un zoom COMPLET d'une image.

    Merci

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Le problème est :

    "Espace insufisant pour traiter cette commande".
    C'est pour cette raison que je n'applique le zoom que sur la partie visible.

    A plus !

Discussions similaires

  1. zoomer sur une image
    Par lekooto dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/02/2007, 19h15
  2. agrandir images au survol
    Par charlene44 dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 01/11/2006, 13h37
  3. Zoomer sur une image
    Par Lynecoln dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 02/09/2006, 22h56
  4. traitement d'image sous builder
    Par renovator dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/07/2006, 14h47

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