Bonjour,
j'aimerais savoir comment l'on peut redimensionner une image et la sauvegarder en un nouveau fichier ?
Ex.: image d'origine = 1024x768, image redimensionnée en 300x200.
Merci,
Bonjour,
j'aimerais savoir comment l'on peut redimensionner une image et la sauvegarder en un nouveau fichier ?
Ex.: image d'origine = 1024x768, image redimensionnée en 300x200.
Merci,
Avec l'API StretchBlt.
Il faut jouer sur les largeur/hauteur de destination si tu veux une image proportionnelle.
Ou je trouve ca StretchBit ?
Y a t-il un exemple a quelque part ?
Merci
salut,
voici un exemple qui répond à ton besoin.j'aimerais savoir comment l'on peut redimensionner une image et la sauvegarder en un nouveau fichier ?
Ex.: image d'origine = 1024x768, image redimensionnée en 300x200.
D'abord, on ouvre l'image et puis on va ma redimensionner en 300x200.
1-mets un "OpenPictureDialog" qui servira à ouvrir l'image.
2-mets un"Image" sur ta fiche qui servira à visualiser ton image.
3-ajoute un bouton "ouvrir" et ajoute ce code:pour sauvegarder l'image avec les nouvelles dimensions, il suffit d'ajouter ce code:
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 procedure TForm1.Button1Click(Sender: TObject); var ImageSourceBMP : TBitmap; ImageCibleBmp : TBitmap; RectCible : TRect; NouvLargeur, NouvHauteur:Integer; begin OpenPictureDialog1.execute; if OpenPictureDialog1.FileName = '' then else Image1.Picture.LoadFromFile(OpenPictureDialog1.filename); NouvLargeur:=300;// nouvelle taille de la largeur de l'image NouvHauteur:=200;//nouvelle taille de la hauteur de l'image RectCible.Left:=0; RectCible.Top:=0; RectCible.Right :=NouvLargeur; RectCible.Bottom :=NouvHauteur; ImageSourceBMP:=nil; ImageCibleBmp:=nil; try ImageSourceBMP := TBitmap.Create; ImageCibleBmp := TBitmap.Create; ImageSourceBMP.Width := Image1.Picture.Width; // détermination de la taille de ImageBMP ImageSourceBMP.Height := Image1.Picture.Height; ImageSourceBMP.Canvas.Draw(0,0,Image1.Picture.Graphic); // On dessine dans ImageBMP //Fin de création du ImageSourceBMP ImageCibleBmp.Width :=NouvLargeur; ImageCibleBmp.Height :=NouvHauteur; Image1.Width :=NouvLargeur; // si on veut voir toute l'image à l'écran Image1.Height :=NouvHauteur; // autre solution : mettre son autosize à true. ImageCibleBmp.Canvas.StretchDraw(RectCible,ImageSourceBmp); // là on redessine avec une autre taille // Fin de création de ImageCibleBMP Image1.Picture.Assign(ImageCibleBMP); Finally ImageSourceBMP.Free; ImageCibleBmp.Free; end; end;A+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 procedure TForm1.Button2Click(Sender: TObject); begin Image1.Picture.SaveToFile('c:\le nom ton image.bmp'); end;
NABIL74
je l'ai testé sur les images bmp mais pas sur les jpeg...
je ne peux pas la testé maintenant car je n'ai pas delphi là où je suis.
a+
NABIL74
Pour commencer, ta réduction ne sera pas bonne. Tu dois garder le même facteur de grandeur (4:3) 1024 Large X 768 Haut a un facteur normal pour une photo (1024 *3 / 4 = 768). 300 X 200 ne l'a pas (300 * 3 / 4 =225. Tu obtiendrais une photo déformé. Les appareils photos ont généralement ce facteur de grandeur.
Pour le code, voici un extrait de code que j'utilise pour la réduction ou agradissement.
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 Procedure TPrinc.Redimentionne; Var jpg :TJpegImage; Bmp,Bmp2 :TBitMap; Photo :String; begin Jpg := TJpegImage.Create; Bmp := TBitMap.Create; Bmp2:= TBitMap.Create; ext:=uppercase(ext); //vient d'un TOpenPictureDialog: Ext:= ExtractFileExt(ouvrir.FileName) Try SavePictureDialog1.FileName:=''; if ext='.BMP' then bmp2.LoadFromFile(Ouvrir.filename) else jpg.LoadFromFile(Ouvrir.filename); Bmp.Width :=Large; //largeur défini par un TRadioButton Bmp.Height:=Haut; // Hauteur défini par le même TRadioButton if ext='.BMP' then Bmp.Canvas.StretchDraw(Bmp.Canvas.ClipRect,Bmp2) else Bmp.Canvas.StretchDraw(Bmp.Canvas.ClipRect,Jpg); if ext='.BMP' then begin Bmp2.Assign(Bmp); SavePictureDialog1.FilterIndex:=4; SavePictureDialog1.DefaultExt:='.bmp'; end else begin Jpg.Assign(Bmp); SavePictureDialog1.FilterIndex:=2; SavePictureDialog1.DefaultExt:='.jpg'; end; Photo:=ExtractFileName(Ouvrir.Filename); if SavePictureDialog1.Execute then if uppercase(ext)='.BMP' then BMP.SavetoFile(SavePictureDialog1.FileName)else JPG.SavetoFile(SavePictureDialog1.FileName); Finally { libération des ressources} Jpg .Free; Bmp .Free; Bmp2.Free; end; end; // Chaque RadioButton a une valeur différente procedure TPrinc.RadioButton1Click(Sender: TObject); begin if RadioButton1.Checked=true then // si checked false, pas d'action begin if large > haut then begin Large:=320; Haut:=240; end else begin Large:=240; Haut:=320; end; LabelInfo.Caption:='Redimentionner en '+IntToStr(Large)+' X '+IntToStr(Haut); BtnConfirm.Enabled:=True; end; end;
Voici une autre fonction utilisant un TPicture. Tous les types d'image sont ainsi supportés (pour autant que les bonnes unités soient dans le Uses).
L'image est sauvée en gardant les proportions.
A noter que cette fonction ne fait pas de conversion de types. Le format de sortie doit être le format d'entrée !
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 uses Math, Jpeg; function ResizeImage(const aFileIn, aFileOut :TFileName; const aMaxWidth, aMaxHeight: integer): boolean; var Scale :real; Pict :TPicture; Bmp :TBitmap; begin Result := FALSE; if FileExists(aFileIn) then begin Pict := TPicture.Create; Bmp := TBitmap.Create; try Pict.LoadFromFile(aFileIn); Scale := Min(aMaxWidth /Pict.Width, aMaxHeight /Pict.Height); Bmp.Width := Round(Pict.Width *Scale); Bmp.Height := Round(Pict.Height *Scale); Bmp.Canvas.StretchDraw(Rect(0,0, Bmp.Width, Bmp.Height), Pict.Graphic); Pict.Assign(Bmp); Pict.SaveToFile(aFileOut); Result := TRUE; finally Pict.Free; Bmp.Free; end; end; end;
Concernant ta réponse Andnotor, serait-il compliqué de traduire cela en C++ avec Borland ?
Car j'utilise BC++Builder pour faire mon programme. Je sais que c'est semblable mais bon, j'aurais besoin d'un petit coup de main
Merci
Il aurait peut être mieux valu poster sur forum c++ que Delphi non ?
Partager