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

 Delphi Discussion :

Calculer le ratio d'une image


Sujet :

Delphi

  1. #1
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 303
    Points : 269
    Points
    269
    Par défaut Calculer le ratio d'une image
    Bonjour à tous,

    Je suis à la recherche d'une méthode pour calculer le ratio d'une image en fonction de sa taille.

    J'ai une TScrollBox avec un l'intérieur une TImage, j'aimerais adapter mon image par rapport à la largeur (Width) de ma TScrollBox.

    Mon image (TImage) est définie par la propriété Stretch = True

    Exemple :
    Si je charge une image de taille (Width 1000 px X Height 500 px), si je redéfini l'image (TImage) a la largeur de ma TScrollBox (Width) 500 px, de combien serait la hauteur (Height) de l'image (TImage) pour gardé la proportion de l'image ?

    Cela doit forcément se calculer.

    Il n’y a pas des fonctions déjà existent sous embarcadero pour calculer les proportions d'une image ? Graphics32, Vcl.Graphics, Vcl.Imaging

    Merci beaucoup
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 410
    Points : 307
    Points
    307
    Par défaut
    Ce n'est qu'un calcul de proportions.
    Soit Li largeur initiale de l'image, Hi hauteur initiale tu peux calculer k=Hi/Li par exemple.
    Ensuite si Lsb est la largeur de ta scrollbox et la hauteur Hsb de ton image sont telles que Hsb/Lsb= k pour conserver les proportions.
    Donc Hsb=k*Lsb.

    Graphic32 à des méthodes permettant de faire cela sans calcul.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut
    C'est juste une règle de trois



    Si je charge une image de taille (Width 1000 px X Height 500 px), si je redéfini l'image (TImage) a la largeur de ma TScrollBox (Width) 500 px, de combien serait la hauteur (Height) de l'image (TImage) pour gardé la proportion de l'image ?
    W1 = 1000
    H1 = 500
    W2 = 500
    H2 = H1 / W1 * W2 (Trunc) -> 250
    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

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 473
    Points : 3 097
    Points
    3 097
    Par défaut
    Selon le rapport hauteur/Largeur, il faut adapter l'une ou l'autre dimension.
    Quelqu'un avait mis le code suivant ici et je l'avais conservé.
    Merci à lui s'il se reconnait !

    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
    uses System.Types, System.Math;
     
    function RectBestFit(Src: TGraphic; const ADestRect: TRect): TRect;
    var
      DstWidth, DstHeight: integer;
      NewWidth, NewHeight: integer;
      Scale              : Single;
    begin
      DstWidth  := ADestRect.Right - ADestRect.Left;
      DstHeight := ADestRect.Bottom - ADestRect.Top;
      Scale     := min(DstWidth / Src.Width, DstHeight / Src.Height);
      if Scale < 1 then
      begin
        NewWidth  := Trunc(Src.Width * Scale);
        NewHeight := Trunc(Src.Height * Scale);
      end else
      begin
        NewWidth  := Src.Width;
        NewHeight := Src.Height;
      end;
     
      Result := Bounds((DstWidth - NewWidth) div 2,
        (DstHeight - NewHeight) div 2,
        NewWidth,
        NewHeight);
     
      OffsetRect(Result, ADestRect.Left, ADestRect.Top);
    end;
    J-L aka Papy pour les amis

  5. #5
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 303
    Points : 269
    Points
    269
    Par défaut
    Merci pour votre aide.

    Voici ce que j'ai réalisé :

    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
    { AutoResize }
    procedure TFImEdit.AutoResize(Frame: TscPanel);
    var
      X, Y: Integer;
      Ratio: Variant;
    begin
      X := Frame.Width;
      Y := Frame.Height;
      Ratio := X / Y;
     
      if (Frame.Width > ScrollBox.Width) then
      begin
        Frame.Width := ScrollBox.Width - (Ratio) - (Frame.Left * 2);
        Frame.Height := ScrollBox.Width / Ratio;
      end;
     
      if (Frame.Height > ScrollBox.Height) then
      begin
        Frame.Width := ScrollBox.Height / Ratio;
        Frame.Height := ScrollBox.Height - (Ratio) - (Frame.Top * 2);
      end;
    end;
    Taille d'origine :
    Nom : Capture1.PNG
Affichages : 99
Taille : 1,48 Mo

    En passent par ma procédure AutoResize
    Nom : Capture0.PNG
Affichages : 97
Taille : 1,59 Mo
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  6. #6
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 303
    Points : 269
    Points
    269
    Par défaut Correction Ratio
    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
    { AutoResize }
    procedure TFImEdit.AutoResize(Frame: TscPanel);
    var
      X, Y: Integer;
      Ratio: Variant;
    begin
      X := Frame.Width;
      Y := Frame.Height;
     
      // Si la taille de l'image excède la largeur de la TScrollBox
      if (Frame.Width > ScrollBox.Width) then
      begin
        Ratio := X / Y;
        Frame.Width := (ScrollBox.Width - Ratio) - (Frame.Left * 2);
        Frame.Height := ScrollBox.Width / Ratio;
      end;
     
      // Si la taille de l'image excède la hauteur de la TScrollBox
      if (Frame.Height > ScrollBox.Height) then
      begin
        Ratio := Y / X;
        Frame.Width := ScrollBox.Height / Ratio;
        Frame.Height := (ScrollBox.Height - Ratio) - (Frame.Top * 2);
      end;
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 871
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 871
    Points : 15 287
    Points
    15 287
    Par défaut
    Citation Envoyé par XeGregory Voir le message
    Mon image (TImage) est définie par la propriété Stretch = True
    Et tu passes aussi Proportional à True.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. Calculer l'entropie d'une image
    Par ArthurC dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 03/05/2009, 19h53
  2. [ImageMagick] Ratio d'une image
    Par UN|X` dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 03/07/2007, 13h10
  3. Calcul du squelette d'une image en c++
    Par kruskal21 dans le forum Traitement d'images
    Réponses: 8
    Dernier message: 04/06/2007, 15h03
  4. Calculer la taille d'une image
    Par bigourson dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/09/2005, 11h22

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