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 :

Conversion mesures millimètres -> pixels


Sujet :

Composants VCL Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Conversion mesures millimètres -> pixels
    Bonjour,

    J'essaie de résoudre un problème de conversion en vain... Dans mon application l'utilisateur saisit la largeur et la hauteur d'un TPanel en millimètres ce qui permet de modifier ses dimensions.
    Il me faut donc convertir les dimensions saisies en pixels pour pouvoir affecter ces valeurs aux propriétés "Width" et "Height" du TPanel.

    Je m'y prends de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function MillimetresToPixelsY(HauteurMillimetres: Integer): Integer;
    var
      YPixelsParPouce: Integer;
      YPixelsParMilli: Integer;
    begin
      YPixelsParPouce := Screen.PixelsPerInch;
      YPixelsParMilli := Trunc(YPixelsParPouce / 25.4); // Conversion en millimètres
      Result := Trunc(HauteurMillimetres* YPixelsParMilli);
    end;
    La valeur renvoyée par Screen.PixelsPerInch est à priori incorrecte (96PPI) et ne correspond pas à la réalité (109PPI avec mon écran). J'ai également testé avec les fonctions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DC := GetWindowDc(0);
    YPixelsParPouce := GetDeviceCaps(DC, LOGPIXELSY);
    Mais j'obtiens le même résultat 96PPI. Avez-vous des conseils pour récupérer de la meilleure manière le nombre de pixels par pouce quelque soit l'écran utilisé ?

    Je vous remercie pour votre aide.
    Dernière modification par Invité ; 24/12/2020 à 11h54.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    96 DPI c'est la valeur par défaut

    Exemple un 17.3 pouces en diagonale soit H 8.5 x L 15.1 pour 1080 x 1920 soit 127 x 127
    Aucun Zoom et 96 aussi

    Ta question me fait penser au sujet Calcul de la résolution de l'écran sur Windows 10 qui avec les WMI permettra de récupérer les bonnes valeurs

    Pense que LOGPIXELSX et LOGPIXELSY retourne un "logical inch" qui fait toujours 96 pixels
    J'ai géré le Zoom de fenêtre avec ScaleBy mais pour me caler sur le Zoom de Windows, les valeurs suivantes ne changent jamais depuis Windows 6.1 au moins, 100% (96 DPI), 125% (120 DPI), and 150% (144 DPI).

    Voir la fonction GetDpiForWindow et tu as un tas de lecture Improving the high-DPI experience in GDI based Desktop Apps

    Je dois aussi bosser dessus pour gérer l'écran 4K d'un collègue qui a côté à un écran plus ancien ... et un Zoom à 150%, alors quand il passe une application d'un écran à l'autre, ça délire un peu le Scale

    Si MDT_EFFECTIVE_DPI dépend de la valeur en cours retourné par GetProcessDpiAwareness
    Il semble que MDT_RAW_DPI donne le chiffre prévu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      dpiX, dpiY: UINT;
    begin
      if Winapi.ShellScaling.GetDpiForMonitor(Self.Monitor.Handle, MDT_RAW_DPI, dpiX, dpiY) = S_OK then
        ShowMessage(dpiY.ToString() + ' x ' + dpiX.ToString());
    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
    Invité
    Invité(e)
    Par défaut
    Merci pour toutes ces informations, je vais prendre le temps de bien les assimiler, ça ne me parait pas évident.

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

Discussions similaires

  1. Conversion image vectorielle en pixels
    Par LinuxUser dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 06/02/2013, 17h29
  2. Réponses: 0
    Dernier message: 28/03/2012, 09h54
  3. [2D]Mesures OpenGL en pixels
    Par Daxter06 dans le forum OpenGL
    Réponses: 1
    Dernier message: 10/01/2010, 14h22
  4. conversion d'image jpeg en tableau de pixel
    Par sophie86 dans le forum Multimédia
    Réponses: 7
    Dernier message: 09/11/2005, 11h30
  5. Réponses: 6
    Dernier message: 06/10/2005, 16h02

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