GDI und Bilder

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Gather.

    GDI und Bilder

    Hallo liebe Community,
    ich stehe vor ein paar konkreten Fragen zu GDI und Bildern:

    Zum Beispiel:
    Wie ist es mir möglich ein Bild in einem Rechteck zu zeichnen?
    Vom Prinzip her dachte ich mir mit einem GraphicsPath und einem Texturebrush, was ansich ja funktioniert.

    VB.NET-Quellcode

    1. Dim g as Graphics = e.Graphics()
    2. Dim TexBrush As New TextureBrush(New Bitmap("C:\a.jpg"))
    3. g.FillPath(TexBrush, GraPath)


    Dennoch würde ich gerne "Tricks" wie bei der Picturebox ebenfalls anwenden, wie: Stretch, Zoom, Tile, Normal oder Center.
    Wie genau wende ich diese Tricks an, (sodass diese nicht ein bestimmtes Rechteck überschreiten)


    Danke im Vorraus.

    Edit by der_Kurt:
    Für's Manipulieren von Grafiken gibt es ein eigenes Unterforum
    * Topic verschoben *

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

    Korrekt, erstell dir ein Rectangle und eine Bitmap, in der das Bild gespeichert wird. Die Parameter vom DrawImage kümmern sich um den Rest.

    Beispiel:

    VB.NET-Quellcode

    1. Dim bmp As New Bitmap(Pfad)
    2. Dim rect As New Rectangle(0, 0, 100, 100)
    3. With e.Graphics
    4. .DrawImage(bmp, rect)
    5. End With


    Geht natürlich auch mit nem Image. Das Äquivalent wäre dann halt: Dim img As New Image = Image.FromFile(Pfad)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Und wie wende ich nun "Tricks" wie Stretch oder Zoom an?
    Benötige ich dazu die Image-Attribute?

    Edit://
    Ich sehe gerade das "Strech" automatisch angewendet wird.
    Ich habe bemerkt das Stretch automatisch aktiv ist. Nun benötige ich Zoom / Normal / Center / Tile.
    Habt ihr hier ebenfalls herangehensweisen?
    Du kannst das Zielrechteck beliebig wählen, das Bild wird dann da eingepasst. Angenommen du hast ein 100x100-Bild un zeichnest das in ein 200x100-Rechteck, dann wird es um den Faktor 2 in der Breite gestreckt.

    Edit:
    Hier, hab gerade noch nen Uraltcode von mir gefunden (stammt noch aus meinen VB-Zeiten). Ist zwar in Direct2D, sollte aber fast 1zu1 übertagbar sein (bis auf die Opacity, das kannst du aber einfach weglassen).
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function Scale(ByVal BildBreite As Integer, ByVal BildHöhe As Integer, ByVal FensterBreite As Integer, ByVal FensterHöhe As Integer, ByVal Strech As Boolean) As Size
    2. Dim imgWidth As Integer = BildBreite
    3. Dim imgHeight As Integer = BildHöhe
    4. Dim imgRatio As Double = imgWidth / imgHeight
    5. Dim maxWidth As Integer = FensterBreite
    6. Dim maxHeight As Integer = FensterHöhe
    7. Dim maxRatio As Double = maxWidth / maxHeight
    8. Dim bStretch As Boolean = Strech
    9. If BildBreite = 0 Or BildHöhe = 0 Or FensterBreite = 0 Or FensterHöhe = 0 Then Return Nothing
    10. If (imgWidth > maxWidth Or imgHeight > maxHeight) Or (bStretch) Then
    11. If imgRatio <= maxRatio Then
    12. imgWidth = CInt(imgWidth / (imgHeight / maxHeight))
    13. imgHeight = maxHeight
    14. Else
    15. imgHeight = CInt(imgHeight / (imgWidth / maxWidth))
    16. imgWidth = maxWidth
    17. End If
    18. End If
    19. Return New Size(imgWidth, imgHeight)
    20. End Function
    21. Protected Overrides Sub OnDraw(ByVal e As D2DDrawEventArgs)
    22. If m_Image Is Nothing Then Exit Sub
    23. Select Case m_SizeMode
    24. Case PictureBoxSizeMode.Normal
    25. Dim RectSource As New Rectangle(0, 0, Math.Min(CInt(m_Image.Size.Width), Me.Width), Math.Min(CInt(m_Image.Size.Height), Me.Height))
    26. Dim RectDest As New Rectangle(AbsoluteLocation, RectSource.Size)
    27. e.Target.DrawBitmap(m_Image, RectDest, m_Opacity, InterpolationMode.Linear, RectSource)
    28. Case PictureBoxSizeMode.StretchImage
    29. e.Target.DrawBitmap(m_Image, New Rectangle(Me.AbsoluteLocation, Me.Size), m_Opacity)
    30. Case PictureBoxSizeMode.AutoSize
    31. e.Target.DrawBitmap(m_Image, New Rectangle(Me.AbsoluteLocation, New Size(CInt(m_Image.Size.Width), CInt(m_Image.Size.Height))), m_Opacity)
    32. Case PictureBoxSizeMode.CenterImage
    33. Dim RectSource As New Rectangle(Math.Max(CInt((m_Image.Size.Width - Me.Width) / 2), 0), Math.Max(CInt((m_Image.Size.Height - Me.Height) / 2), 0), CInt(Math.Min(Me.Width, m_Image.Size.Width)), CInt(Math.Min(Me.Height, m_Image.Size.Height)))
    34. Dim RectDest As New Rectangle(Me.AbsoluteLocation.X + CInt((Me.Width - RectSource.Width) / 2), Me.AbsoluteLocation.Y + CInt((Me.Height - RectSource.Height) / 2), RectSource.Width, RectSource.Height)
    35. e.Target.DrawBitmap(m_Image, RectDest, m_Opacity, InterpolationMode.Linear, RectSource)
    36. Case PictureBoxSizeMode.Zoom
    37. Dim S As Size = Scale(CInt(m_Image.Size.Width), CInt(m_Image.Size.Height), Me.Width, Me.Height, True)
    38. Dim RectDest As New Rectangle(Me.AbsoluteLocation.X + CInt((Me.Width - S.Width) / 2), Me.AbsoluteLocation.Y + CInt((Me.Height - S.Height) / 2), S.Width, S.Height)
    39. e.Target.DrawBitmap(m_Image, RectDest, m_Opacity)
    40. End Select
    41. End Sub

    Edit2: ich seh grad, das ist wirklich richtig ranzig, da solltest du nochmal Hand anlegen. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Artentus“ ()

    Danke dafür.
    Kann ich auf diese Methode den "Zoom"-Effekt reproduzieren?
    Normal, StretchImage, AutoSize, CenterImage und Zoom werden unterstützt, so wies die Enum-Werte sagen. Da es sich hier nicht um wirkliche Controls handelt, zeichnet AutoSize einfach das Bild vollständig und in Originalgröße an die entsprechende Position, während Normal das Bild auf das angegebene Rechteck beschneidet, falls nötig.

    Artentus schrieb:

    Normal, StretchImage, AutoSize, CenterImage und Zoom werden unterstützt, so wies die Enum-Werte sagen.

    Bin ich dämlich, oder wo kann ich diese anwenden?
    Ich finde diese nicht unter DrawImage :o
    Ach Gott. Verzeih mir, bin vom Handy on deswegen habe ich diesen nicht wirklich durchstudiert.
    Danke nochmals!