ImageGetColors() Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

ImageGetColors()

13 Sep 2017, 02:34

Moin freunds :)
Nachdem just me im [Progress]-thread ein großartiges beispiel für eine benutzerdefinierte grafische fortschrittsanzeige (basierend auf der gdip.ahk) gescripted hatte, habe ich überlegt, wie sich eine grafische vorlage (eine bitmap) als dort verwendbares colorarray einlesen lässt. Das ist garnicht schwierig, doch bin ich dabei auf etwas gestoßen was ich mir nicht recht erklären kann.

Die eingelesene testgrafik (attached) ist ein 10px*10px quadrat mit einem roten 1px rand (wird mit ausführung des scripts auch angezeigt).
Lese ich dies nun ein, verschiebt sich der output im colorarray, so scheint es, um jeweils eine reihe nach rechts sowie nach unten.
Die dabei entstandenen reihen erhalten den farbwert 0x000000 (schwarz).
Die gesamtanzahl der reihen/spalten stimmt jedoch (10x10 = 100px).

Das problem scheint mir bei den einstiegskoordinaten zu liegen, doch Barum ist das so?? :wtf:

ImageGetColors().ahk (fehlerhaft)
Spoiler
ImageGetColors().ahk (fehlerfrei)
Spoiler
Attachments
test02.png
test02.png (132 Bytes) Viewed 1581 times
Last edited by BoBo on 13 Sep 2017, 08:53, edited 2 times in total.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: PixelGetColor()

13 Sep 2017, 03:45

Das erste Pixel ist 0 nicht 1.
Normalerweise ist das ein standard - AHK ist eine der wenigen Sprachen die das falsch macht.
Recommends AHK Studio
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: PixelGetColor()

13 Sep 2017, 05:17

[OffTopic]
Meiner Meinung nach macht AHK das nicht falsch. Es kommt nur der menschlichen Denkweise entgegen und setzt den 'Index' eines Feldes in einem Array mit der 'Nummer' des Feldes gleich. Jeder vorurteilslose Mensch würde wohl sagen, dass das erste Feld von mehreren aufeinanderfolgenden die 'Nummer' 1 hat. Die Verwendung von 0 als Index (nicht Adresse!) des ersten Feldes hat ausschließlich technische Gründe. Man spart sich - und das war in den Zeiten als das Ganze erfunden wurde ein schlagendes Argument - einen Rechenschritt bei der Adressierung der Felder:

Code: Select all

; erster Index = 0
FeldAdresse  := ArrayAdresse + (Index * Feldlänge)
; gegen
; erster Index = 1
FeldAdresse  := ArrayAdresse + ((Index - 1) * Feldlänge)
[/OffTopic]
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: PixelGetColor()

13 Sep 2017, 05:30

nnnik wrote:Das erste Pixel ist 0 nicht 1.
Normalerweise ist das ein standard - AHK ist eine der wenigen Sprachen die das falsch macht.
Ändere ich die einstiegskoordinaten jeweils beide auf 0, sowie die konditionen entsprechend, verbleibt jedoch das letzte px einer reihe schwarz (was rot sein sollte), Sollte ich keinen fehler im code haben, heißt das ich müßte x = -1 starten? Dassa totaler murx, oder???
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: PixelGetColor()

13 Sep 2017, 07:01

Moin BoBo,

in einer Bitmap mit der Breite/Höhe 400 und den Startkoordinaten/Startindizes 0/0 haben das letzte Pixel einer Zeile/die letzte Zeile die Koordinate/den Index 399:

Code: Select all

		If (xPos > giw) {                                     ; sobald letztes px in reihe erreicht (bzw überschritten) ...
; muss werden
		If (xPos >= giw) {                                     ; sobald letztes px in reihe erreicht (bzw überschritten) ...
Hast Du das angepasst?
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: PixelGetColor()

13 Sep 2017, 07:29

Zugabe! Ich mache sowas üblicherweise so (auch wenn die geschachtelten Loops vielleicht etwas weniger performant sein sollten):

Code: Select all

   xPos := 0
   yPos := 0
   res := ""                                                   ; ausgabe initialisieren
   ...
   Loop, %gih% {                                               ; schleife über alle zeilen
      Loop, %giw% {                                            ; schleife über die zeile
         If (xPos = 0)                                         ; beginn einer neuen zeile
            res .= "Triangle.Push(["                           ; editierung um ausgabe "colorarray-konform" zu erhalten
         P := Gdip_GetPixel(pBitmap,xPos,yPos)                 ; pixel nur einmal auslesen
         R := Gdip_RFromARGB(P)                                ; ermittlung rot-wert
         G := Gdip_GFromARGB(P)                                ; ermittlung grün-wert
         B := Gdip_BFromARGB(P)                                ; ermittlung blau-wert
         RGB := Format("0x{:02X}{:02X}{:02X}", R, G, B)        ; RGB bilden
         res .= RGB . (A_Index = giw) ? "])`n" : ",")          ; konkatinierung der ermittelten werte zum colorarray (A_Index statt xPos)
         xPos++                                                ; nächster px in der reihe
      }
      xPos := 0
      yPos++
   }
*Nicht getestet!*
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

ImageGetColors()  Topic is solved

13 Sep 2017, 08:41

[quote="just me"]Zugabe! Ich mache sowas üblicherweise so (auch wenn die geschachtelten Loops vielleicht etwas weniger performant sein sollten):

Code: Select all

 *Nicht getestet!*[/quote]

Supi!  :clap:  (fehlte lediglich eine öffnende klammer im editierungs-ternary-operator  :shh: ). 
[color=#FF0000]Werde das ganze als separaten code(block) in den initialen post setzen[/color]. Mission accomplished. :mrgreen:

Danke vielmals für euren prompten support  :!: :thumbsup:

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 21 guests