Prozentanteil aller Farben in einem Bildausschnitt

  • Moinsen

    Also 1. mal sorry für den unverständlichen Titel aber ich hatte so keinen Schimmer, wie man diese Frage in einen Sinnvollen Titel verwandeln kann ^^
    Nun zu meiner Frage. Die Ausgangslage ist folgende:

    • Ich habe irgendein Bild (Auflösung unterschiedlich)
    • Ich will nun von einem bestimmten Ausschnitt des Bildes (z.B. 10x10px-Ausschnitt an den Koordinaten 0x0) herausfinden, welche Farbe am meisten vorkommt
    • Es soll nicht einfach nur mit bestimmten Farben gearbeitet werden, sondern es soll der (möglichst) genaue Hex-Farbcode ausgegeben werden

    Ich weiss es gäbe da eine Lösung mit PixelGetColor, aber dafür müsste das Bild meines Wissens irgendwie auf dem Bildschirm angezeigt sein und genau das will ich nicht.
    Das ganze soll nun also das Bild (Speicherort bekannt) irgendwie im Hintergrund öffnen und dann an der gewünschten Position innerhalb des angegebenen Bereichs diese Prozentual am meisten vorkommende Farbe ausfindig machen, diese Funktion wird dann auf dem gesamten Bild immer mit neuen Koordinaten ausgeführt, bis ich dann für alle einen Farbcode Beispielsweise in einem Array habe.
    Ich hoffe das ist mehr oder weniger verständlich geschrieben, ich bin gerade etwas im Stress :S

    lg Gene

    Bild1: Ich beim debuggen

  • 1. Bild mit GDI+ laden
    Entweder:
    2.a) _GDIPlus_BitmapLockBits Beispiel
    oder 2.b)

    [autoit]

    Func _GDIPlus_GetPixel($hBitmap, $x, $y)
    Local $result = DllCall($ghGDIPDLL, "int", "GdipBitmapGetPixel", "ptr", $hBitmap, "int", $x, "int", $y, "dword*", 0)
    If @error Then Return SetError(1, 0, 0)
    Return SetError($result[0], 1, $result[4])
    EndFunc ;==>_GDIPlus_GetPixel

    [/autoit]


    3. Farben pro Ausschnitt zählen und relative Häufigkeit ausrechnen.

  • Besten dank, werd ich mir gleich mal anschauen, so wie das hier Aussieht, muss ich dann aber jedes Pixel einzeln überprüfen...so müsste ich aber dann vermutlich irgendwie eine maximale Grösse festlegen, damit die Suche nicht zu lange dauert und vorallem nicht gleich den PC überlastet...wobei das natürlich keine unüberwindbare Hürde ist/wäre. Wenn das so funktioniert, ist das für mich eg. okay, aber ich lasse mal noch offen für den Fall, dass jemand etwas NOCH besseres weiss ;)

    Bild1: Ich beim debuggen

  • Habe ich dich überhaupt richtig verstanden? Du möchtest eine Bitmap in Rechtecke einteilen und jedem Rechteck eine häufigste Farbe mit Prozentanteil zuweisen, oder?
    Falls die Performance wichtig wäre, kannst du dies auch in Assembler nachprogrammieren: Pixelsearch in Bitmap [ASM]

  • Genau das ist der Grundgedanke...in Assembler kenne ich mir leider nun so ziehmlich...gar nicht aus, wollt s mir eigentlich mal letztes Jahr vornehmen, aber ich will kein Durcheinander bekommen (bin seid meiner C++/C#-Zeit ziehmlich anfällig darauf, alle verschiedensten Programmiersprachen miteinander zu vermischen ^^).
    Gute Performance wäre ein Plus-Punkt, aber nicht essentiell notwendig. Wenn ich da noch eine maximale Grösse festlege wird das schon klappen, es sollen ja keine HD-Bilder sein die eingelesen werden sondern eher so...halt Zeugs das sich lohnt in Pixel-Art darzustellen.
    Ich denke ich nehm deine Lösung...naja sobald ich fertig mit testen bin ;)

    Bild1: Ich beim debuggen