12
votes

Spécification du DPI d'un contexte de périphérique GDI

J'ai une application qui génère des métafiles (EMFS). Il utilise le dispositif de référence (alias l'écran) pour rendre ces métafiles, de sorte que le DPI du métafichement change en fonction de la machine sur laquelle le code s'allume.

Disons que mon code a l'intention de créer un métafichier de 8,5 en X 11 po. Utilisation de mon poste de travail de développement comme référence, je me retrouve avec un EMF qui a

  • Un RCLRAME de {0, 0, 21590, 27940} (dimensions du métafichier, en millièmes de mm)
  • Un szclevice de {1440, 900} (dimensions du dispositif de référence, en pixels)
  • SZLMillimètres de {416, 260} (dimensions du dispositif de référence, en mm)

    D'accord, donc la RCLRAME me dit que la taille de l'EMF devrait être

    • 21590/2540 = 8.5 en large
    • 27940/2540 = 11 dans TALL

      Droit sur. En utilisant ces informations, nous pouvons également déterminer le DPI physique de mon moniteur, si mon calcul a raison:

      • (1440 * 25.4) / 416 = 87.9231 DPI horizontal
      • (900 * 25,4) / 260 = 87.9231 DPI vertical

        Le problème

        Tout ce qui lit ce métafile - une conversion EMF-TO-PDF, la page "Résumé" lorsque vous cliquez avec le bouton droit de la souris sur l'EMF dans l'Explorateur Windows, etc. semble tronquer la valeur DPI calculée, affichant 87 au lieu de 87.9231 (même 88 irait bien).

        Il en résulte une page physiquement dimensionnée comme 8,48 en x 10,98 en (87 dpi) au lieu de 8,5 x 11 dans x 11 dans (en utilisant 88 dpi) lorsque le métafichier est lu.

        • est-il possible de changer le DPI du périphérique de référence afin que les informations stockées dans le métafichement utilisées pour calculer le DPI sort à un bel entier?
        • Puis-je créer mon propre contexte de périphérique et spécifier son DPI? Ou dois-je vraiment utiliser une imprimante pour le faire?

          Merci pour toute idée.


2 commentaires

La taille de la page de résumé est-elle affichée correctement? Est-ce 748x968 ou 747x967?


Avoir les mathématiques aménagées, la façon dont vous avez fait dans cette question - est d'une valeur incommensurable pour moi


4 Réponses :


3
votes

Je suis curieux de savoir comment Windows connaît la taille physique de votre moniteur. Vous devez avoir changé une configuration quelque part? Peut-être que vous pouvez le changer à des valeurs plus pratiques qui divisent bien.

Comme impliqué par le nom, un "contexte de périphérique" doit être connecté à un périphérique système. Cependant, cela n'a pas besoin d'être un pilote matériel, il pourrait s'agir d'un émulateur de périphérique tel qu'un pilote d'impression d'écrivain PDF. J'ai vu au moins un qui vous permet de définir un DPI arbitraire.


2 commentaires

Windows ne connaît pas la taille physique du moniteur, bien que vous puissiez l'obtenir à partir d'EDID, voir Stackoverflow.com/questions/577736 . Je crois comprendre que si vous définissez le moniteur sur sa résolution natale, vous obtiendrez presque toujours (très proche de) 96 points par pouce, s'il s'agit d'un panneau plat.


Eh bien, c'est intéressant. Il semblerait indiquer que GDIPRECORDMETAFILESTREAM, que le constructeur de la classe de métafile de .NET met en place, incite. (Mon moniteur est à sa résolution natale - un Dell E198WFP - et j'ai éclaté un ruban à mesurer, et assurez-vous que ces dimensions mm sont correctes!)



16
votes

J'ai maintenant appris plus que je me suis soucié d'avoir connu des méafiles.

1. Certaines des surcharges du constructeur de la classe code> METAFILE CODE> fonctionnent mal et fonctionneront sur une valeur DPI tronquée. H3>

Considérez les éléments suivants: P>

metafileGraphics = Graphics.FromImage(this.currentMetafile);
metafileHeader = this.currentMetafile.GetMetafileHeader();
metafileGraphics.ScaleTransform(
    metafileHeader.DpiX / metafileGraphics.DpiX,
    metafileHeader.DpiY / metafileGraphics.DpiY);


1 commentaires

Sachez que vous pouvez modifier votre configuration de moniteur Windows afin que 96 DPI ne soit plus le DPI logique. Là encore, cela ne pourrait être un problème que sur XP, puisqu'ils ont changé de choses pour Vista. Là encore, utiliser GDI + change de choses plus. Découvrez msdn.microsoft.com/en-us/library /ms701681(vs.85).aspx



0
votes

Notez que je cours avec 120 dpi sur WXP tout le temps (de grandes polices) qui signifie métafilegraphics.dpix retourneront 120.

Le fichier EMF ne semble pas enregistrer ce que le DPI était du contexte de référence (120 dans ce cas, 96 pour la plupart des autres personnes).

Pour rendre les choses plus intéressantes, il est possible de créer un EMF via un dessin sur un bitmap de mémoire qui a eu une sertre () définie sur, dire, 300 dpi. Dans ce cas, je pense que le facteur d'échelle doit être 300 et non ce que le moniteur (86.x) ou Windows (120) pourrait utiliser.


0 commentaires

0
votes

semble que des valeurs sur la page de résumé sont erronées. Ils sont calculés comme: xxx

où les valeurs de précision sont calculées sans arrondissement ni troncature.


0 commentaires