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

Langage Delphi Discussion :

Erreur de conversion pixels vers système métrique.


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut Erreur de conversion pixels vers système métrique.
    Bonjour,

    Pour calculer l'échelle d'une image, j'utilise la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function TMapForm.PixInM(const PixDistX, PixDistY:Integer) : TPixDistXY; // PixDistX est une mesure en pixels.
    begin
      Result.X := 25.4 / Screen.PixelsPerInch * PixDistX;  //  Résultat en mètre
      Result.Y := 25.4 / Screen.PixelsPerInch * PixDistY;  //  Résultat en mètre
    end;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function TMapForm.PixInM(const PixDistX, PixDistY:Integer) : TPixDistXY; // PixDistX est une mesure en pixels.
    var
      Dc : HDC;
    begin
      DC := GetWindowDc(0); // Capte le contexte graphique de l'écran
      Result.X := PixDistX * GetDeviceCaps(DC,HORZSIZE) / Screen.Width;
      Result.Y := PixDistY * GetDeviceCaps(DC,VERTSIZE)  / Screen.Height;
    end;
    Quand je mesure sur l'écran je constate plus de 3 cm d'erreur.

    Quelqu'un saurait-il comment pallier cette imprécision ?

    Merci d'avance

  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
    Utilise Convert au lieu de 25.4 ... même si c'est la même chose et ta division n'est pas à l'envers ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uses StdConvs, ConvUtils; 
    ...
      Result.X := Convert(NombreDePixel / Screen.PixelsPerInch, duInches, duMeters);
    Ensuite, ben à l'écran, c'est pas évident ...
    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 éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Ensuite, ben à l'écran, c'est pas évident ...
    OK, 3mm de différence, je comprendrais, mais 3,3 cm, (33 mm) ...

  4. #4
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    salut,

    Tout dépend de la résolution de ton écran et de la taille de sa dalle.

  5. #5
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Mon écran est un 17" en résolution 1280 * 1024
    Ce qui me sidère, c'est que mon application utilise un activex (MapWinGis.Ocx) qui convertit des coordonnées écran en coordonnées réelles sans le moindre problème.

  6. #6
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    C'est un tube ou un TFT? Le format est 4/3, 16/9, 16/10?

  7. #7
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    C'est un Lcd et le rapport Largeur/Hauteur = 1.25

  8. #8
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    D'après les informations que tu me donnes et d'après mes calculs, la largeur utile de ton écran devrait être de 33.7 cm. Regarde si c'est bien le cas.

  9. #9
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    il fait 36 cm / 28,8.
    C'est un NEC LCD 1860NX 18''

  10. #10
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    J'ai fait une recherche sur le Net et j'ai constaté que la fonction GetDeviceCaps(DC,HORZSIZE) est connue pour ne pas être fiable.

    Je l'ai testée sur un écran Lcd, sur un Crt et sur un portable.
    L'erreur est considérable.

    Quelqu'un connaitrait-il une fonction qui donne les dimensions de l'écran ou permet de "mesurer" des dimensions sur écran.

    Merci d'avance.

  11. #11
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Citation Envoyé par defluc Voir le message
    Mon écran est un 17" en résolution 1280 * 1024
    Citation Envoyé par defluc Voir le message
    il fait 36 cm / 28,8.
    C'est un NEC LCD 1860NX 18''
    Quelque chose me dit qu'il s’est agrandi pendant que tu dormais.
    Parce que là ça change tout.

    La définition de cet écran est de 90 PPP alors que le standard est de 96 PPP.
    C'est pour ça que tu as des erreurs.

    Tu peux éventuellement refaire tes calculs en sachant que pour cet écran un pixel occupe 0.281 mm d'espace, ou en remplaçant «Screen.PixelsPerInch» par 90.

  12. #12
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Le problème, c'est que je veux que mon programme soit valable pour tout écran.

  13. #13
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Ce n’est pas un problème. Avec l'interface device management de Windows, tu identifies l'écran qui est en cours d'utilisation, ensuite tu peux récupérer ses spécifications et plus précisément ses dimensions depuis son descripteur vesa edid. Une fois ces dernières informations obtenues, il ne te restera plus qu'à calculer sa définition et le tour est joué.

  14. #14
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    tu peux récupérer ses spécifications et plus précisément ses dimensions depuis son descripteur vesa edid
    .

    Après recherche, il m'apparait que ce composant est loin d'être gratuit.

    Aurais-tu un tuyau ?

  15. #15
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Ce n'est pas un composant, EDID (Extended Display Identification Data) est une structure de donnée normalisée (depuis 1990 il me semble) par VESA (Video Electronics Standards Association). Dans la pratique, les constructeurs enregistrent les spécifications de leurs écrans dans le firmware de ces derniers. Grâce à l'association du pilote et de l'interface Plug-And-Play, Windows peut lire cette structure et l'importer dans la base de registre au moment de l'installation de l'écran. Et donc avec certaines fonctions de l'Api Device Management (setupapi.lib) de Windows, tu accèdes à ces informations.

  16. #16
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Pourrais-tu me donner plus d'explications pratiques.

    Où trouver SetupApi.Lib ? (Je ne le trouve pas sur mon Pc)
    Comment utiliser ce fichier dans Delphi ? (Créer un composant ?)

  17. #17
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Mon langage de prédilection c'est le C++, pas le Delphi alias Pascal Objet.

    Cela dit pour inclure la librairie dans ton unité, c'est très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uses
    Windows,SetupAPI;
    exemple pour une Unit1:

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,Forms,
      Dialogs, StdCtrls, SetupAPI;
     
    const
      GUID_CLASS_MONITOR: TGUID = '{4D36E96E-E325-11CE-BFC1-08002BE10318}';
     
    type
      TForm1 = class(TForm)
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    function GetMonitorInfo: boolean;
    var
      hdi:  HDEVINFO;
    begin
      hdi := SetupDiGetClassDevs(@GUID_CLASS_MONITOR, nil, 0, DIGCF_PRESENT);
     
      if cardinal(hdi) = INVALID_HANDLE_VALUE then
      begin
        Result := False;
        { HANDLE non trouvée et fin des opérations }
      end
      else
      begin
        { HANDLE valide, et possibilité d'utiliser encore d'autres fonctions
          de l'Api Device Management tel que SetupDiEnumDeviceInfo, 
          SetupDiGetDeviceRegistryProperty, etc pour récupérer les informations 
          sur le moniteur }
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      GetMonitorInfo;
    end;
     
    end.
    Voilà, j'espère que cela t'aidera à y voir plus claire.
    Pour les fonctions de l'Api Device Management de Windows, elles sont documentées dans MSDN et dans l'aide en ligne de Delphi pour les versions 2006 et suivantes il me semble.

  18. #18
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Serais-ce abuser de tes compétences - qui me semblent étendues vu le peu de sujets à ce propos sur le net - de te demander comment récupérer la largeur et la hauteur du moniteur (ou simplement la diagonale) ?

  19. #19
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    Pour le code fort intéressant ci-dessus, il se compile et se lance ; mais plante sous Vista

    Suis-je le seul en ce cas ?

    @+

  20. #20
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Après Xp, je viens d'essayer sur mon portable sous Vista Pro et pas de problème.
    Et pourtant, le programme est compilé avec l'antédiluvien Delphi 4.

Discussions similaires

  1. Erreur de conversion de type, varchar vers datetime
    Par Marc_3 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/06/2012, 21h46
  2. Réponses: 1
    Dernier message: 18/08/2010, 11h55
  3. Message d'erreur à la conversion .xls vers .pdf
    Par samson_02 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/02/2009, 15h02
  4. Erreur de dépassement: conversion XML vers NTEXT
    Par carjo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/03/2008, 22h05
  5. Réponses: 5
    Dernier message: 20/06/2007, 13h49

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