Redimensionnement d'un TImage [Résolu]

Jardac 4 Messages postés dimanche 8 février 2004Date d'inscription 25 avril 2012 Dernière intervention - 16 avril 2012 à 15:59 - Dernière réponse : Jardac 4 Messages postés dimanche 8 février 2004Date d'inscription 25 avril 2012 Dernière intervention
- 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
Jardac 4 Messages postés dimanche 8 février 2004Date d'inscription 25 avril 2012 Dernière intervention - 16 avril 2012 à 22:56
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

Merci Jardac 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Jardac
Meilleure réponse
korgis 424 Messages postés samedi 17 mai 2003Date d'inscription 4 août 2018 Dernière intervention - 17 avril 2012 à 09:34
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.

Merci korgis 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de korgis
Jardac 4 Messages postés dimanche 8 février 2004Date d'inscription 25 avril 2012 Dernière intervention - 17 avril 2012 à 10:41
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
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 21 avril 2012 à 15:46
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
Jardac 4 Messages postés dimanche 8 février 2004Date d'inscription 25 avril 2012 Dernière intervention - 25 avril 2012 à 11:39
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.