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

Contribuez Discussion :

Adapter le redimensionnement d'un champ image à l'image de fond


Sujet :

Contribuez

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut Adapter le redimensionnement d'un champ image à l'image de fond
    Bonjour,
    comme je n'ai pas réussi à trouver de fonction me permettant de redimensionner proprement un champ image avec une image de fond je vous propose ce petit bout de code qui permet d'éviter de s'arracher les cheveux avec le dRedimensionne (ou même sans). Au passage s'il est possible de faire ça juste avec une fonction de Windev je suis preneur.

    Si le champ dans lequel vous chargez votre image est trop petit, votre image sera tronquée . De plus la fonction dRedimensionne comporte des contraintes au niveau de la taille du champ, la taille de l'image chargée et la taille de redimensionnement (et aussi que c'est une fonction de dessin). Si votre image de fond est redimensionnée plus grande que votre champ, tronquage encore, et de plus vous redimensionnez le contenu de la largeur et de la hauteur du champ et non la largeur et la hauteur de l'image apparente. Il y a aussi les cas ou la largeur ou la hauteur du champ est plus grand et l'autre côté plus petit que le redimensionnement ...

    Cette fonction adapte d'abord la taille du champ à l'image chargée (qu'elle soit plus petite ou plus grande), pour ensuite redimensionner l'image ET le champ image.

    La procédure globale contient 2 paramètres et 3 paramètres optionnels :
    - sChamp_image est une chaîne : définit le champ image dans lequel on va travailler.

    - sChemin_image est une chaîne : chemin de l'image.

    Vous devez bien sur définir ces 2 paramètres mais j'ai mis un retour si au moins l'un des 2 est vide.

    - bRedim_image est un booléen = Vrai : par défaut est Vrai mais vous pouvez le passer à Faux si vous ne voulez QUE redimensionner le champ image en fonction de l'image de fond que vous chargez (donc sans passer par un dRedimensionne).

    - nNouvelle_largeur est un entier = {sChamp_image,indChamp}..Largeur et nNouvelle_hauteur est un entier = {sChamp_image,indChamp}..Hauteur) : les 2 variables pour redimensionner l'image et le champ image.

    Code : 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    PROCEDURE Redimensionne_image(sChamp_image est une chaîne, sChemin_image est une chaîne, bRedim_image est un booléen = Vrai, nNouvelle_largeur est un entier = {sChamp_image,indChamp}..Largeur, nNouvelle_hauteur est un entier = {sChamp_image,indChamp}..Hauteur)
     
    bRedim_hauteur est un booléen = Faux
    bRedim_largeur est un booléen = Faux
     
    SI PAS ChampExiste(sChamp_image) ALORS
    	Info("le champ image " + sChamp_image + " n'existe pas")
    	RETOUR
    FIN
     
    SI PAS fFichierExiste(sChemin_image) ALORS
    	Info("l' image " + sChemin_image + " n'existe pas")
    	RETOUR
    FIN
     
    InfoImage est une chaîne = InfoBitmap(sChemin_image)
    nLargeur est un entier = Val(ExtraitChaîne(InfoImage, 2))
    nHauteur est un entier = Val(ExtraitChaîne(InfoImage, 3))
     
    // On redimensionne le champ si l'image a une taille différente
    SI {sChamp_image,indChamp}..Largeur <> nLargeur ALORS
    	{sChamp_image,indChamp}..Largeur = nLargeur
    FIN
     
    SI {sChamp_image,indChamp}..Hauteur <> nHauteur ALORS
    	{sChamp_image,indChamp}..Hauteur = nHauteur
    FIN
     
    {sChamp_image,indChamp} = sChemin_image
     
    SI bRedim_image ALORS
    	// On commence par redimensionner le champ si il est plus petit que la nouvelle taille
    	SI {sChamp_image,indChamp}..Largeur < nNouvelle_largeur ALORS
    		{sChamp_image,indChamp}..Largeur = nNouvelle_largeur
    		bRedim_largeur = Vrai
    	FIN
     
    	SI {sChamp_image,indChamp}..Hauteur < nNouvelle_hauteur ALORS
    		{sChamp_image,indChamp}..Hauteur = nNouvelle_hauteur
    		bRedim_hauteur = Vrai
    	FIN
     
    	// On va redimensionner l'image de fond
    	// Si un seul des côtés est plus petit on teste si l'autre côté du champ est plus grand
    	// que l'image de fond
    	SI bRedim_largeur ET bRedim_hauteur ALORS
    		dRedimensionne({sChamp_image,indChamp}..Nom,nNouvelle_largeur * nNouvelle_largeur / nLargeur, nNouvelle_hauteur * nNouvelle_hauteur / nHauteur)
    	SINON	
    		SI bRedim_largeur ALORS
    			SI {sChamp_image,indChamp}..Hauteur > nNouvelle_hauteur ALORS
    				dRedimensionne({sChamp_image,indChamp}..Nom, nNouvelle_largeur * nNouvelle_largeur / nLargeur, nNouvelle_hauteur)
    				{sChamp_image,indChamp}..Hauteur = nNouvelle_hauteur
    			SINON
    				dRedimensionne({sChamp_image,indChamp}..Nom, nNouvelle_largeur * nNouvelle_largeur / nLargeur, {sChamp_image,indChamp}..Hauteur)
    			FIN
    		FIN
     
    		SI bRedim_hauteur ALORS
    			SI {sChamp_image,indChamp}..Largeur > nNouvelle_largeur ALORS
    				dRedimensionne({sChamp_image,indChamp}..Nom, nNouvelle_largeur, nNouvelle_hauteur * nNouvelle_hauteur / nHauteur)
    				{sChamp_image,indChamp}..Largeur = nNouvelle_largeur
    			SINON
    				dRedimensionne({sChamp_image,indChamp}..Nom, {sChamp_image,indChamp}..Largeur / nLargeur, nNouvelle_hauteur * nNouvelle_hauteur / nHauteur)
    			FIN
    		FIN
    	FIN		
     
    	// dernier cas : la largeur et la hauteur du champ sont plus grand que la largeur et la hauteur du redimensionnement
    	SI PAS bRedim_largeur ET PAS bRedim_hauteur ALORS
    		dRedimensionne({sChamp_image,indChamp}..Nom,nNouvelle_largeur,nNouvelle_hauteur)
    		{sChamp_image,indChamp}..Largeur = nNouvelle_largeur
    		{sChamp_image,indChamp}..Hauteur = nNouvelle_hauteur
    	FIN
    FIN
    Je m'en sers surtout pour les champs images temporaires en dehors des fenêtres pour charger des images avec des tailles différentes pour ensuite les redimensionner et les copier dans un champ image de ma fenêtre.
    Mieux vaut un petit lien qu'un long discours.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour sphynxounet,

    Merci de nous livrer ton code, c'est toujours très instructif.

    Citation Envoyé par sphynxounet Voir le message
    comme je n'ai pas réussi à trouver de fonction me permettant de redimensionner proprement un champ image avec une image de fond je vous propose ce petit bout de code qui permet d'éviter de s'arracher les cheveux avec le dRedimensionne (ou même sans). Au passage s'il est possible de faire ça juste avec une fonction de Windev je suis preneur.
    En lisant ta procédure Redimensionne_image, je me demandais si tu avais tenté d'utiliser la propriété ..ImageMode du champ image, notamment le mode "homothétique" qui permet de redimensionner l'image affichée dans le champ image, en préservant ses prorportions.


    Et puis j'ai une remarque constructive pour alléger ton code.
    Ta fonction pourrais recevoir en paramètre le champ image, au lieu de son nom.
    Ainsi, les indirections sont inutiles.

    Code WLangage : 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
     
    PROCEDURE Redimensionne_image(champ_image, sChemin_image est une chaîne, bRedim_image est un booléen = Vrai, nNouvelle_largeur est un entier = champ_image..Largeur, nNouvelle_hauteur est un entier = champ_image..Hauteur)
     
    	[...]
     
    // On redimensionne le champ si l'image a une taille différente
    SI champ_image..Largeur <> nLargeur ALORS
    	champ_image..Largeur = nLargeur
    FIN
     
    	[...]
     
    champ_image = sChemin_image
     
    	[...]
     
    dRedimensionne(champ_image..Nom,nNouvelle_largeur * nNouvelle_largeur / nLargeur, nNouvelle_hauteur * nNouvelle_hauteur / nHauteur)

    A bientôt, pour une nouvelle contribution !


  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Rooooo le pourtant je les ai lu en long en large et en travers les propriétés des champs images ...

    Bon au moins ce qui me console c'est que mon bout de code peut redimensionner un champ image pour éviter de déformer l'image chargée ...

    Promis la prochaine fois je te demande avant de réinventer la roue.
    Mieux vaut un petit lien qu'un long discours.

Discussions similaires

  1. Redimensionnement fenêtre en fonction d'une image
    Par skyjoe dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 17/12/2006, 13h54
  2. 1 image + 1 image = 1 image
    Par dleu dans le forum Delphi
    Réponses: 2
    Dernier message: 24/05/2006, 20h15
  3. Réponses: 2
    Dernier message: 03/11/2005, 20h26
  4. Champ de type "Image" dans SQL Server
    Par Edouard Kaiser dans le forum ASP
    Réponses: 5
    Dernier message: 09/09/2005, 07h43
  5. Champ BLOB pour IMAGE format JPG and TImage et Interbase
    Par alain_bastien dans le forum InterBase
    Réponses: 1
    Dernier message: 20/10/2004, 16h15

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