Grafik verzerrt je nach Bildschirmauflösung

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    Grafik verzerrt je nach Bildschirmauflösung

    Hallo zusammen.
    Ich erstelle eine kleine Grafik in einer Picture Box:

    VB.NET-Quellcode

    1. Dim img As New Bitmap(100, 100)
    2. Dim e = Graphics.FromImage(img)
    3. e.FillEllipse(Brushes.YellowGreen, 5, 5, 90, 90)
    4. e.DrawEllipse(Pens.Black, 5, 5, 90, 90)
    5. e.DrawString("123", New Font("Arial", 32, FontStyle.Regular), Brushes.DarkViolet, 7, 27)
    6. Me.PictureBox1.Image = img
    7. Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage


    Auf meinem Rechner sieht alles gut aus.
    Jetzt muss das aber auf einem Rechner mit 4K Bildschirm laufen.. dort wird der Kreis zu klein, und der Text mindestens 3x zu gross dargestellt.
    Kann man das irgendwie fix übergeben, dass Text und Grafik nicht unterschiedlich angepasst werden ? Ich könnte es als bmp auf den Rechner speichern,
    und von dort wieder laden.. ist aber auch doof

    Danke für die Hilfe.
    Kimo
    @kimo Das dürfte an der DPI-Skalierung des Bildschirms liegen.
    Wenn Du die abfragst, kannst Du gegen-skalieren.
    dotnet-snippets.de/snippet/bil…skalierung-bestimmen/5950
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    kimo schrieb:

    VB.NET-Quellcode

    1. Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
    Sorry, das ist auch ein Fehler, gib der PictureBox mal SizeMode = .Zoom, da ist das Bild x-y-proportional voll in der PictureBox.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Zeichne doch direkt im PaintEvent der PictureBox und skalier dort codeseitig:

    Code

    VB.NET-Quellcode

    1. Private YellowGreenBrush As New SolidBrush(Color.YellowGreen)
    2. Private DarkVioletBrush As New SolidBrush(Color.DarkViolet)
    3. Private BlackPen As New Pen(Color.Black, 1)
    4. Private Rect As New Rectangle(5, 5, 90, 90)
    5. Private NewFont As New Font("Arial", 32, FontStyle.Regular)
    6. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    7. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    8. e.Graphics.FillPie(YellowGreenBrush, Rect, 0, 360)
    9. e.Graphics.DrawArc(BlackPen, Rect, 0, 360)
    10. e.Graphics.DrawString("123", NewFont, DarkVioletBrush, (Rect.Width - e.Graphics.MeasureString("123", NewFont).Width) / 2 + Rect.Left + 1, (Rect.Height - e.Graphics.MeasureString("123", NewFont).Height) / 2 + Rect.Top + 1)
    11. End Sub



    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Ich konnte bei mir keine Unterschiede auflösungsbedingt feststellen. Wie RfG (wohl) schon meinte: Was sagen die Anzeigeeinstellungen unter Windows bei den beiden Systemen?

    ##########

    Ich ziehe meine Frage zurück. Auch bei Änderung der Werte konnte ich keine Probleme/Unterschiede feststellen.
    Bilder
    • WindowsScreenSettings.jpg

      53,21 kB, 794×516, 74 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @VaporiZed Du musst neu starten, es genügt nicht, diesen Wert einfach nur umzustellen.
    Jou, dies ist der Wert, der Schrift größer werden lässt.
    @kimo Wenn Du einen Font erstellst, berücksichtige in dessen Größe den DPI-Wert.
    @All: Das ganze hat keinen Zweck, wenn Slider verwendet werden, deren Größe geht mit dem DPI-Wert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany: Hm, kann ich bei mir nicht bestätigen. Ok, ich hab kein 4K-Monitor. Aber selbst wenn ich auf 175%-Skalierung gehe und neu starte, sieht die Grafik wie erwartet aus.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Da hab ich den Text mit als Teil der Grafik gesehen. Sah alles wie erwartet aus. Alles gleichmäßig proportioniert. Skalierungs- und auflösungsunabhängig. Heute Abend schick ich mal ein paar Fotos (Screenshots würden wahrscheinlich nicht viel bringen)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Mein Chef hat meine für 100% gestylte GUI aufn 125% laufen lassen, das war die blanke Katastrophe. TableLayoutPanel, Slider & Co sind da leider unflexibel.
    Ich hab dann die Größe aller Fonts umgerechnet, aber es hat nix geholfen, er musste auf 100% umstellen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich bin ja noch Bilder schuldig.
    Bilder mit verschiedenen Modi

    Standard bei mir: 1920x1080


    nach Skalierung auf 175%, aber ohne Neustart von VS oder des PCs


    nach Neustart


    zurück auf 100%, ohne Neustart


    und mit 800x600


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Die Anzahl der Pixel macht es nicht, sondern die 100%, 125% usw. DPI.
    Ich hab in meinem Projekt eine Basisklasse, die den Default-Font bereitstellt, damit die GUI stets gleich aussieht:
    Spoiler anzeigen

    C#-Quellcode

    1. using System.Drawing;
    2. using System.Windows.Forms;
    3. namespace MyProject.Forms
    4. {
    5. /// <summary>
    6. /// Basisklasse zum Ignorieren der DPI-Settings des Betriebssystems
    7. /// </summary>
    8. [System.ComponentModel.DesignerCategory("Code")]
    9. public class FormBaseNoDpi : Form
    10. {
    11. /// <summary>
    12. /// Skalierungsfaktor, wird für separate Fonts in Dialogen benötigt
    13. /// </summary>
    14. protected float DpiFactor { get; protected set; }
    15. /// <summary>
    16. /// Spezieller Konstruktor
    17. /// </summary>
    18. public FormBaseNoDpi()
    19. {
    20. this.DpiFactor = 96f / this.CreateGraphics().DpiX;
    21. // Make the GUI ignore the DPI setting
    22. this.Font = new Font(this.Font.Name, 8.25f * this.DpiFactor, this.Font.Style, this.Font.Unit, this.Font.GdiCharSet, this.Font.GdiVerticalFont);
    23. }
    24. }
    25. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich verstehe nicht. Im hiesigen Thread ging es dem TE doch darum, dass er bei verschiedenen Auflösungen bzw. Skalierungen unterschiedliche Text-Aussehens-Ergebnisse bekommt. Das versuchte ich nachzustellen, konnte es aber nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Das war genau mein Problem, dass der Default-Font DPI-abhängig ist.
    Schreib mal Text in ein Label und paxk das neben ein fixes Bild in einer PictureBox.
    Teste das bei verschiedenen DPI-Werten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @VaporiZed: Ich vermute du kannst den Fehler nicht mehr nachstellen weil du eine neuere .NET Version im Einsatz hast. Das Problem bestand nur bis zur Version 4.7, danach wurde es gefixt.

    devblogs.microsoft.com/dotnet/…ng-the-net-framework-4-7/


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.