IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Adapter la taille d'une image à une fiche (ou l'inverse)


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut Adapter la taille d'une image à une fiche (ou l'inverse)
    Bonjour à tous

    J'ai un TImage dans une form. Je ne sais plus comment faire pour régler la taille de l'image sur la form, ou l'inverse, de telle sorte que l'image remplisse la Form l'affichant. Sans cacher ce qu'il ne faut pas cacher (bouton RETOUR) par exemple.



    Dans le fichier DFM, j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      object Img_Photo_Form: TImage
        Left = 0
        Top = 0
        Width = 639
        Height = 392
        Align = alLeft
        ExplicitHeight = 389
    Que faire ? Redimensionner la Form en fonction de la taille de l'image, sans doute ? Cette form doit afficher des images de tailles différentes, donc parfaitement aléatoires. Que dois-je calculer ?

    Merci :hello:

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 450
    Points : 24 858
    Points
    24 858
    Par défaut
    TImage.Strech ?
    Pour adapter la forme, TForm.AutoSize ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Bonjour

    Je vérifie ça (autoSize de la form), et je donne le retour. Non, je n'avais pas spécifié Stretch

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Comme le dit ShaiLeTroll en mettant la propriété du TImage Strech à true mais également Align à alClient en laissant AutoSize à false.
    Ton bouton Retour est il dans un TPanel ? Sinon, il faut placer un TPanel avec Align à AlBottom puis mettre le bouton Retour dans le panel.

    Concernant le Stretch, cela permet d'étirer l'image dans toute la zone du TImage. Cependant, cela fait perdre les proportions largeur/hauteur de l'image et la manière de réaliser le "stretch" n'offre pas le meilleur aspect. Si tu utilises la VCL (je connais mieux que Firemonkey), je te conseillerai de charger ton image dans un TBitmap, de déterminer la meilleure orientation de l'image par rapport à la taille de la zone du TImage (=> si la largeur de l'image est > à la hauteur de l'image, alors il faudra afficher l'image en la retaillant pour que sa largeur corresponde à la largeur du TImage et calculer sa hauteur pour qu'elle reste proportionnelle à la nouvelle largeur. Si la hauteur de l'image est > à la largeur de l'image, il faudra afficher l'image en la retaillant pour que sa hauteur corresponde à la hauteur du TImage et calculer sa largeur pour qu'elle reste proportionnelle à la nouvelle hauteur).

    De plus, pour améliorer le stretch, je te conseille d'utiliser les méthodes SetStretchBltMode puis StretchBlt fournies dans Windows.pas. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SetStretchBltMode(image1.Canvas.Handle, HALFTONE);
    StretchBlt(image1.Canvas.Handle, OrgX, OrgY, SizeX, SizeY, BMP.Canvas.Handle, 0, 0, BMP.Width, BMP.Height, srcCOPY);
    où image1 est le TImage, BMP le TBitmap et les variables OrgX, OrgY, SizeX et SizeY sont les tailles calculées de l'image.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Ah et j'ai oublié, voici un site (un peu vieillot) que j'avais trouvé très intéressant sur le traitement d'image avec des exemples et sources pour Delphi : http://www.efg2.com/Lab/index.html
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Merci à vous :hello:

    Ca marche.

    @gbegreg : très bien, ce site. Et je vais mettre aussi l'alignement de l'image à alClient.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Moi j'ai utilisé ce bout de code en objective-C

    On passe en paramètre une image (UIImage c'est un TImage), la largeur et la hauteur maximale (max_picture_width et max_picture_height)

    Et dans le code, il y a un redimensionnement à 80% par rapport à la taille max pour faire des marges


    Code c : 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
    + (void) resize_picture:(UIImage*) picture save_in:(UIImage**) resized_picture with_width:(float) max_picture_width and_height:(float) max_picture_height {
    	if (picture == nil) { return; }
     
    	RELEASE( (*resized_picture) );
     
    	float new_width = 0.0f, new_height = 0.0f;
    	float width  = (picture.size.width  * picture.scale);
    	float height = (picture.size.height * picture.scale);
     
    	float h_scale = 0.0f, w_scale = 0.0f;
     
    	float max_width  = (float) (max_picture_width  * 0.8f);
    	float max_height = (float) (max_picture_height * 0.8f);
     
    	if ((width < max_width) && (height < max_height)) {
    //		(*resized_picture) = [[UIImage alloc] initWithCGImage:picture.CGImage];
     
    		if (width > height) {
    			new_width = max_width;
    			h_scale = (new_width / width);
    			new_height = (height * h_scale);
    		} else {
    			new_height = max_height;
    			w_scale = (new_height / height);
    			new_width = (width * w_scale);
    		}
    	} else {
    		w_scale = (float) (max_width  / width);
    		h_scale = (float) (max_height / height);
     
    		if (h_scale < w_scale) {
    			new_width  = (h_scale * width);
    			new_height = (h_scale * height);
    		} else {
    			new_width  = (w_scale * width);
    			new_height = (w_scale * height);
    		}
    	}
     
    	DLOG( (@"Utils::resize_picture - From (%f, %f) to (%f, %f) [%f]", width, height, new_width, new_height, picture.scale) )
     
    	NSAutoreleasePool* imagePool = [[NSAutoreleasePool alloc] init];
     
    	CGRect resizedRect = CGRectIntegral( CGRectMake(0, 0, new_width, new_height) );
    	CGImageRef imageRef = picture.CGImage;
    //	CGContextRef bitmap = CGBitmapContextCreate(nil, new_width, new_height, CGImageGetBitsPerComponent(imageRef),
    //												0, CGImageGetColorSpace(imageRef), CGImageGetBitmapInfo(imageRef));
    	CGContextRef bitmap = CGBitmapContextCreate(nil, new_width, new_height, 8, 0, CGImageGetColorSpace(imageRef), kCGImageAlphaPremultipliedLast);
     
    	CGContextSetInterpolationQuality(bitmap, kCGInterpolationHigh);
    	CGContextDrawImage(bitmap, resizedRect, imageRef);
    	CGImageRef resizedImageRef = CGBitmapContextCreateImage(bitmap);
     
    	(*resized_picture) = [[UIImage alloc] initWithCGImage:resizedImageRef];
     
    	/* Clean up */
    	CGContextRelease(bitmap);
    	CGImageRelease(resizedImageRef);
     
    	[imagePool release];
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/09/2008, 20h46
  2. Réponses: 6
    Dernier message: 03/11/2007, 23h03
  3. [MySQL] associer une image à une fiche
    Par gmorin dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/05/2007, 13h24
  4. Réponses: 2
    Dernier message: 20/10/2006, 19h28
  5. [ImageMagick] Taille en octet d'une image
    Par Oberown dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/08/2006, 09h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo