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??
#SingleInstance, Force
SetBatchLines, -1
SetWorkingDir %A_ScriptDir%
#Include Gdip.ahk ; Pfad zur gdip.ahk ist ggf anzupassen!! Download: https://autohotkey.com/boards/viewtopic.php?t=6517
If (A_ScriptName = "ImageGetColors().ahk") { ; test sektion mit funktionsaufruf. Dateiname anpassen oder sektion entfernen!
MsgBox % "This has been copied to the clipboard ...`n`n" ClipBoard := ImageGetColors("test02.png") ; testdatei zum download im anhang zum thread.
Gui, Add, Picture, x10 y10 w10 h10,% "test.png"
Gui, Show, w120 h30,`t ; anzeige des original bitmaps
}
ImageGetColors(filename) {
xPos := 1 ; startposition erstes px von links
yPos := 1 ; startposition erstes px von oben
pToken := Gdip_Startup()
pBitmap := Gdip_CreateBitmapFromFile(filename) ; parse bitmap in eine variable
giw := Gdip_GetImageWidth(pBitmap) ; ermittle weite/breite des bildes
gih := Gdip_GetImageHeight(pBitmap) ; ermittle höhe des bildes
MsgBox % "Image scale: " giw "p x " gih "p" ; ermittelte höhe/weite des bildes
Loop,% giw*gih { ; abfragen aller farbwerte beginnend von links oben nach rechts unten
If (xPos = 1)
res .= "Triangle.Push([" ; editierung um ausgabe "colorarray-konform" zu erhalten
R := Gdip_RFromARGB(Gdip_GetPixel(pBitmap,xPos,yPos)) ; ermittlung rot-wert
G := Gdip_GFromARGB(Gdip_GetPixel(pBitmap,xPos,yPos)) ; ermittlung grün-wert
B := Gdip_BFromARGB(Gdip_GetPixel(pBitmap,xPos,yPos)) ; ermittlung blau-wert
res .= (xPos = giw) ? rgb2hex(R, G, B, 2) . "])`n" : rgb2hex(R, G, B, 2) . "," ; konkatinierung der ermittelten werte zum colorarray
xPos++ ; nächster px in der reihe
If (xPos > giw) { ; sobald letztes px in reihe erreicht (bzw überschritten) ...
yPos++ ; beginne eine neue reihe ...
xPos := 1 ; und starte zu beginn der reihe
}
}
Return % res
}
#SingleInstance, Force
SetBatchLines, -1
SetWorkingDir %A_ScriptDir%
#Include Gdip.ahk ; Pfad zur gdip.ahk ist ggf anzupassen!! Download: https://autohotkey.com/boards/viewtopic.php?t=6517
If (A_ScriptName = "ImageGetColors.ahk") {
MsgBox % "This has been copied to the clipboard ...`n`n" ClipBoard := ImageGetColors("test02.png")
}
ImageGetColors(filename) {
xPos := 0
yPos := 0
res := "" ; ausgabe initialisieren
pToken := Gdip_Startup()
pBitmap := Gdip_CreateBitmapFromFile(filename) ; parse bitmap in eine variable
giw := Gdip_GetImageWidth(pBitmap) ; ermitteln der bild-breite
gih := Gdip_GetImageHeight(pBitmap) ; ermitteln der bild-höhe
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
xPos++ ; nächster px in der reihe
}
xPos := 0 ; zurücksetzen auf ersten px ...
yPos++ ; nächste reihe
}
Gdip_DisposeImage(pBitmap) ; freigabe der initialiserten speicherbereiche
Gdip_Shutdown(pToken)
Return % res ; rückgabe des erstellten colorarrays
}
Attachments
test02.png (132 Bytes) Viewed 1580 times
Last edited by BoBo on 13 Sep 2017, 08:53, edited 2 times in total.
[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:
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???
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:
If (xPos > giw) { ; sobald letztes px in reihe erreicht (bzw überschritten) ...
; muss werden
If (xPos >= giw) { ; sobald letztes px in reihe erreicht (bzw überschritten) ...
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!*[/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: