FastGraphicsLib 1.0.0.5

    • Beta

    Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von 00yoshi.

      FastGraphicsLib 1.0.0.5

      Hallo,

      Chrisber brachte mich in diesem Post auf die Idee, diese Library zu entwickeln.



      • Public Sub SetPixel(ByVal x As Integer, ByVal y As Integer, ByVal cl As Color)
        Legt die Farbe des Pixels fest, der sich an der übergebenen Position befindet.
      • Public Function GetPixel(ByVal x As Integer, ByVal y As Integer) As Color
        Liest die Farbe des Pixels aus, der sich an der übergebenen Position befindet, und gibt diese zurück.

      • Public Function FindPixel(ByVal r As Byte, ByVal g As Byte, ByVal b As Byte, Optional ByVal varianz As Byte = 0) As Point()
        Gibt die Position aller Pixel im Bitmap-Objekt zurück, die unter Berücksichtigung der übergebenen Varianz der Farbe entsprechen.
      • Public Function FindPixelPercent(ByVal r As Byte, ByVal g As Byte, ByVal b As Byte, Optional ByVal varianzprozent As Integer = 0) As Point()
        Gibt die Position aller Pixel im Bitmap Objekt zurück, die unter Berücksichtigung des übergebenen Varianz-Prozentwertes der Farbe entsprechen.

      • Public Sub FindAndSetPixel(ByVal r As Byte, ByVal g As Byte, ByVal b As Byte, ByVal newcolor As Color, Optional ByVal varianz As Byte = 0)
        Liest alle Pixel im Bitmap-Objekt aus, die unter Berücksichtigung der übergebenen Varianz der Farbe entsprechen, und legt die Farbe dieser auf die übergebene Farbe fest.
      • Public Sub FindAndSetPixelPercent(ByVal r As Byte, ByVal g As Byte, ByVal b As Byte, ByVal newcolor As Color, Optional ByVal varianzprozent As Integer = 0)
        Liest alle Pixel im Bitmap-Objekt aus, die unter Berücksichtigung des übergebenen Varianz-Prozentwertes der Farbe entsprechen, und legt die Farbe dieser auf die übergebene Farbe fest.

      • Public Property Bitmap() As Bitmap
        Legt das Bitmap-Objekt fest oder gibt dieses zurück.

      • Public Shared Function FromBitmap(ByVal bmp As Bitmap) As FastGraphics
        Gibt eine neue Instanz der Klasse mit dem übergebenen Bitmap-Objekt zurück.
      • Public Shared Function FromScreen(ByVal rect As Rectangle) As FastGraphics
        Gibt eine neue Instanz der Klasse mit einem Abbild des übergebenen Bildschirmbereiches als Bitmap-Objekt zurück.

      • Public Sub Unlock()
        Gibt den Bitmap-Bereich frei.

      Wieso nutzen?

      Die Methoden SetPixel und GetPixel entsprechen nicht der normalen Methode aus der Bitmap-Klasse, sondern basieren auf Marshaling. Sie sind um ein vielfaches schneller, so braucht die SetPixel-Methode aus dieser Library 1,379 Sekunden um ein Bild in einer Auflösung von 3888 x 2592 pixelweise zu bearbeiten, während die aus der Bitmap-Klasse 14,2468 Sekunden benötigt, d.h. die Methode aus dieser Library ist bis zu 10 mal so schnell. Die anderen Methoden (FindPixel, FindPixelPercent, FindAndSetPixel und FindAndSetPixelPercent) arbeiten ebenso effizient und ersparen einiges an Schreibarbeit.

      Benchmark



      (Bitmap-Klasse: 29,6059205848788 Sekunden
      FastBitmap-Klasse: 3,65744249618137 Sekunden)

      Framework-Version

      Die Klassenbibliothek basiert auf dem .NET Framework 2.

      Mergen

      Ja, mit Verweis.

      Download

      Hier (ZIP, 6 Kb)

      Changelog

      1.0.0.1 - Bugfix
      1.0.0.2 - Implementierung von Übergabe der Varianz als Prozentwert
      1.0.0.3 - Implementierung einer Funktion zum direkten Kopieren eines Bildschirmbereichs
      1.0.0.4 - Nutzung der Library vereinfacht.
      1.0.0.5 - wichtiger Bugfix

      Beispiel

      VB.NET-Quellcode

      1. Dim fg As FastGraphics = FastGraphics.FromScreen(New Rectangle(50, 50, 200, 200))

      VB.NET-Quellcode

      1. Dim fg As FastGraphics = FastGraphics.FromBitmap(New Bitmap(50, 50))


      LG

      Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „kevin89“ ()

      genial Kevin
      ABER kannst du noch bei den GetColor Funktionen eine Optional hinzufügen mit einer Abweichung in Prozent
      dann kann man wenn man auch nicht genau die Farbe weiß zB mit +/- 10 % danach suchen
      Um alle Pixel mit einer bestimmten Farbe (+ Varianz) zu finden, gibt es doch bereits die Funktionen GetLocsOfColor/GetLocsAndSetColor? Das mit den Prozent muss ja nicht sein, und kann ja in Form der maximalen Abweichung der Farbwerte (jeweils R,G,B) übergeben werden.

      btw kleines Update.

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

      waren die Optional Varianz vorher auch dabei oO

      die sind aber als Integer -.- wäre Double nicht angebrachter ? oder soll das Max 255 anstatt von 100 % sein ?

      Mangafreak1995 schrieb:

      waren die Optional Varianz vorher auch dabei oO

      die sind aber als Integer -.- wäre Double nicht angebrachter ? oder soll das Max 255 anstatt von 100 % sein ?

      ja.

      Und Bytes sind nunmal keine Doubles. Sie werden auch komplett anders im Speicher abgelegt. Oder hat ein einfacher Byte etwa eine Mantisse? xD
      Von meinem iPhone gesendet
      Hi.
      Coole Sache :)
      Genial wäre es nun noch, wenn du auch eine Methode zum direkten Auslesen des Bildschirms (oder eine entsprechende Wrapperfunktion, die einen Bereich annimmt, von dem der Bildschirm direkt auf eine Bitmap kopiert wird, die man dann bearbeiten kann).

      Finde ich gut. Und erstaunlicherweise ist ein Pixelbot mit .NET somit deutlich schneller als die lahme GetPixel Variante (in C++). Da habe ich mich nie an das Gefrickel mit LockBits und so getraut, hier jedoch kann ich es gut verwenden - genial ;)

      Gruß
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.
      Public Function FindPixelPercent(ByVal r As Byte, ByVal g As Byte, ByVal b As Byte, Optional ByVal varianzprozent As Integer = 0) As System.Drawing.Point()

      Ist doch eigentlich klar? Die R,G,B-Werte und ggf. die erlaubte Abweichung bzw. Toleranz in Prozent (!)
      Hi,
      So ist es gut :)
      Hab aber noch einen Vorschlag:
      z.B. eine FindBitmap-Funktion die das angegebene Bild im Bitmap-Objekt sucht.
      Zwar könnte man dies auch selbst lösen, aber das erweitert deine Lib etwas mehr :)
      Der Rückgabewert sollte vom Typ System.Drawing.Rectangle sein.
      Mfg
      Loadsoft
      Was evtl noch gut sein könnte: Angeben ob die Findpixelsuche abgebrochen wird wenn die Farbe das erste Mal gefunden wurde. Bräuchte ich im Moment ;) Das erspart Zeit

      //wie kann es sein, dass die Lib mir als x-Koordinate einen negativen wert gibt?

      VB.NET-Quellcode

      1. Dim fg As FastGraphics = FastGraphics.FromScreen(New Rectangle(0, 0, My.Computer.Screen.WorkingArea.Width, My.Computer.Screen.WorkingArea.Height))
      2. Dim p As Point() = fg.FindPixel(153, 153, 153)
      3. MsgBox(p(0).ToString)


      -> x=-281 ... häh?
      Für ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln!

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

      Hallo :) ... ich habe eine Frage zur Benutzung der Library. Wenn ich wie diese wie oben angegeben benutze, kommt immer die Meldung:
      "Der Typ "FastGraphicsLib.FastGraphics" in der Assembly "FastGraphicsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" konnte nicht geladen werden.."

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private fg As FastGraphics = FastGraphicsLib.FastGraphics.FromBitmap(New Bitmap(100, 100))
      3. End Class

      Ist es möglich, dass diese Library nicht mit dem VisualStudio 2008 Express zusammen arbeitet?


      Mit freundlichen Grüßen,
      Marcus