Pixelmagic - Eine Lib zur Bildbearbeitung

    • Release

    Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

      Pixelmagic - Eine Lib zur Bildbearbeitung

      Pixelmagic
      Diese Lib hab ich für ein paar kleine Funktionen geschrieben, die mit Bildern und simulierten Eingaben zutun haben. Jetzt hab ich mir überlegt das ganze zu veröffentlichen, vielleicht braucht ja jemand mal was daraus.

      Beschreibung:
      Einerseits kann die Lib zum Vereinfachen von manchen Funktionen genutzt werden. Dazu gehören:
      - Screenshots erstellen (Auch vom minimiertem Fenster, sofern es das eigene ist)
      - Maus und Tastatureingaben simulieren (Auch in Spielen, wo Sendkeys versagt). Wer das machen will muss noch die Inputsimulator.dll ins gleiche Verzeichnis packen wie Pixelmagic.dll.


      Die wirklich interessante Klasse ist FastBmp. Das ist enthalten:
      - Die Funktion CheckCompatiblity. Hier könnt ihr gucken, ob die Klasse mit eurem Bild kompatibel ist.
      - Die Funktion findAllPixel gibt eine Liste(Of Point) von allen Punkten mit der bestimmten Farbe zurück. Die Funktion findFirstPixel gibt den ersten zurück. Beides sind asynchrone Funktionen, die mit await aufgerufen werden sollten.
      - Die Funktion FarbenPruefen() gibt true zurück, wenn zwei Farben unter Berücksichtigung einer bestimmten Varianz die gleichen sind. Die Funktion ComparePixel(x, y, pColor, Toleranz) macht das gleiche, nur, dass die erste Farbe aus einem Pixel ausgelesen wird
      - Die Methoden GetPixel und SetPixel kennt man ja von der Bitmap-Klasse. Die in dieser Klasse sind jedoch durch die Nutzung von Lockbits und der Marshal Klasse sehr viel schneller.
      - Die Methode Replace ersetzt alle Pixel auf der FastBmp mit einer bestimmten Farbe durch eine andere. Auch diese Methode sollte mit await aufgerufen werden.
      Spoiler anzeigen

      Hier jetzt noch ein kurzes Anwendungenbeispiel:
      Um die Methoden zu nutzen zu können ist es verpflichtend, am Ende die Methode myFastBmp.Unlock() aufzurufen, da sonst der Zugriff auf die Bitmap verwehrt wird. Falls ihr das vergessen habt kriegt ihr eine Fehlermeldung über einen ominösen gesperrten Bitmapbereich.

      VB.NET-Quellcode

      1. 'Diese Methode sorgt dafür, dass die Hintergrundfarbe der Form auf die Farbe des angeklickten Pixels geändert wird.
      2. 'Ein Bild habe ich natürlich schon im Designer in die Picturebox PicTest geladen
      3. Private Sub PicTest_MouseDown(sender As Object, e As MouseEventArgs) Handles PicTest.MouseDown
      4. 'Als erstes eine FastBmp anhand einer Bitmap oder eines Image erzeugen. Ich wähle eine Picturebox:
      5. Dim myFastBitmap As New FastBmp(PicTest.Image)
      6. 'Hier können jetzt alle Funktionen genutzt werden, die in der Klasse sind:
      7. Me.BackColor = myFastBitmap.GetPixel(e.Location)
      8. 'Am Ende den Zugriff auf die Bitmap wieder ermöglichen:
      9. myFastBitmap.Unlock()
      10. End Sub




      Verwendete Programmiersprache und IDE:
      C# Visual Studio 2012 Professional

      Systemanforderungen:
      .NET Framework 4.5

      Download:
      siehe Anhang

      Lizenz/Weitergabe:
      Open Source, nehmt euch was ihr wollt.
      Aber schreibt bitte kurz in diesen Thread, falls ihr sie gebraucht habt und wofür ihr sie gebraucht habt.

      Bei Problemen, Fragen und Anregungen hilft meistens ein Post ;)

      * Topic verschoben *
      Bilder
      • Klassendiagramm FastBmp.png

        16,78 kB, 475×408, 381 mal angesehen
      Dateien

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „hal2000“ ()

      Hi
      benenne doch die Methoden gleichmäßig, also nicht mit Klein-und Großbuchstaben, sondern FW-konform nur mit Großbuchstaben und Parameter ohne Präfix (oder mit sinnvoller Benennung) und mit Kleinbuchstaben. Btw. wäre es nicht praktischer, FindAllPixel mit Delegaten zu versehen oder mit Iterator?
      Die Parameter sind übrigens auch noch deutsch ;).

      Gruß
      ~blaze~
      Delegaten oder Enumeratoren hätten den Vorteil, dass sie nicht erst umständlich in eine Liste gepackt werden müssen. Bei einem Delegaten könntest du dann entsprechend direkt die Ausgabe einfach weiterleiten, bei einem Enumerator müsstest du das halt entsprechend puffern oder, je nach Fall, sogar besser beim MoveNext-Aufruf den nächsten zutreffenden Pixel ermitteln. Wenn du Listen verwendest, entwickelt sich die Liste häufig auch als Flaschenhals.
      Wenn du Enumeratoren verwendest erübrigt sich auch FindFirstPixel, wenn du es nicht asynchron vorauspufferst.
      Btw. wäre doch schön, wenn du noch eine Fill-Methode einführen könntest, die mit einem Delegaten die Zielfarbe bestimmt und einen Enumerator, der alle Pixel durchgeht.
      Die Color-Struktur selber ist übrigens sehr unperformant.

      Gruß
      ~blaze~