bonjour à tous,
je charge certains TJpegImage par LoadFromFile, et j'aimerais redimensionner ceux-ci.
En effet j'ai certains Jpeg d'une résolution de 7162 x 5781 par exemple....! (28 Mo)
Est ce possible ?
Merci d'avance.
bonjour à tous,
je charge certains TJpegImage par LoadFromFile, et j'aimerais redimensionner ceux-ci.
En effet j'ai certains Jpeg d'une résolution de 7162 x 5781 par exemple....! (28 Mo)
Est ce possible ?
Merci d'avance.
Bonjour.
La méthode à utiliser pour redimensionner une image JPEG, est de passer par un intémédiaire BITMAP (Un JPEG est un bitmap compressé, et une fois décompressé pour la l'affichage, c'est de nouveau un BITMAP). C'est la méthode StretchDraw qu'il faut utiliser. Enfin, c'est la plus simple, j'en ai d'autres. Attention au piège des grandes dimentions, StretchDraw plante pour de grandes différences de dimentions.
Voici deux codes que j'utilise dans un de mes programmes (ConvertSerie).
La meilleur méthode pour charger un JPEG dans un TBitMap.
Pour redimentionner et sauver.
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 {----------------------------------------------------------------------------} Procedure TForm1.ChargeImageJPEG(Nom : String;Image : TImage); Var ImageJPEG : TJPEGImage; ImageBmp : TBitMap; Begin ImageJPEG:=TJPEGImage.Create; Try ImageJPEG.LoadFromFile(Nom); ImageBmp:=TBitMap.Create; Try ImageBmp.Assign(ImageJPEG); Image.Picture.BitMap.Assign(ImageBmp); finally ImageBmp.Free; end; Finally ImageJPEG.Free; end; End; {----------------------------------------------------------------------------}
Avec ça, tu devrais t'en sortir.
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 {----------------------------------------------------------------------------} Function TForm1.SauveVignete(Nom : String) : TPoint; Var GIF : TGifImage; Image : TJPEGImage; R : Word; Ext,ID : String; Image2 : TImage; BMP : TBitMap; TypeDim1, TypeDim2 : Integer; CompresseTGA, Valide,Change : Boolean; IW,IH,Fact,W,H : Double; Begin Change:=True; W:=120; H:=90; IW:=Image1.Picture.Width; IH:=Image1.Picture.Height; Valide:=False; Fact:=1; Ext := LowerCase(ExtractFileExt(Nom)); Image2:=TImage.Create(Self); Case RadioGroup1.ItemIndex Of 0 : TypeDim1 := 1; 1 : TypeDim1 := 2; End; If TypeDim1 = 1 Then //120*90 begin ID:='_120'; If Not CheckRatio.Checked Then begin W:=120; H:=90; end Else begin If IW > IH Then Fact:=120 / IW Else Fact:=90 / IH; end; end; If TypeDim1 = 2 Then //160x100 begin ID:='_160'; If Not CheckRatio.Checked Then begin W:=160; H:=100; end Else begin If IW > IH Then Fact:=160 / IW Else Fact:=100 / IH; end; end; If Fact=0 Then Fact:=1; If Change Then begin W:=(IW * Fact); H:=(IH * Fact); If ((IW * IH) > 4000000) And ((W * H) < 90000) Then // Passer par une réduction intermédiaire // Indispensable pour éviter le plantage // de la méthode StretchDraw. begin BMP:=TBitMap.Create; BMP.Width:=Image1.Picture.Bitmap.Width Div 10; BMP.Height:=Image1.Picture.Bitmap.HeiGht Div 10; BMP.Canvas.StretchDraw(Rect(0,0,BMP.Width,BMP.Height),Image1.Picture.Graphic); If Bilineaire Then begin REDIMENSIONNEMENT_Bilineaire(BMP,Round(W) - 1,Round(H)- 1); Image2.Picture.BitMap.Assign(BMP); end Else begin Image2.Picture.BitMap.Width:=Round(W); Image2.Picture.BitMap.Height:=Round(H); Image2.Picture.BitMap.Canvas.StretchDraw(Rect(0,0,Round(W),Round(H)),BMP); end; BMP.Free; end Else begin Image2.Picture.BitMap.Width:=Round(W); Image2.Picture.BitMap.Height:=Round(H); Image2.Picture.BitMap.Canvas.StretchDraw(Rect(0,0,Round(W),Round(H)),Image1.Picture.Graphic); end; end Else Image2.Picture.Bitmap.Assign(Image1.Picture.Graphic); If FileExists(Nom) Then begin R:=MessageDLG('Le fichier image ' + Nom + ' existe !' + #10 + #13 + 'Voulez vous remplacer, ou abandonner les opérations ?', mtConfirmation,[mbYes,mbNo,mbAbort],0); If R = mrAbort Then begin Image2.Free; Exit; end; If R = mrNo Then Valide:=False; If R = mrYes Then begin DeleteFile(Nom); Valide:=True; end; end Else Valide:=True; If Valide Then begin If Ext='.bmp' Then Image2.Picture.BitMap.SaveToFile(Nom); If Ext='.jpg' Then begin Try Image:=TJPEGImage.Create; Try Case Image2.Picture.BitMap.PixelFormat Of pf15bit,pf16bit,pf24bit, pf32bit,pfcustom,pfdevice :Image.PixelFormat:=jf24bit; Else Image.PixelFormat:=jf8bit; End; Image.CompressionQuality:=Qualite; Image.Assign(Image2.Picture.BitMap); Image.SaveToFile(Nom); Except Image.Free; end; Except end; end; end; Application.ProcessMessages; Image2.Free; Result.x := Round(W); Result.y := Round(H); End; //-------------------------------------------------------------------------
Bonjour et merci Philippe.
Je vais tester ton code, mais il me semble que c'est la meilleure solution en effet.
J'ai d'ailleurs également trouvé cette procédure qui ressemble à la tienne et qui permet de redimensionner un jpeg :
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 {* Redimensionne un JPEG avec comme width le MaxSize *} procedure ResizeJpeg(srcJpeg, destJpeg: TJpegImage; const MaxSize: integer); var Bitmap: TBitmap; Ratio: double; begin {Si l'image est vide ou la largeur est nulle, sortir} if (srcJpeg.Empty) or (MaxSize <= 0) then Exit; { Création d'un TBitmap le temps de redimensionner l'image } Bitmap := TBitmap.Create; try { Détermination du cadrage Vertical ou horizontal} Ratio := srcJpeg.Height / srcJpeg.Width; if Ratio > 1 then //Cadrage vertical Bitmap.Width := Round(MaxSize / Ratio) else //cadrage horizontal Bitmap.Width := MaxSize; Bitmap.Height := Round(Bitmap.Width * Ratio); //Copie de l'image avec redimensionnement sur le canvas du TBitmap Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect, srcJpeg); {Il ne reste plus qu'à copier l'image redimensionnée dan le Jpeg à retourner} destJpeg.Assign(Bitmap); finally Bitmap.Free; //désallocation memoire end; end;
Salut! J'ai une démo qui pourrait t'intéresser. Elle te donne le code pour passer d'un jpeg à un bitmap et inversement. Elle possède quelques fonctions basiques, filtres & zoom.
http://sub0.developpez.com/delphi/jpeg_shell.zip
Le filtre anti-aliasing est un flou légé en fait, mais aujourd'hui, j'utiliserai plutot un redimensionnement avec un vrai anti-aliasing...
Dans la démo suivante, l'image est redimensionnée avec un filtre anti-alisaing (plusieurs choix possible) en fonction des dimensions de la fenêtre. La qualité du résultat n'a rien à voir avec un redimensionnement sans filtre :
http://sub0.developpez.com/delphi/AAlias2.zip.zip
à+
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager