2016-04-01 10 views
0

umformuliert Frage:GDI + Schriftgröße Unterschied unter verschiedenen Prozessen auf derselben Maschine

Wenn ich auf Bitmaps aus einem Unit-Test zeichne in Visual Studio, der Zoomfaktor ich auf meinem Desktop habe berücksichtigt, aber als ich renne von der Konsole aus nicht.

Was kann ich tun, damit Texte, die mit Graphics.DrawString gerendert werden, unabhängig von meinen Desktopeinstellungen konsistent sind?


Ich habe einige NUnit Tests, die Bitmaps mit GDI + erstellen und vergleicht diese Bilder zu den vorab gespeicherten, um sicherzustellen, dass das richtige Bild erzeugt wird.

Mein Problem ist, dass Texte (gerendert mit Graphics.DrawString) sind anders, wenn ich die Tests innerhalb von Visual Studio, im Vergleich zu dem, was generiert wird, wenn ich dann Tests in meinem Kommandozeilen-Build-Skript (mit dem NUnit 3.2 Test Läufer).

Hinweis: Es handelt sich nicht um geringfügige Ein-Pixel-Off- oder Textumbruchprobleme. Die Schriftgröße der Texte, die beim Ausführen von der Konsole wiedergegeben werden, ist wahrscheinlich kleiner.

Weiß jemand, warum die Schriftgröße wäre ein und dieselbe Maschine abhängig von der Ausführungsumgebung? Und genauso wichtig: Was kann ich dagegen tun?

+0

Können Sie verwandte Teile anzeigen (wo Sie 'Graphics' erhalten, wie Sie' DrawString' usw. verwenden)? – Sinatr

Antwort

1

Eine Konsole-Modus-App wird fast nie dpiAware deklariert. Das ist wichtig, wenn Sie Bitmaps erstellen. Ihre standardmäßige Eigenschaft Horizontal/VerticalResolution beträgt 96 Pixel pro Zoll, unabhängig davon, wo der Videoadapter ausgeführt wird. Die DPI-Virtualisierungsfunktion kümmert sich darum. Dies wirkt sich wiederum auf die Anzahl der für eine Schriftart verwendeten Pixel aus, da ihre Größe standardmäßig in Punkten angegeben wird. Ein Punkt ist 1/72 Zoll, wie viele Pixel Sie zeichnen müssen, sagen wir, eine 9-Punkt-Schriftart hängt vom Pixel-pro-Zoll-Verhältnis ab. Es wird 9/72 * 96 = 12 Pixel sein.

In einem Programm, das dpiAware ist, die beispielsweise auf einem 144-dpi-Videoadapter ausgeführt wird, ist derselbe Text 9/72 * 144 = 18 Pixel hoch. Dies führt zu der Schlussfolgerung, dass die App im Konsolenmodus den Text zu klein macht. Oder die dpiAware App macht sie zu groß, abhängig von Ihrer Sichtweise.

DPI-Awareness oder Virtualisierung ist allgemein wichtig, es verhindert, dass ein Programm unlesbaren Text auf einem hochauflösenden Monitor erstellt. Auf einem 4K-Monitor sieht dieser 12 Pixel hohe Text aber wie ein Staubfleck aus. Das gilt nicht genau in einer App im Konsolenmodus, die Bitmaps erstellt. Sie sollten jedoch überlegen, viel größere Bitmaps zu erstellen und daher auch größeren Text zu verwenden. Da, wenn Sie nicht diese kleinen Bitmaps nicht gut aussehen, wenn sie neu skaliert werden müssen, um den 4K-Monitor zu entsprechen. Besonders bemerkbar für Text, werden Anti-Aliasing-Pixel zu Blöcken, die nicht mehr anti-aliasing sind.

Wenn nicht, und Sie nur für Größen in Pixel interessiert sind, sollten Sie dieses Problem vermeiden, indem Sie einen der Font-Konstruktoren verwenden, die eine GraphicsUnit dauert. Sie würden GraphicsUnit.Pixel anstelle des Standards bevorzugen. Sie erhalten eine vorhersehbare Texthöhe in Pixeln unabhängig von der Videoadaptereinstellung, ein fester Anteil der gesamten Bitmap-Höhe.

+0

Ich erzählte meinen Colluges nach dem Posten meiner Frage; Hans Passant wird uns das in wenigen Minuten erklären - und Sie haben es getan! :-) #hero –

Verwandte Themen