Redimensionnement d'un TImage [Résolu]

Messages postés
4
Date d'inscription
dimanche 8 février 2004
Dernière intervention
25 avril 2012
- - Dernière réponse : Jardac
Messages postés
4
Date d'inscription
dimanche 8 février 2004
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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
4
Date d'inscription
dimanche 8 février 2004
Dernière intervention
25 avril 2012
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 105 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Jardac
Messages postés
423
Date d'inscription
samedi 17 mai 2003
Dernière intervention
4 août 2018
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 105 internautes nous ont dit merci ce mois-ci

Commenter la réponse de korgis
Messages postés
4
Date d'inscription
dimanche 8 février 2004
Dernière intervention
25 avril 2012
0
Merci
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
Commenter la réponse de Jardac
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
0
Merci
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).

________________________________________________________
Commenter la réponse de f0xi
Messages postés
4
Date d'inscription
dimanche 8 février 2004
Dernière intervention
25 avril 2012
0
Merci
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
Commenter la réponse de Jardac

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.