Bild vergrößern klappt nicht richtig

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von vb-checker.

    Bild vergrößern klappt nicht richtig

    Ich versuche gerade ein Bild aus einer Datei zu lesen, zu vergrößern (ohne Antialiasing) und dann als Hintergrundbild in einem Panel darzustellen. Dabei scheint es aber Probleme beim vergrößern zu geben. Links und oben fehlt ein Teil des Bildes (4px) und rechts und unten ist ein Rand (Bild im Anhang. Der Schwarze Rand den ihr seht stammt vom Hintergrundbild der Form und sollte das Bild eigentlich umranden). Ich verstehe leider absolut nicht warum das passiert. Hier mal der Code den ich benutze um das Bild auf die angegebene Größe zu vergrößern:

    VB.NET-Quellcode

    1. Public Shared Function ResizeImage(ByVal image As Image, ByVal width As Integer, ByVal height As Integer) As Image
    2. Dim destbmp As New Bitmap(width, height)
    3. Dim destgraphics As Graphics = Graphics.FromImage(destbmp)
    4. ' Copy the source image into the destination bitmap.
    5. destgraphics.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor 'No Antialiasing
    6. destgraphics.DrawImage(image, New Rectangle(0, 0, width, height))
    7. destgraphics.Dispose()
    8. Return destbmp
    9. End Function

    Danach setze ich das erhaltene Image als BackgroundImage für das Panel.

    Ich hoffe mir kann jemand helfen.
    Bilder
    • bug!!!.png

      1,95 kB, 171×162, 994 mal angesehen
    Habe diesbezüglich mal etwas von einem Bug in der Drawing Klasse aufgeschnappt. Keine Ahnung, ob es das wirklich ist. Alternativ mal mit IntelliSense alle Eigenschaften des Graphics-Objekts anschauen, in denen Mode enthalten ist. Da gibt es ja noch in paar. Evtl ist da eine relevante dabei

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim BildName As String = "C:\Temp\Test.jpg"
    3. Dim GewuenschteBildHoehe As Double = 600.0
    4. Dim OriginalBild As System.Drawing.Image = New System.Drawing.Bitmap(BildName, True)
    5. Dim Faktor As Double = GewuenschteBildHoehe / CDbl(OriginalBild.Height)
    6. Dim Breite As Integer = Convert.ToInt32(Faktor * CDbl(OriginalBild.Width))
    7. Dim Angepasst As System.Drawing.Image = New System.Drawing.Bitmap(OriginalBild, Breite, Convert.ToInt32(GewuenschteBildHoehe))
    8. Angepasst.Save(BildName & ".bmp", System.Drawing.Imaging.ImageFormat.Bmp)
    9. End Sub
    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!
    Danke euch beiden schonmal für die Antwort.
    @RodFromGermany Den Code habe ich bei meiner Google suche schon gefunden, aber schon damals links liegen gelassen, weil er leider alles so "unscharf" macht (besonders wenn man von 16*16 auf 128*128 vergrößert :D). Ansonsten funktioniert er tadellos. Das ist das einzige Problem bei der Sache.
    Auch nicht mit einem Faktor 4?
    Ja, sieht blöd aus.
    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!
    Faktor 4 ==> 2 ^n.
    Probier es mal so:

    VB.NET-Quellcode

    1. destgraphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic '.NearestNeighbor 'No Antialiasing
    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 hab doch gesagt, du sollst dir alle Eigenschaften mit "Mode" anschauen. Dann hättest du den PixelOffsetMode gefunden.

    VB.NET-Quellcode

    1. e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor
    2. e.Graphics.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality


    Damit geht bei mir alles perfekt. Habe es so getestet:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim bmp As Bitmap
    3. Dim resizingFactor As Integer = 1
    4. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    5. bmp = New Bitmap("D:\Pictures\Unbenannt.png")
    6. End Sub
    7. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    8. If Integer.TryParse(TextBox1.Text, resizingFactor) = False Then resizingFactor = 1
    9. TextBox1.Text = resizingFactor.ToString
    10. Panel1.Refresh()
    11. End Sub
    12. Private Sub Panel1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
    13. If bmp IsNot Nothing Then
    14. e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor
    15. e.Graphics.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
    16. Dim targetRect As New Rectangle(5, 5, bmp.Width * resizingFactor, bmp.Height * resizingFactor)
    17. e.Graphics.DrawImage(bmp, New Rectangle(targetRect.Location, targetRect.Size))
    18. e.Graphics.DrawRectangle(Pens.Lime, targetRect)
    19. End If
    20. End Sub
    21. End Class

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vb-checker“ ()