[C#, Release] ColorHelper

    • Release

    Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von feuerfuchs.

      Vllt. kennen einige von euch ja mein Programm Aero Adjuster.
      Während der Entwicklung hab ich den Farbdurchschnitts-Algorithmus locker 6 Mal geändert, weil er entweder zu fehleranfällig oder langsam war, bis ich dann die perfekte Methode hatte. ^^
      Ich dachte, dass einige von euch eventuell etwas damit anfangen können, deshalb geb ich die Library hier mal für alle frei: Download (ca. 3 KB)
      Ihr braucht mindestens .NET Framework 3.5, um die Lib zu nutzen, und nein, ich stell das nicht runter. Die Steinzeit ist vorbei, wir haben 2012. ;)
      Sie ist in C# geschrieben, deshalb ist das Thema im Offtopic, wenns doch besser in den Showroom passt, bitte verschieben ;)
      Dekompilieren, auseinandernehmen, etc. ist verboten, solange ich nicht ausdrücklich die Erlaubnis dazu erteilt habe, ihr dürft die Lib nutzen, ohne meinen Namen zu nennen, etc pp, viel Spaß. :D

      Und hier ein billiges Klassendiagramm:

      Edit: Hab ganz vergessen, die Methode zum Berechnen der Durchschnittsfarbe zu dokumentieren:
      Sie ist so aufgebaut:

      C-Quellcode

      1. public static System.Drawing.Color CalculateAverageColor(Bitmap bm, bool dropPixels, int colorDiff)

      bm ist logischerweise die Bitmap, von der ihr die Durchschnittsfarbe haben wollt, dropPixels legt fest, ob ihr Grauton-artige Farben "fallen lassen" wollt, und colorDiff legt die Schwelle für dropPixels fest, wenn dropPixels true ist. (Ein guter Wert ist z.B. 15, das lässt nicht zu viele Pixel fallen, sodass ihr nen passenden Farbton zurückkriegt)


      Edit by LaMa5:
      - da es mittlerweile einen Showroom für "weitere Sprachen" gibt
      -->*moved* (OffTopic => "weitere Sprachen"-Showroom)

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

      Sieht ganz nützlich aus.

      Kleine Fragen trotzdem:
      Wieso definierst du CalculateAverageColor nicht als Erweiterungsmethode für Bitmap?
      Wieso keine Überladung anstatt einer boolschen Variable? So muss man keinen Wert übergeben, wenn man keine Pixel droppen will.
      Wieso .NET 3.5? Ich weiß, dass du oben geschrieben hast, dass du es nicht runtersetzt. Hat das einen programmiertechnischen Grund oder ist das nur da, um die Steinzeit aussterben zu lassen? :)
      Zu 1. Einfach den ersten Parameter so deklarieren:

      C-Quellcode

      1. public static System.Drawing.Color CalculateAverageColor(this Bitmap bm, ...);
      So kannst du es dann so auf eine Instanz von Bitmap anwenden:

      C-Quellcode

      1. Bitmap bmp = ...;
      2. bmp.CalculateAverageColor(...);
      Der Code ist größtenteils von hier übernommen, ich hab ein paar kleine Änderungen vorgenommen und ihn in ne DLL gepackt, damit ich ihn in meinem VB.NET-Programm benutzen kann. Deshalb verlange ich auch keine Namensnennung, weil das bei Code, der ursprünglich nicht von mir ist, unfair wäre. ;)

      Edit: @haiyyu: Danke, ich pass das gleich an. ;)
      Hi Samus,
      ich habe die Funktion mal getestet und sie funktioniert auch soweit. Habe sie dann eine Zeit lang laufen lassen, und nach einiger Zeit kam plötzlich die Fehlermeldung es wurde versucht durch 0 zu teilen. Der Fehler lässt sich reproduzieren: Wenn ich meinen Desktop "scanne" (überwiegend Grün) passiert nichts, auch wenn VisualStudio geöffnet ist passiert nichts, wenn cih dann aber den Firefox (zum Beispiel mit diesem Thread hier) in den Vordergrund hole, crasht die FUnktion wieder mit der Fehlermeldung "es wurde versucht durch 0 zu teilen". Ich muss dazu sagen, das ich nicht deine Lib, sondern die Funktion der Seite die du als Quelle angegeben hasst verwende. Auserdem errechnet mein programm auch nicht die Durchschnittsfarbe vom ganzen Bildschirminhalt sondern von einzelen Feldern (100*100) Pixeln am Bildschirmrand. Ist bei dir der Fehler auch mal aufgetreten und hast du eine Lösung gefunden?
      lg
      Du hast geschrieben "ich habe ein paar KLEINE Änderungen vorgenommen". Ich verwende die Funktion nur nicht wie du, um die Durchschnittsfarbe des ganzen Desktops zu berechnen, sondern berechne nur die Durchschnittsfarbe von kleineren Flächen.
      Hi,

      ich habe gerade mal versucht, die DLL zu verwenden, bekomme es aber nicht ganz auf die Reihe:
      Ich binde sie so ein:

      Quellcode

      1. [DllImport("ColorHelper.dll", EntryPoint = "CaptureScreen")]
      2. public static extern System.Drawing.Color CalculateAverageColor(Bitmap bm, bool dropPixels, int colorDiff);

      Wenn ich die Funktion dann aufrufe, kommt folgender Laufzeitfehler:
      Die Typensignatur der Methode ist nicht PInvoke-kompatibel.
      Der Typ der Exception ist ein MarshalDirectiveException.

      Könnt ihr mir sagen, was mein Fehler ist oder einen Code zeigen, wie ihr es gemacht habt?
      Danke! MfG feuerfuchs

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

      D.h. ich soll den DllImport löschen? Einen Verweis zur Dll habe ich in den Projekteigenschaften eingefügt.
      Dann kommt eine TypeLoadException:
      Der Typ "ScreenSh1.Form1" der Assembly "ScreenSh1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" konnte nicht geladen werden, da die Methode "CalculateAverageColor" keine Implementierung (keine RVA) hat.

      Sorry, aber bin noch kein C#-Profi ;)

      Samus Aran schrieb:

      3. Da 3.5 bei Vista und 7 mitgeliefert wird, und ich auf XP generell keine Rücksicht nehme, nehm ich logischerweise keine Rücksicht auf Leute, die nur .NET 2.0 haben.

      Falsch! Mit Vista wird lediglich 3.0 ausgeliefert, und das ist .NET 2.0 mit ein Paar "Erweiterungen" (nennt sich .NET 3.0)

      @feuerfuchs
      BTW: Um die Funktion zu testen kannst du auch VB benutzen^^