Salut
SVP
comment faire un zoom d'une image et l'agrandir en builder c++
Merci
Salut
SVP
comment faire un zoom d'une image et l'agrandir en builder c++
Merci
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![]()
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(); }Méthode membre de TForm1, à déclarer en public
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void __fastcall TForm1::FormResize(TObject *Sender) { DrawBitmap(); }
OnClick du menuItem ZoomIn
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 ZoomOut
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(); }
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 void __fastcall TForm1::ZoomOut(TObject *Sender) { Zoom = Zoom / 2; DrawBitmap(); }
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(); } }A plus !
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; } }
merci bien
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
J'ai mis ce bout de code dans mon programme :
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".
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);
Quelqu'un sait il faire un zoom COMPLET d'une image.
Merci
Salut !
Le problème est :
C'est pour cette raison que je n'applique le zoom que sur la partie visible."Espace insufisant pour traiter cette commande".
A plus !
Partager