Mon image refuse de se redimensionner [Résolu]

cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 2 oct. 2007 à 19:06 - Dernière réponse : f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention
- 4 oct. 2007 à 15:11
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /??>
<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
<v:stroke joinstyle="miter">
</v:stroke>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0">
</v:f>
<v:f eqn="sum @0 1 0">
</v:f>
<v:f eqn="sum 0 0 @1">
</v:f>
<v:f eqn="prod @2 1 2">
</v:f>
<v:f eqn="prod @3 21600 pixelWidth">
</v:f>
<v:f eqn="prod @3 21600 pixelHeight">
</v:f>
<v:f eqn="sum @0 0 1">
</v:f>
<v:f eqn="prod @6 1 2">
</v:f>
<v:f eqn="prod @7 21600 pixelWidth">
</v:f>
<v:f eqn="sum @8 21600 0">
</v:f>
<v:f eqn="prod @7 21600 pixelHeight">
</v:f>
<v:f eqn="sum @10 21600 0">
</v:f>
</v:formulas>
<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
</v:path>
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
<o:lock aspectratio="t" v:ext="edit">
</o:lock>
</v:shapetype>
Bj  
Voilà, je ne comprends pas pourquoi mon image ne se redimensionne pas lorsque je modifie sa taille. 
Je n'ai pas trouvé de réponse sur le forum, ni sur google. SetWindowPos, Repaint? ça ne semble pas convenir.
Lorsque je modifie la dimension de ma Fiche, je modifie en conséquence, les dimensions de l'image par ses propriétés Width et Height et appelle la procédure DrawImage :

procedure TForm1.SpeedButton11Click // Ordre de redimensitionnement
    ...
    Image1.Width  : = Image1.Width + pas;
    Image1.Height := Image1.Height + pas;
    Form1.position := poScreenCenter;   // Pas génial, cette instruction ici, ça saute
    DrawImage(aImage,...);
end;

La procédure DrawImage(aImg : TImage; autres paramètres ...); dessine sur le canvas de aImage:

  BmpFond : = Tbitmap.create;
  BmpFond.width   := aImg.width;
  BmpFond.height  := aImg.height;
  with BmpFond.canvas do
  begin
     ... Dessins
  end;
  aImg.Picture.Bitmap.Assign(BmpFond);
  BmpFond.Free;

Auriez-vous une piste?
Bien  à vous!
<v:shape id ="_x0000_i1026" style="WIDTH: 11.25pt; HEIGHT: 11.25pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.delphifr.com/imgs2/smile_big.gif" src="file:///C:/DOCUME~1/Admin/LOCALS~1/Temp/msoclip1/02/clip_image001.gif"></v:imagedata></v:shape>Jean_Jean






Jean_Jean
Afficher la suite 

11 réponses

Répondre au sujet
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 2 oct. 2007 à 21:22
+3
Utile
la definition de AutoSize n'est pas fausse mais uniquement dependante de l'elements TPicture (et ce qu'il y a l'interieur) et non par les propiétés de taille du composant TImage lui même.

en gros si tu regle TImage.Width/Height alors qu'il y a un bitmap plus grand ou plus petit dans TImage.Picture.Bitmap, il ne se passerat rien.

et donc, tu peu laisser autosize a true en appelant directement ta methode DrawImage et peut etre aussi en appelant TImage.Repaint a la fin (ça depend, parfois y'a besoin, parfois non).

<hr size="2" width="100%" />
http://deefaze.gnomz.com
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 2 oct. 2007 à 23:54
+3
Utile
la methode Repaint des controls est une methode publique (pas publiée) donc uniquement visible dans le code et non dans l'inspecteur.
Repaint force le control a se redessiner entierrement et peut parfois, réactiver certaines routines internes permettant par exemple la mise automatique a dimension :)

<hr size="2" width="100%" />
http://deefaze.gnomz.com
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 3 oct. 2007 à 00:15
+3
Utile
Salut,

Sauf erreur, la propriété AutoSize ajuste l'image autour du TPicture qu'elle renferme.
Elle n'agit pas sur le dimensionnement de l'image dans son cadre (Form, Panel...) si ce dernier change de dimension.
Ne pas confondre.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de japee
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 3 oct. 2007 à 00:50
+3
Utile
Salut la Cie !

@ Japee
Oui, sauf si :

Image.align := alClient
et
Image.Strecht := true

Par contre, dans ce cas la taille de TPicture gardera la taille originelle, sauf a StretchDrawer  à la main (par code, quoi)...

@F0xi
T'es le seul à avoir deux avatars différents sur tes posts et sur ton profil...
Comment que tu fais ça?   o|O
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Caribensila
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 3 oct. 2007 à 01:00
+3
Utile
...Je précise:

