Ist ein Bild in einen Großem Vorhanden

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Devilx1.

    Ist ein Bild in einen Großem Vorhanden

    Guten Tag,
    Ich habe Zwei Bilder, ich weiß wie man prüft ob zwei Bilder identisch sind aber mein Problem ist bisschen anders. Ich will prüfen ob in einem Bild ein anderes Bild vorhanden ist
    WICHTIG:
    In den kleinen Bild ist Transparenz mit drin aber in den Anderen nicht!
    Wäre sehr schön könntet ihr mir helfen
    MFg
    COnfix :thumbsup:
    Du willst also wenn ich das richtig verstanden habe, einen Bild auschnitt mit einem anderen Bild vergleichen das größer ist und auch noch Teilweise transparent?

    Edit: Hab da was gefunden, sieht sehr gut aus.

    sythe.org/showthread.php?t=155248

    Code (Quelle: Sythe.org)

    VB.NET-Quellcode

    1. Private Sub FindBitmap() Handles Button1.Click
    2. Dim Target = My.Resources.photoshop_icon
    3. Dim ScreenBounds = Screen.PrimaryScreen.Bounds
    4. Dim Source = New Bitmap(ScreenBounds.Width, ScreenBounds.Height, Imaging.PixelFormat.Format32bppArgb)
    5. Using Gfx = Graphics.FromImage(Source)
    6. Gfx.CopyFromScreen(Nothing, Nothing, ScreenBounds.Size)
    7. End Using
    8. Dim Result = Source.FindBitmap(Target)
    9. Debug.WriteLine(If(Result.HasValue, "Found bitmap at: " & Result.Value.ToString, "Could not find bitmap."))
    10. End Sub


    Bild suchen

    VB.NET-Quellcode

    1. Public Module ImageScanner
    2. Private Const BytesPerPixel As Integer = 3
    3. <System.Runtime.CompilerServices.Extension()> _
    4. Public Function FindBitmap(ByVal Source As Bitmap, ByVal Target As Bitmap) As Rectangle?
    5. Return Source.FindBitmap(New Rectangle(Nothing, Source.Size), Target)
    6. End Function
    7. <System.Runtime.CompilerServices.Extension()> _
    8. Public Function FindBitmap(ByVal Source As Bitmap, ByVal Area As Rectangle, ByVal Target As Bitmap) As Rectangle?
    9. Dim SourceData As Imaging.BitmapData = Nothing
    10. Dim SourceBytes = Source.GetBitmapData(New Rectangle(0, 0, Source.Width, Source.Height), SourceData)
    11. Dim TargetData As Imaging.BitmapData = Nothing
    12. Dim TargetBytes = Target.GetBitmapData(New Rectangle(0, 0, Target.Width, Target.Height), TargetData)
    13. Dim FirstTargetPixel = TargetBytes.GetPixelFromArray(Nothing, TargetData).ToArgb
    14. Dim TargetSection = TargetBytes.GetSection(New Rectangle(0, 0, Target.Width, Target.Height), TargetData)
    15. For Y = Area.Top To Area.Bottom - Target.Height
    16. For X = Area.Left To Area.Right - Target.Width
    17. If SourceBytes.GetPixelFromArray(New Point(X, Y), SourceData).ToArgb <> FirstTargetPixel Then Continue For
    18. Dim SectionBounds = New Rectangle(X, Y, Target.Width, Target.Height)
    19. Dim Section = SourceBytes.GetSection(SectionBounds, SourceData)
    20. If CompareByteArray(Section, TargetSection) Then Return SectionBounds
    21. Next X, Y
    22. Return Nothing
    23. End Function
    24. <System.Runtime.CompilerServices.Extension()> _
    25. Private Function GetPixelFromArray(ByVal Array As Byte(), ByVal Point As Point, ByVal BitmapData As Imaging.BitmapData) As Color
    26. Dim Offset = (BitmapData.Stride * Point.Y) + (BytesPerPixel * Point.X)
    27. Return Color.FromArgb(Array(Offset + 2), Array(Offset + 2), Array(Offset))
    28. End Function
    29. <System.Runtime.CompilerServices.Extension()> _
    30. Private Function GetBitmapData(ByVal Bitmap As Bitmap, ByVal Area As Rectangle, ByRef BitmapData As Imaging.BitmapData) As Byte()
    31. BitmapData = Bitmap.LockBits(Area, Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format24bppRgb)
    32. Dim Out = New Byte(BitmapData.Height * BitmapData.Stride) {}
    33. System.Runtime.InteropServices.Marshal.Copy(BitmapData.Scan0, Out, 0, Out.Length)
    34. Bitmap.UnlockBits(BitmapData)
    35. Return Out
    36. End Function
    37. <System.Runtime.CompilerServices.Extension()> _
    38. Private Function GetSection(ByVal Bytes As Byte(), ByVal Area As Rectangle, ByVal BitmapData As Imaging.BitmapData) As Byte()
    39. Using Out = New IO.MemoryStream
    40. For Y = Area.Top To Area.Bottom - 1
    41. Dim Offset = (BitmapData.Stride * Y) + (BytesPerPixel * Area.Left)
    42. Out.Write(Bytes, Offset, Area.Width * BytesPerPixel)
    43. Next
    44. Return Out.ToArray
    45. End Using
    46. End Function
    47. Private Function CompareByteArray(ByVal Array1 As Byte(), ByVal Array2 As Byte()) As Boolean
    48. For Position = 0 To Array1.Length - 1
    49. If Array1(Position) <> Array2(Position) Then Return False
    50. Next
    51. Return True
    52. End Function
    53. End Module

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Devilx1“ ()