Redimensionnement d'un TImage

Résolu
Jardac Messages postés 4 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 avril 2012 - 16 avril 2012 à 15:59
Jardac Messages postés 4 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 avril 2012 - 25 avril 2012 à 11:39
Bonjour à tous,

J'ai un problème curieux avec un TImage sous Delphi 7.
Le but est de le redimensionner suivant les valeurs de 2 variables.
voici une expérience avec :
- une Form
- un ScrollBox avec Align à alClient
- un TImage dans le ScrollBox
- un bouton qui définit les 2 valeurs largeur et hauteur et qui lance le redimensionnement
- un autre bouton qui donne deux autres valeurs pour largeur et hauteur et qui lance aussi le redimensionnement
Avec l'un ou l'autre bouton on voit le TImage par coloriage.
Et voici la "curiosité" :
- si on lance d'abord le redimensionnement avec le bouton 1 (les plus petites valeurs) cliquer ensuite sur le bouton 2 ne change rien !!!
- si on lance d'abord le redimensionnement avec le bouton 2 (les plus grandes valeurs) alors les 2 boutons font par la suite les changements de dimensions correctement.

J'ai trouvé une demi-solution : mettre la ligne "Height := Hauteur ;" après "Canvas.FillRect(Canvas.ClipRect) ;"
Et ça marche avec la hauteur mais pas avec la largeur !!!

Si quelqu'un voit où est le problème... je le remercie chaleureusement par avance... ça fait un bout de temps que je cherche sans rien trouver !

Voici le code :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
ScrollBox1: TScrollBox;
ImgEssai: TImage;
BtnFormatImage1: TButton;
BtnFormatImage2: TButton;
procedure BtnFormatImage1Click(Sender: TObject);
procedure BtnFormatImage2Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
procedure ColorierImage ;
var
Form1: TForm1;
Largeur, Hauteur : integer ;

implementation

{$R *.dfm}

procedure TForm1.BtnFormatImage1Click(Sender: TObject);
begin
Largeur := 800 ;
Hauteur := 200 ;
ColorierImage ;
end ;

procedure ColorierImage ;
begin
with Form1.ImgEssai do
begin
Top := 40 ;
Left := 80 ;
Width := Largeur ;
Height := Hauteur ;
Canvas.Brush.Color := $00E6FFFE ;
Canvas.FillRect(Canvas.ClipRect) ;
end ;
end ;


procedure TForm1.BtnFormatImage2Click(Sender: TObject);
begin
Largeur := 1100 ;
Hauteur := 600 ;
ColorierImage ;
end;

end.



Jardac

5 réponses

Jardac Messages postés 4 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 avril 2012
16 avril 2012 à 22:56
Bonsoir,

Bon, je me réponds à moi-même...
Pour contourner ce problème de redimensionnement d'un TImage, il suffit de créer un bitmap aux dimensions désirées et, après avoir donné les bonnes valeurs Width et Height au TImage, on utilise :
Picture.Assign(Bitmap) ;

et mes excuses pour avoir failli vous déranger pour si peu...!


Jardac
3
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
17 avril 2012 à 09:34
Salut,

On peut aussi redimensionner le bitmap de Image.Picture directement (sans passer donc par un autre bitmap), comme ceci :

procedure ColorierImage;
begin
  with Form1.ImgEssai do
  begin
    Top := 40;
    Left := 80;
    Width := Largeur;
    Height := Hauteur;
    // redisensionnement du Bitmap :
    Picture.Bitmap.Width := Largeur;
    Picture.Bitmap.Height := Hauteur;
    //
    Canvas.Brush.Color := $00E6FFFE;
    Canvas.FillRect(Canvas.ClipRect);
  end;
end;


Quand la question est clairement posée et qu'elle ne dépasse pas la limite de ses compétences, c'est toujours un plaisir très intellectuellement stimulant d'essayer d'y répondre. N'hésite donc pas à nous déranger à nouveau.
3
Jardac Messages postés 4 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 avril 2012
17 avril 2012 à 10:41
Salut,
Et merci beaucoup pour cette précision fort intéressante. En effet, inutile de s'encombrer d'un bitmap si ce n'est pas utile par la suite.
Le comportement du TImage reste assez curieux si on veut modifier directement Width et Height. Mais c'est sûr, c'est la propriété Picture.Bitmap dont il faut s'occuper.
Et désolé d'avoir fait un copier/coller du code sans avoir vu qu'on pouvait remettre l'indentation et la coloration syntaxique directement ici !
Merci encore et bonne journée.


Jardac
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
21 avril 2012 à 15:46
Ne travail pas avec un TImage... trop chiant ce compo

TPicture ou TJpeg ou Tbitmap ou TPNGImage pour les images et les sprites
TBitmap (en backbuffer)
TPaintBox pour le dessin (onPaint -> Canvas.Draw(0,0,BackBuffer))


procedure (TForm).(TPaintBox).OnPaint(Sender: TObject); 
begin
  (TPaintBox).Canvas.Draw(0,0, Buffer);
  //(TPaintBox).Canvas.Draw(0, Buffer.Height-Sprite1.Height, Sprite1);
  //(TPaintBox).Canvas.Draw(Buffer.Width-Sprite2.Width, Buffer.Height-Sprite2.Height, Sprite2);
end;

procedure (TForm).ButtonRedimUp / (TForm).ButtonRedimDown
begin
  Buffer.Width := Width;
  Buffer.Height:= Height;
  Buffer.Assign(Source.Graphic);

  (TPaintBox).SetBounds(40, 40, Buffer.Width, Buffer.Height);
  (TPaintBox).Invalidate;
end;




(activer le doubleBuffer de la form et du scrollBox).

________________________________________________________
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jardac Messages postés 4 Date d'inscription dimanche 8 février 2004 Statut Membre Dernière intervention 25 avril 2012
25 avril 2012 à 11:39
Bonjour f0xi,
Le TImage, c'était pour dessiner mais je voulais éviter de m'occuper des redraw.
Effectivement un TPaintBox avec doubleBuffer de la form et du scrollBox, et en utilisant invalidate, ça le fait.
Les deux solutions me paraissent valables, d'autant plus qu'en mettant du doubleBuffer, ne se rapproche-t-on pas du TImage qui a aussi un bitmap en mémoire ?
Merci bien d'avoir proposé cette alternative.

Jardac
0
Rejoignez-nous