Quand on redimenssionne ainsi une image, le plus chiant c'est que si on veut travailler sur son Canvas, il garde la taille originelle...

Et, à moins que vous connaissiez une autre méthode, il faut de toute façon le StretchDrawer. 
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Caribensila
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 2 oct. 2007 à 19:31
0
Utile
Autant pour moi.


Mon prob est réglé. j'avais oublié de décocher la propriété AutoSize. Il faut mettre false alors que je croyais l'inverse.


L'aide dit "Spécifie si le contrôle se redimensionne automatiquement pour s'adapter à son contenu." Je pensai justement que c'était le cas en redessinant avec de nouvelles dimensions.
Bon, ça marche!

Jean_Jean
Commenter la réponse de cs_Jean_Jean
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 2 oct. 2007 à 22:09
0
Utile
Salut foxi,
OK pour tes 2 premières phrases et pour cette précision: AutoSize est dependante de l'elements TPicture (et ce qu'il y a l'interieur) et non par les propiétés de taille du composant TImage lui même. => Il ne se passe rien. Donc c'est normal.
Par contre en laissant à True, ça ne marche pas , bizarre non? Bon Diou, si ça marche. Je fatigue.
La méthode Repaint n'étant pas visible dans l'inspecteur, je n'avais pas essayé.
Est-ce dans la méthode repaint qu'il faut mettre la procédure Draw...?
Merci
Jean_Jean
Commenter la réponse de cs_Jean_Jean
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 3 oct. 2007 à 08:17
0
Utile
 Merci à tous pour vos remarques très instructives.
@Caribensila : C'est bien ce qui me titille me semble t-il!
Dans ma procédure Draw, je dessine dans un Bitmap que je transfert sur le canvas de Timage.
Donc si je résume vos interventions, la méthode c'est bien :
1. Choisir les propriétés Autosize, Align et strech en fonction des comportements à priori du conteneur TImage et TPicture du composant.    Dans mon cas, je choisis Align alNone, Autosize True, Strech = False. 
2. Draw... => Dessiner dans un Bitmap (qui lui prend en compte les nouvelles dimensions) fournies par passage de valeur
3. Appeler Draw... par Repaint du Timage (pas indispensable pour l'instant, mais à mon avis indispensable pour les autres modifications de l'image à venir dans ma prog.).
4. J'ai pensé capter l'évènement de redimensionnement de la fiche principale directement dans OnRsize de la fiche qu'en pensez-vous. Peut-être éviterai-je le sursaut de l'image lorsque je clique sur un bouton qui agrandit la fiche progressivement jusque dans ses dimensions maximales à l'écran. Qu'en pensez-vous?

Jean_Jean
Commenter la réponse de cs_Jean_Jean
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 3 oct. 2007 à 11:07
0
Utile
Salut Cari,

"Oui, sauf si :
Image.align := alClient
et
Image.Strecht := true"

Entièrement d'accord avec toi, mais attention à bien faire la distinction entre l'image (TImage) et ce qu'elle contient(TPicture) :

Image.align := alClient étire l'image jusqu'à ce qu'elle remplisse complètement son parent, si Picture est plus petit ou égal, on le verra en entier, sinon on ne verra que la partie correspondant à la dimension de l'image.

Image.Stretch fait que picture sera étiré ou "rabougri" pour remplir entièrement l'image, quelle que soit la dimension de cette dernière.

Image.Autosize enserre Image autour de Picture.

Et "Image.align := alClient" est plus fort que "Image.Autosize" dans le cas où les deux propriétés s'affrontent, c'est à dire si Picture est plus petit que le parent de Image. J'ai pas encore vérifié pour le contraire (si picture est plus grand).

Ça me fait penser à papier-caillou-ciseaux cette histoire...

Bonne prog'
Commenter la réponse de japee
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 3 oct. 2007 à 11:10
0
Utile
Je viens de trouver un source de Mauricio sympha !



http://www.delphifr.com/codes/REDIMENSIONNER-BITMAP-AVEC-BONNE-QUALITE_26351.aspx




qui ne passe pas par Repaint. Mais c'est vrai qu'il ne redimensionne pas la fiche mais le Bitmap.
Jean_Jean
Commenter la réponse de cs_Jean_Jean
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 4 oct. 2007 à 15:11
0
Utile
@Cari ...
"T'es le seul à avoir deux avatars différents sur tes posts et sur ton profil... "

La magie des serveurs codes-sources et de leurs cache tout pourris ... un coups c'est l'un un coups c'est l'autre ... vas savoir ... c'est tellement marrant comme fonctionnalitée ... je me demande si c'est breveté par Microsoft ?
C'est un bug .... mais bon avec ce que je viens de dire ... qui sait ?

<hr size="2" width="100%" />
http://deefaze.gnomz.com
Commenter la réponse de f0xi

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.