Bild beim Zeichnen mit GDI+ verschwommen (vergrößert, ohne dass eine Vergrößerung angegeben ist)

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets3646.

    Bild beim Zeichnen mit GDI+ verschwommen (vergrößert, ohne dass eine Vergrößerung angegeben ist)

    Hey Leute,
    heute habe ich während der Programmierung eines kleinen Spieles mit GDI+ feststellen müssen, dass es alle Bilder, welche ich versuche, zu zeichnen, vergrößert darstellt, obwohl ich das nirgendwo angegeben habe. Auch in einem Testprojekt zeigt sich das gleiche Verhalten.
    Der Code, mit welchem ich die Bilder zeichne, ist folgender:

    C#-Quellcode

    1. private void Form1_Paint(object sender, PaintEventArgs e)
    2. {
    3. e.Graphics.DrawImageUnscaled(Properties.Resources.test, new Point(50, 150));
    4. }

    Im Anhang findet ihr ein Screenshot davon, wie es bei mir aussieht und das Bild, welches ich zum Testen verwendet habe.
    Ich hoffe, dass ihr mir helfen könnt,
    MfG Stefan :) .
    Bilder
    • test.png

      914 Byte, 56×48, 260 mal angesehen
    • Testform.png

      6,2 kB, 338×338, 109 mal angesehen
    Das kommt von den DPI-Einstellungen im Bild. Bilder sind (zusammen mit Fonts) das einzige, was GDI anhand der DPI skaliert. Unter Windows sinds für gewöhnlich 96DPI, Bilder haben aber meist 72DPI, deswegen erscheinen die dann etwas vergrößert.
    Interessant, so funktionierts. Ich hab den Code so abgeändert, falls es jemanden interessiert:

    C#-Quellcode

    1. private void Form1_Paint(object sender, PaintEventArgs e)
    2. {
    3. e.Graphics.DrawImageUnscaledAndClipped(Properties.Resources.test, new Rectangle(new Point(50, 150), Properties.Resources.test.Size));
    4. }

    Weißt du zufällig auch, woran es gelegen haben könnte? (hat sich erledigt, hatte Artentus seine Antwort net gesehen)

    //EDIT:
    Mir ist grad noch eingefallen, wie man das etwas vereinfachen könnte (dank Artentus seiner Erklärung). Die Zeile mit SetResolution muss man einmal nach der Deklarierung des Bildes aufrufen, dann gehts (geht aber nur, wenn das Bild vom Typ Bitmap ist):

    C#-Quellcode

    1. var Image = Properties.Resources.test;
    2. Image.SetResolution(e.Graphics.DpiX, e.Graphics.DpiY);
    3. e.Graphics.DrawImageUnscaled(Image, new Point(50, 50));

    Vielleicht hilft das ja noch jemandem :) .

    //EDIT 2:
    Hier noch die Lösung als Extension für das Graphis-Objekt:

    C#-Quellcode

    1. public static void DrawImageUnscaledDpiProof(this Graphics g, Bitmap bmp, Point location)
    2. {
    3. var Image = (Bitmap)bmp.Clone();
    4. Image.SetResolution(g.DpiX, g.DpiY);
    5. g.DrawImageUnscaled(Image, location);
    6. }

    Aufruf genauso wie die normale Graphics.DrawImageUnscaled()-Methode.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „nafets3646“ ()

    Ich mache zwar nie etwas mit GDI, jedoch täuscht mich das oder hast du vergessen das Bitmap Objekt freizugeben? Ich habs jetzt nicht nachgelesen aber bei Clone wird ja höchst wahrscheinlich alles von der Bitmap geklont. Somit müsstest das in der Extension wieder freigeben? Oder weshalb nicht?


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.