Bild aus einem Bild herausschneiden

    • VB.NET

    Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Mangafreak1995.

      Bild aus einem Bild herausschneiden

      Ich habe mir letztens eine Funktion geschrieben mit der man aus einem vorhandenen Image ein TeilImage 'herausschneiden' kann:
      Mit Imports

      VB.NET-Quellcode

      1. Imports System.Drawing
      2. Public Shared Function LoadImagePart(ByVal img As Image, ByVal rows As Integer, ByVal colums As Integer, ByVal part As Point) As Image
      3. Dim minw, minh As Integer
      4. minw = CInt(img.Width / colums)
      5. minh = CInt(img.Height / rows)
      6. Dim cur As New Bitmap(minw, minh)
      7. Using g As Graphics = Graphics.FromImage(cur)
      8. g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy
      9. g.DrawImage(img, New Rectangle(0, 0, cur.Width, cur.Height), _
      10. New Rectangle(minw * part.X, minh * part.Y, cur.Width, cur.Height), GraphicsUnit.Pixel)
      11. g.Flush()
      12. End Using
      13. Return cur
      14. End Function

      Ohne Imports

      VB.NET-Quellcode

      1. Public Shared Function LoadImagePart(ByVal img As System.Drawing.Image, ByVal rows As Integer, ByVal colums As Integer, ByVal area As System.Drawing.Point) As System.Drawing.Image
      2. Dim minw, minh As Integer
      3. minw = CInt(img.Width / colums)
      4. minh = CInt(img.Height / rows)
      5. Dim cur As New System.Drawing.Bitmap(minw, minh)
      6. Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(cur)
      7. g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy
      8. g.DrawImage(img, New System.Drawing.Rectangle(0, 0, cur.Width, cur.Height), _
      9. New System.Drawing.Rectangle(minw * area.X, minh * area.Y, cur.Width, cur.Height), System.Drawing.GraphicsUnit.Pixel)
      10. g.Flush()
      11. End Using
      12. Return cur
      13. End Function

      Als Klasse

      VB.NET-Quellcode

      1. Public Class ImageSeperator
      2. Private baseImage As System.Drawing.Image
      3. Public ReadOnly Property Image As System.Drawing.Image
      4. Get
      5. Return baseImage
      6. End Get
      7. End Property
      8. Private tblSize As System.Drawing.Size
      9. Public Property TableSize As System.Drawing.Size
      10. Get
      11. Return tblSize
      12. End Get
      13. Set (ByVal value As System.Drawing.Size)
      14. If value.Height > 0 And value.Width > 0 Then
      15. tblSize = value
      16. RaiseEvent TableSizeChanged(Me)
      17. Else
      18. Throw New System.ArgumentOutOfRangeException("Values must be greater than 0.")
      19. End If
      20. End Set
      21. End Property
      22. Public Event TableSizeChanged(ByVal sender As Object)
      23. Private cuttedImages As System.Drawing.Image()
      24. Public Function Cell(ByVal cellPoint As System.Drawing.Point) As Image
      25. Return Cell(cellPoint.X, cellPoint.Y)
      26. End Function
      27. Public Function Cell(ByVal x As Integer, ByVal y As Integer) As Image
      28. If x < 0 Or y < 0 Then _
      29. Throw New System.ArgumentOutOfRangeException("Value must be greater than or equal 0.")
      30. Dim i As Integer = x * tblSize.Width + y
      31. If i >= cuttedImages.Length() Then _
      32. Throw New System.ArgumentOutOfRangeException("Values must be greater than 0.")
      33. Return cuttedImages.Item(i)
      34. End Function
      35. Private Sub ReCutImage(ByVal sender As Object) Handles Me.TableSizeChanged
      36. Dim minw, minh As Integer
      37. minw = CInt(baseImage.Width / tblSize.X)
      38. minh = CInt(baseImage.Height / tblSize.Y)
      39. Dim cur As System.Drawing.Bitmap
      40. Dim images As New System.Collections.Generic.List(Of System.Drawing.Image)
      41. For x As Integer = 0 To tblSize.Width - 1
      42. For y As Integer = 0 To tblSize.Height - 1
      43. cur = New System.Drawing.Bitmap(minw, minh)
      44. Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(cur)
      45. g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy
      46. g.DrawImage(img, New System.Drawing.Rectangle(0, 0, minw, minh), _
      47. New System.Drawing.Rectangle(minw * x, minh * y, minw, minh), System.Drawing.GraphicsUnit.Pixel)
      48. g.Flush()
      49. End Using
      50. images.Add(cur)
      51. Next
      52. Next
      53. cuttedImages = images.ToArray()
      54. End Sub
      55. Public Sub New(ByVal img As System.Drawing.Image)
      56. baseImg = img
      57. TableSize = New Point(1, 1)
      58. End Sub
      59. End Class


      Ich hoffe, dass der Code jemanden helfen konnte.

      MfG Mangafreak1995

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Mangafreak1995“ () aus folgendem Grund: Klasse hinzugefügt (auf Wunsch von Unwesen), Download entfernt

      Hallo Mangafreak1995,

      ein paar kleine Anmerkungen

      1. Wenn du Using verwendest, kannst du dir das Dispose sparen, da Using das automatisch erledigt.
      2. Ich denke das ganze würde ohne Flush auch funktionieren - aber nagut.
      3. Wenn ich das richtig sehe, dann teilst du die Graphik in gleichgroße Teile und gibst einen davon zurück. Was aber nicht aus dem Titel hervorgeht. Wolltest du damit ein Puzzle oder Memory Game bauen ?
      4. Die zwei Versionen sind unnötig - mit und ohne Imports


      Gruss

      mikeb69
      Zu 1. : geändert :)
      Zu 2. : manchmal gabs Probleme ohne Flush also hab ichs lieber dabei.
      Zu 3. : Deine Beispiele sind damit zu bewältigen. Ich habe es genommen und die Anzahl an Dateien zu reduzieren in dem ich gleichgroße Bilder in einem gepackt habe und dann wie due beschrieben raus genommen habe. Wer was damit macht, muss jeder selbst wissen.
      Zu 4. : nimmt man die Ohne-Imports-Version dann gibts keine "ungewollten" Komplikationen wenn man XNA-Imports hat, da dort Point und Graphics auch vorhanden sind.

      MfG M4n94fr34k
      Der Download enthält den Code auch nur als Projekt ;) mit OpenFileDialog etc.
      ungefähr so rufst du die Funktion auf :

      VB.NET-Quellcode

      1. Dim imageBase As Image = 'Irgendwas zuweisen als Bild woraus du etwas haben willst
      2. Dim pt As New Point(Anzahl der Reihen, Anzahl der Spalten) ' muss kein Punkt sein ist nur zum Verkürzen des Codes
      3. Dim selected As New Point(X-Position, Y-Position) ' auf der entstehenden ImageMap; Index ist bei 0
      4. Dim myImgPart As Image = LoadImagePart(imageBase, pt.X, pt.Y, selected)