Gute Fahrt, und lass das Fenster zu ^^, was hat die Versicherung eigendlich zu dem Vorfall mit dem Becher gesagt?
Beiträge von Andy
-
-
Hi,
schau hier im Forum mal nach PushTheButton
-
Hi,
u.a. über die Verfahren der Kantendetektion ist es möglich, Konturen auf einem Bild zu analysieren.
Man kann dann z.B. "Kreise" auf einem Bild suchen, was sogar ziemlich einfach ist, ich hatte für TheShadowAE auch eine kleine Assemblerfunktion geschrieben, um die Mittelpunkte dieser "Kreise" (Augen) auf einem Bild zu erkennen.
Augen sind daher recht einfach zu finden, meist bestehen sie aus mehreren konzentrischen Kreisen (Iris). Mit zusätzlichen Farbinformationen aus dem Bild lassen sich Augen eigendlich sehr schnell und einfach erkennen.Ein Gesicht besteht aber nicht nur aus Augen, die Position von Mund und Nase sind auch vorhanden und können über die Kantendetektion gefunden und analysiert werden. Auch die Farbinformationen spielen dann eine Rolle.
Im Prinzip ist es die sinnvolle Aneinanderreihung verschiedener (Standard)-Filter und einiger eigener Funktionen.ZitatIch möchte mir ein Skript bauen, dass auf Fotos gesichter erkennt, diese ausschneidet und dann das ausgeschnittene Bild in einer .jpg speichert. Dabei sollte wirklich nur das Gesicht und die Haare später ausgegeben werden, also sämtliche Dinge die vll. noch ansatzweise im Hintergrund zu sehen sind, sollten weiß sein.
Du hast definitiv NIEMALS auch nur ansatzweise Haare/Frisuren "von Hand" freigestellt, DAS steht fest. Ansonsten hättest du längst nach dementsprechenden Funktionen gegoogelt. Sämtliche "Tutorials" zu "Haare einfach freistellen" benutzen Bilder, auf denen die Kantenerkennung (hihi, s.o.) sehr gute Ergebnisse liefert, also gleichmässiger Hintergrund mit hohem Kontrast zu den Haaren.
Nimm einfach mal ein Bild einer Schulklasse, und stell dort sämtliche Haare frei
-
Zitat
Dann kann es aber doch zu verzögerungen kommen oder nicht?
nein, die Funktion wird exakt alle 1000 Millisekunden aufgerufen. Wenn bspw. die Funktion 800ms dauert, dann wird 200ms gewartet, dauert die Funktion 5ms, dann wird die Funktion auch erst nach 995ms aufgerufen.
Probleme gibts nur dann, wenn die Funktion länger dauert als das vorgegebene Wiederholungsintervall. -
Hi,
für´n Anfang nicht schlecht
Nur hat das Script bei weitem zu viele Zeilen
WENN binär, dann richtig; Stunden, Minuten und Sekunden NACHEINANDER in einer Zeile, farblich getrennt,
OOOOO|OOOOOO|OOOOOO, hat den Vorteil, die Uhr auch "in" den oberen Rahmen eines Fensters oder in die Menübar schieben zu können, ohne dass Fensterteile überdeckt werden.Tip: Wandele zuerst die std, min und sec in EINE Binärzahl, dann kannst du die Darstellung auch in eine kurze Schleife packen.
"Gefüllte" und "nichtgefüllte" Kreise kannst du, genau wie die Darstellung der Farben, in einen Zeichenbefehl _GDIPlus_GraphicsFillEllipseMid() zusammenfassen
Tip: Viele IF´s durch eine logische Verknüpfung ersetzenWeiterhin verschwindet die Uhr bei mir nach Fensterwechsel unter anderen Fenstern und ist nicht mehr auffindbar....
Die Anzeige nur einmal in jeder Sekunde würde ich einfach per adlibregister("_draw",1000) lösen.
-
-
-
Hi,
genauer gesagt stehen beim Aufruf des DllCall´s auf dem Stack die Rücksprungadresse und dann nacheinander die Parameter der Funktion.
Damit nach dem Abarbeiten der Dll-Funktion das Programm den "Rückweg" in das AutoItscript findet, braucht es natürlich die richtige Adresse im Speicher (im AutoItscript die Adresse das nächsten Befehls nach dem DllCall)Beispiel1:
Das Programm ruft die DLL-Funktion mit cdecl auf. Es wird also die Rücksprungadresse und dann 3 Parameter INT (also zusammen 12 Byte) auf den Stack gepushed.
Nach Ablauf der Dll-Funktion (diese ist per cdecl deklariert) weiss der Compiler, dass das aufrufende Programm den Stack aufzuräumen hat und setzt ans Ende der Funktion ein einfaches RET.
Das aufrufende Programm (AutoIt) weiss nun, dass es die Dll mit cdecl aufgerufen hat, POP´t nun die 12Bytes vom Stack und findet dann dort die Rücksprungadresse. Alles glatt gelaufen
Beispiel2:
Das Programm ruft die DLL-Funktion mit cdecl auf. Es wird also die Rücksprungadresse und dann 3 Parameter INT (also zusammen 12 Byte) auf den Stack gepushed.
Nach Ablauf der Dll-Funktion (diese ist per stdcall deklariert) weiss der Compiler, dass das aufrufende Programm den Stack NICHT aufräumt und setzt ans Ende der Funktion ein RET 12. Dadurch werden die 12 Bytes vom Stack gePOPt!!!
Das aufrufende Programm (AutoIt) weiss nun, dass es die Dll mit cdecl aufgerufen hat, POP´t nun AUCH NOCH 12Bytes vom Stack und findet dann dort eine Rücksprungadresse. Und genau an diese Speicherstelle wird dann auch hingesprungen.....Irgendwo mitten in den Speicher, BÄÄM, crash... -
Hallo Lottich,
ZitatMuss ich dafür das Programm vom Server umschreiben, damit TCP funktionieren kann?
Ja, aber das ist nicht sonderlich schwer.
[autoit]
Schau dir doch mal die Client/Server-Beispielscripte aus der Hilfe an. BeimTCPRecv
[/autoit]findest du den Server, bei
[autoit]TCPSend
[/autoit]den Client.
[autoit]
In deinem konkreten Fall würde ich per TCP nur eine kurze Sequenz (es reicht ja ein einzelner Buchstabe) an den Server schicken. Dieser fragt in einer Schleife die "lokale Tastatur" und gleichzeitig den TCP-Puffer ab.If $Button1 or $tcprecv="B" Then _Function_Button1_pressed()
[/autoit] -
Hi,
die im SDK enthaltenen Beispiele (ok, bissl C sollte man LESEN können
) zeigen, wie das SDK benutzt wird.
Schau dir mal die im Ordner \ADL_SDK\inlude die *.h - Dateien an.
Mit einem AutoIt-10-Zeiler erhälst du aus der adl_defines.h sämtliche Konstanten.
Aus
[autoit]
wird$ADL_MAX_CHAR = 4096
[/autoit]uswusf.
Ein weiterer 10-Zeiler erstellt dir aus der adl_structures.h sämtliche Strukturen ( dllstructcreate("blablub") s. mein Posting oben)
Spoiler anzeigen
Code
Alles anzeigentypedef struct AdapterInfo { /// \ALL_STRUCT_MEM /// Size of the structure. int iSize; /// The ADL index handle. One GPU may be associated with one or two index handles int iAdapterIndex; /// The unique device ID associated with this adapter. char strUDID[ADL_MAX_PATH]; /// The BUS number associated with this adapter. int iBusNumber; /// The driver number associated with this adapter. int iDeviceNumber; /// The function number. int iFunctionNumber; /// The vendor ID associated with this adapter. int iVendorID; /// Adapter name. char strAdapterName[ADL_MAX_PATH]; /// Display name. For example, "\\Display0" for Windows or ":0:0" for Linux. char strDisplayName[ADL_MAX_PATH]; /// Present or not; 1 if present and 0 if not present.It the logical adapter is present, the display name such as \\.\Display1 can be found from OS int iPresent; // @} #if defined (_WIN32) || defined (_WIN64) /// \WIN_STRUCT_MEM /// Exist or not; 1 is exist and 0 is not present. int iExist; /// Driver registry path. char strDriverPath[ADL_MAX_PATH]; /// Driver registry path Ext for. char strDriverPathExt[ADL_MAX_PATH]; /// PNP string from Windows. char strPNPString[ADL_MAX_PATH]; /// It is generated from EnumDisplayDevices. int iOSDisplayIndex; // @} #endif /* (_WIN32) || (_WIN64) */wird zu
Spoiler anzeigen
[autoit]$adapterinfo = dllstructcreate("int iSize;"& _
[/autoit]
"int iAdapterIndex;"& _
"char strUDID[256];"& _
"int iBusNumber;"& _
"int iDeviceNumber;"& _
"int iFunctionNumber;"& _
"int iVendorID;"& _
"char strAdapterName[256];"& _
"char strDisplayname[256];"& _
"int iPresent;"& _
"int iExist;"& _
"char strDriverPath[256];"& _
"char strDriverPathExt[256];"& _
"char strPNPString[256];"& _
"int iOSDisplayIndex")
Solltest du mit dem Erstellen der Scripte um aus den *.h Dateien die AutoIt-#include-Dateien zu erzeugen schon Probleme haben, dann lass den Rest^^Die Funktionen und die zu übergebenden Datentypen sind u.a. in den HTML-Dateien im Ordner \public_documents\html beschrieben. (Start mit der HTML-Datei adl_sdk.html im Hauptordner)
Im SDK ist eigendlich alles enthalten, das heisst nicht umsonst SoftwareDevelopmentKit^^.Nachdem du die Strukturen erstellt hast, rufst du die Funktionen auf mit den Pointern auf die zu füllenden Structs und liest danach die gefüllten Structs aus.
Lies dir auch mal die ( sehr gut in Deutsch übersetzte) AutoIt-Hilfe durch, darin steht z.B. auch, dass DllCall´s ein Array zurückgeben.
[autoit]
die FunktionFunc _AtiADL_Temp()
[/autoit]
$ret = DllCall($Obj, "int", "ADL_PM_Temperature_Get", "int", "1000")
Return $ret
EndFuncwird also nie einen sinnvollen Wert zurückgeben
besser ist es so^^
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Memory.au3>;***********************************************
[/autoit] [autoit][/autoit] [autoit]
;sämtliche structs gehören in ein #include
$ADLtemperature = DllStructCreate("int iSize;int iTemperature")
DllStructSetData($ADLtemperature, "iSize", DllStructGetSize($ADLtemperature))$iNumberAdapters = 10 ; für 10 adapter platz machen^^
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $adapterinfostruct = DllStructCreate("byte[" & 1572 * $iNumberAdapters & "]");struct
Dim $adapterinfo[$iNumberAdapters]
For $i = 0 To $iNumberAdapters - 1
$adapterinfo[$i] = DllStructCreate("int iSize;" & _
"int iAdapterIndex;" & _
"char strUDID[256];" & _
"int iBusNumber;" & _
"int iDeviceNumber;" & _
"int iFunctionNumber;" & _
"int iVendorID;" & _
"char strAdapterName[256];" & _
"char strDisplayname[256];" & _
"int iPresent;" & _
"int iExist;" & _
"char strDriverPath[256];" & _
"char strDriverPathExt[256];" & _
"char strPNPString[256];" & _
"int iOSDisplayIndex", DllStructGetPtr($adapterinfostruct) + $i * 1572)
Next;***********************************************
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;und auch alle konstanten gehören in ein #include
Global Const $Obj = DllOpen("C:\WINDOWS\system32\atiadlxx.dll")
;errorhandling nicht vergessen
;***********************************************
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;und die Variablen;***********************************************
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;und auch alle Funktionen gehören in ein #include
;Function-Header nicht vergessen^^
Func ADL_init()
$struct = DllStructCreate("byte[1000]")
$ret = DllCall($Obj, "int:cdecl", "ADL_Main_Control_Create", "ptr", DllStructGetPtr($struct), "int", 1)
EndFunc ;==>ADL_initFunc ADL_Adapter_NumberOfAdapters_Get()
[/autoit] [autoit][/autoit] [autoit]
Local $numberofadapters = 0 ;dllstructcreate("int")
$ret = DllCall($Obj, "int:cdecl", "ADL_Adapter_NumberOfAdapters_Get", "int*", $numberofadapters)
Return $ret[1]
EndFunc ;==>ADL_Adapter_NumberOfAdapters_GetFunc ADL_Overdrive5_Temperature_Get($iAdapterIndexnr)
[/autoit] [autoit][/autoit] [autoit]
$ret = DllCall($Obj, "int:cdecl", "ADL_Overdrive5_Temperature_Get", "int", $iAdapterIndexnr, "int", 0, "ptr", DllStructGetPtr($ADLtemperature))
Return DllStructGetData($ADLtemperature, "iTemperature") ;in tausenstel grad
EndFunc ;==>ADL_Overdrive5_Temperature_GetFunc ADL_Get_Adapter_Info()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$ret = DllCall($Obj, "int:cdecl", "ADL_Adapter_AdapterInfo_Get", "ptr", DllStructGetPtr($adapterinfostruct), "int", $iNumberAdapters * 1572);DllStructGetSize($adapterinfostruct))
EndFunc ;==>ADL_Get_Adapter_Info;hier gehts dann los mit dem Programm
[/autoit] [autoit][/autoit] [autoit]
ADL_init()Global $iNumberAdapters = ADL_Adapter_NumberOfAdapters_Get()
[/autoit] [autoit][/autoit] [autoit]ADL_Get_Adapter_Info() ;füllt die struct $adapterinfo
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To $iNumberAdapters - 1 ;anzahl der adapter
[/autoit] [autoit][/autoit] [autoit][/autoit]
$iAdapterIndex = DllStructGetData($adapterinfo[$i], "iAdapterIndex");index aus der struct auslesen
$temperature = ADL_Overdrive5_Temperature_Get($iAdapterIndex) ;temperatur auslesen
MsgBox(262144, "Temperatur von Adapter Nr.: " & $iAdapterIndex, StringFormat("%.3f °Celsius", $temperature / 1000))
Next -
Hi,
ZitatIch finde wir sollten den Rekordversuch einfach wagen, sonst steht da noch in 10 Jahren dasselbe.
peethebee blende den Rekord bitte nich aus.setz doch um Gottes Willen einer den Counter auf >6 Milliarden, damit "endlich" ein neuer Rekord da steht....dann weiss auch der DÜMMSTE, dass JEDER Mensch auf der Welt in den letzten 24h auf AutoIt.de war...
-
...ich frag mich gerade was ich dem Finanzamt erzählen soll, wenn auf einmal hunderttausende von Euros von einigen "dankbaren Usern eines Internetforums" auf Konten mit meinem Namen eintrudeln

Viel besser, der "kleine Bruder" eines 14-Jährigen, welcher mir "dankbar" einen Euro überwiesen hat, drückt auf die Wahlwiederholtaste und legt das Telefon wieder auf den Tisch....
Zwei Wochen später schlägt hier eine stinksaure Mami im Forum ein und schreit " Geld zurück" und wedelt mit der 500€-Telefonrechnung und einem Anwaltschreiben.Nene, sowas braucht doch kein Mensch!
Wer vor lauter Dankbarkeit nicht mehr weiss wohin mit seinem Geld, der kann mir gerne eine PN schicken, ich komm dann vorbei und hol mir den Koffer voll Kohle ab!
-
edit voriger Post
-
Hi,
[autoit]#include <Array.au3>
[/autoit][autoit][/autoit][autoit]
Global Const $Obj = DllOpen( "C:\WINDOWS\system32\atiadlxx.dll" )
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Obj = ' & $Obj & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
;~ MsgBox(0,"dllopen", $Obj)$struct=dllstructcreate("byte[1000]");Speicher reservieren, wieviel?
[/autoit][autoit][/autoit][autoit]
$dllcall = DllCall( $Obj, "int:cdecl", "ADL_Main_Control_Create","ptr",dllstructgetptr($struct),"int",1);aufruf callConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $dllcall = ' & $dllcall & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
[/autoit][autoit][/autoit][autoit][/autoit]
_arraydisplay($dllcall); wenn 0 zurück, dann erfolgreich//EDIT//
Habe mal bissl rumgespielt, anhand des vorliegenden Scripts solltest du den Rest auch hinbekommenSpoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Memory.au3>
Global Const $Obj = DllOpen( "C:\WINDOWS\system32\atiadlxx.dll" )ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Obj = ' & $Obj & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
[/autoit] [autoit][/autoit] [autoit];~ MsgBox(0,"dllopen", $Obj)
[/autoit] [autoit][/autoit] [autoit];~ $dll=dllopen(@systemdir & "\atiadlxy.dll")
[/autoit] [autoit][/autoit] [autoit]
;~ $handle=dllcallbackregister("allocatememory","int_ptr","int")
;~ $ret=dllcall($dll,"int:cdecl","ADL_Main_Control_Create","ptr",dllcallbackgetptr($handle),"int",1)
;~ ;dllcallbackfree($handle);~ func allocatememory($i)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;~ _memglobalalloc($i)
;~ endfunc$struct=dllstructcreate("byte[1000]")
[/autoit] [autoit][/autoit] [autoit]$ret = DllCall( $Obj, "int:cdecl", "ADL_Main_Control_Create","ptr",dllstructgetptr($struct),"int",1)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
_arraydisplay($ret);ADL_Adapter_NumberOfAdapters_Get
[/autoit] [autoit][/autoit] [autoit]
$numberofadapters=0;dllstructcreate("int")
$ret = DllCall( $Obj, "int:cdecl", "ADL_Adapter_NumberOfAdapters_Get","int*",$numberofadapters)
_arraydisplay($ret)
$iNumberAdapters=$ret[1]
;~ if $iNumberAdapters=0 Then
;~ msgbox(0,"ADL_INFO","Keine Adapter gefunden! Programm Ende!")
;~ Exit
;~ endif;ADL_Display_Modes_Get
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;~ $iNumModes=0;dllstructcreate("int")
;~ $lpADLMode=0;dllstructcreate("int");~ $ret = DllCall( $Obj, "int:cdecl", "ADL_Display_Modes_Get","int",-1,"int",-1,"int*",$iNumModes,"int*",$lpADLMode)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;~ _arraydisplay($ret);~ typedef struct AdapterInfo
[/autoit] [autoit][/autoit] [autoit]
;~ {
;~ /// \ALL_STRUCT_MEM;~ /// Size of the structure.
[/autoit] [autoit][/autoit] [autoit]
;~ int iSize;
;~ /// The ADL index handle. One GPU may be associated with one or two index handles
;~ int iAdapterIndex;
;~ /// The unique device ID associated with this adapter.
;~ char strUDID[ADL_MAX_PATH];
;~ /// The BUS number associated with this adapter.
;~ int iBusNumber;
;~ /// The driver number associated with this adapter.
;~ int iDeviceNumber;
;~ /// The function number.
;~ int iFunctionNumber;
;~ /// The vendor ID associated with this adapter.
;~ int iVendorID;
;~ /// Adapter name.
;~ char strAdapterName[ADL_MAX_PATH];
;~ /// Display name. For example, "\\Display0" for Windows or ":0:0" for Linux.
;~ char strDisplayName[ADL_MAX_PATH];
;~ /// Present or not; 1 if present and 0 if not present.It the logical adapter is present, the display name such as \\.\Display1 can be found from OS
;~ int iPresent;;~ /// Exist or not; 1 is exist and 0 is not present.
[/autoit] [autoit][/autoit] [autoit]
;~ int iExist;
;~ /// Driver registry path.
;~ char strDriverPath[ADL_MAX_PATH];
;~ /// Driver registry path Ext for.
;~ char strDriverPathExt[ADL_MAX_PATH];
;~ /// PNP string from Windows.
;~ char strPNPString[ADL_MAX_PATH];
;~ /// It is generated from EnumDisplayDevices.
;~ int iOSDisplayIndex;$adapterinfostruct=dllstructcreate("byte["&1572*$iNumberAdapters&"]");struct
[/autoit] [autoit][/autoit] [autoit]dim $adapterinfo[$iNumberAdapters]
[/autoit] [autoit][/autoit] [autoit]for $i=0 to $iNumberAdapters-1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$adapterinfo[$i]=dllstructcreate("int iSize;"& _
"int iAdapterIndex;"& _
"char strUDID[256];"& _
"int iBusNumber;"& _
"int iDeviceNumber;"& _
"int iFunctionNumber;"& _
"int iVendorID;"& _
"char strAdapterName[256];"& _
"char strDisplayname[256];"& _
"int iPresent;"& _
"int iExist;"& _
"char strDriverPath[256];"& _
"char strDriverPathExt[256];"& _
"char strPNPString[256];"& _
"int iOSDisplayIndex",dllstructgetptr($adapterinfostruct)+$i*1572)
next$ret = DllCall( $Obj, "int:cdecl", "ADL_Adapter_AdapterInfo_Get","ptr",dllstructgetptr($adapterinfostruct),"int",dllstructgetsize($adapterinfostruct))
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
[/autoit] [autoit][/autoit] [autoit]
_arraydisplay($ret)for $i=0 to $iNumberAdapters
[/autoit] [autoit][/autoit] [autoit]
msgbox(0,"AdapterInfo Nr.:"&$i, "Size "&dllstructgetdata($adapterinfo[$i],1)&@crlf& _
"AdapterIndex "&dllstructgetdata($adapterinfo,2)&@crlf& _
"UDID "&dllstructgetdata($adapterinfo[$i],3)&@crlf& _
"BusNumber "&dllstructgetdata($adapterinfo[$i],4)&@crlf& _
"Devicenumber "&dllstructgetdata($adapterinfo[$i],5)&@crlf& _
"FunctionNumber "&dllstructgetdata($adapterinfo[$i],6)&@crlf& _
"VendorID "&dllstructgetdata($adapterinfo[$i],7)&@crlf& _
"AdapterName "&dllstructgetdata($adapterinfo[$i],8)&@crlf& _
"Displayname "&dllstructgetdata($adapterinfo[$i],9)&@crlf& _
"Present
"&dllstructgetdata($adapterinfo[$i],10)&@crlf& _
"Exist "&dllstructgetdata($adapterinfo[$i],11)&@crlf& _
"DriverPath "&dllstructgetdata($adapterinfo[$i],12)&@crlf& _
"DriverPathExt "&dllstructgetdata($adapterinfo[$i],13)&@crlf& _
"PNPString "&dllstructgetdata($adapterinfo[$i],14)&@crlf& _
"OSDisplayIndex "&dllstructgetdata($adapterinfo[$i],15))next
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];~ Functions
[/autoit] [autoit][/autoit] [autoit];~ int ADL_Adapter_Active_Set (int iAdapterIndex, int iStatus, int *lpNewlyActivate)
[/autoit]
;~ Function to set the current extended desktop mode status for a display.
;~ int ADL_Adapter_Active_SetPrefer (int iAdapterIndex, int iStatus, int iNumPreferTarget, ADLDisplayTarget *lpPreferTarget, int *lpNewlyActivate)
;~ Function to set the current extended desktop mode status for the display.
;~ int ADL_Adapter_Primary_Get (int *lpPrimaryAdapterIndex)
;~ Function to retrieve the primary display adapter index.
;~ int ADL_Adapter_Primary_Set (int iAdapterIndex)
;~ Function to set the primary display adapter index.
;~ int ADL_Adapter_ModeSwitch (int iAdapterIndex)
;~ Function to perform a mode switch for an adapter.
;~ int ADL_Display_Modes_Get (int iAdapterIndex, int iDisplayIndex, int *lpNumModes, ADLMode **lppModes)
;~ Function to retrieve the display mode information.
;~ int ADL_Display_Modes_Set (int iAdapterIndex, int iDisplayIndex, int iNumModes, ADLMode *lpModes)
;~ Function to set display mode information.
;~ int ADL_Display_PossibleMode_Get (int iAdapterIndex, int *lpNumModes, ADLMode **lppModes)
;~ Function to retrieve the OS possible modes list for an adapter (all OS platforms).
;~ int ADL_Display_ForcibleDisplay_Get (int iAdapterIndex, int iDisplayIndex, int *lpStatus)
;~ Function to retrieve the forcible connected status of a display.
;~ int ADL_Display_ForcibleDisplay_Set (int iAdapterIndex, int iDisplayIndex, int iStatus)
;~ Function to set the forcible connected status of a display.
;~ int ADL_Adapter_NumberOfActivatableSources_Get (int iAdapterIndex, int *lpNumSources, ADLActivatableSource **lppSources)
;~ Function to retrieve the number of Activatable sources based on ADL Index.
;~ int ADL_Adapter_Display_Caps (int iAdapterIndex, int *lpNumDisplayCaps, ADLAdapterDisplayCap **lppAdapterDisplayCaps)
;~ Function to retrieve the adapter display manner capabilities based on ADL index.
;~ int ADL_Display_DisplayMapConfig_Get (int iAdapterIndex, int *lpNumDisplayMap, ADLDisplayMap **lppDisplayMap, int *lpNumDisplayTarget, ADLDisplayTarget **lppDisplayTarget, int iOptions)
;~ Function to retrieve current display map configurations.
;~ int ADL_Display_DisplayMapConfig_Set (int iAdapterIndex, int iNumDisplayMap, ADLDisplayMap *lpDisplayMap, int iNumDisplayTarget, ADLDisplayTarget *lpDisplayTarget)
;~ Function to set the current display configuration.
;~ int ADL_Display_PossibleMapping_Get (int iAdapterIndex, int iNumberOfPresetMapping, ADLPossibleMapping *lpPresetMappings, int iEnquiryControllerIndex, int *lpNumberOfEnquiryPossibleMappings, ADLPossibleMapping **lppEnquiryPossibleMappings)
;~ Function to retrieve the possible display mappings.
;~ int ADL_Display_DisplayMapConfig_Validate (int iAdapterIndex, int iNumPossibleMap, ADLPossibleMap *lpPossibleMaps, int *lpNumPossibleMapResult, ADLPossibleMapResult **lppPossibleMapResult)
;~ Function to validate the list of the display configurations based on ADL Index.
;~ int ADL_Display_DisplayMapConfig_PossibleAddAndRemove (int iAdapterIndex, int iNumDisplayMap, ADLDisplayMap *lpDisplayMap, int iNumDisplayTarget, ADLDisplayTarget *lpDisplayTarget, int *lpNumPossibleAddTarget, ADLDisplayTarget **lppPossibleAddTarget, int *lpNumPossibleRemoveTarget, ADLDisplayTarget **lppPossibleRemoveTarget)
;~ Function to validate a list of display configurations.
;~ int ADL_Display_SLSGrid_Caps (int iAdapterIndex, int *lpNumSLSGrid, ADLSLSGrid **lppSLSGrid, int iOption)
;~ Function to get the current supported SLS grid patterns (MxN) for a GPU.
;~ int ADL_Display_SLSMapIndexList_Get (int iAdapterIndex, int *lpNumSLSMapIndexList, int **lppSLSMapIndexList, int iOptions)
;~ Function to get the active SLS map index list for a given GPU.
;~ int ADL_Display_SLSMapIndex_Get (int iAdapterIndex, int iADLNumDisplayTarget, ADLDisplayTarget *lpDisplayTarget, int *lpSLSMapIndex)
;~ Function to get the SLS map index for a given adapter and a given display device.
;~ int ADL_Display_SLSMapConfig_Get (int iAdapterIndex, int iSLSMapIndex, ADLSLSMap *lpSLSMap, int *lpNumSLSTarget, ADLSLSTarget **lppSLSTarget, int *lpNumNativeMode, ADLSLSMode **lppNativeMode, int *lpNumBezelMode, ADLBezelTransientMode **lppBezelMode, int *lpNumTransientMode, ADLBezelTransientMode **lppTransientMode, int *lpNumSLSOffset, ADLSLSOffset **lppSLSOffset, int iOption)
;~ Function to retrieve an SLS configuration.
;~ int ADL_Display_SLSMapConfig_Create (int iAdapterIndex, ADLSLSMap SLSMap, int iNumTargetTarget, ADLSLSTarget *lpSLSTarget, int iBezelModePercent, int *lpSLSMapIndex, int iOption)
;~ Function to create an SLS configuration.
;~ int ADL_Display_SLSMapConfig_Delete (int iAdapterIndex, int iSLSMapIndex)
;~ Function to delete an SLS map from the driver database.
;~ int ADL_Display_SLSMapConfig_SetState (int iAdapterIndex, int iSLSMapIndex, int iState)
;~ Function to enable/disable SLS bind.
;~ int ADL_Display_SLSMapConfig_Rearrange (int iAdapterIndex, int iSLSMapIndex, int iNumDisplayTarget, ADLSLSTarget *lpSLSTarget, ADLSLSMap slsMap, int iOption)
;~ Function to rearrange display orders in an SLS map.
;~ int ADL_Display_PossibleMode_WinXP_Get (int iAdapterIndex, int iNumDisplayTargets, ADLDisplayTarget *lpDisplayTargets, int iLargeDesktopSupportedType, int iDevicePanningControl, int *lpNumModes, ADLMode **lppModes)
;~ Function to retrieve the ATI possible modes list for an adapter and preset mapping (Windows XP).
;~ int ADL_Display_BezelOffsetSteppingSize_Get (int iAdapterIndex, int *lpNumBezelOffsetSteppingSize, ADLBezelOffsetSteppingSize **lppBezelOffsetSteppingSize)
;~ Get bezel offset stepping size for the input adapter.
;~ int ADL_Display_BezelOffset_Set (int iAdapterIndex, int iSLSMapIndex, int iNumBezelOffset, LPADLSLSOffset lpBezelOffset, ADLSLSMap SLSMap, int iOption)
;~ Set SLS bezel offsets for each display index.
;~ int ADL_Display_BezelSupported_Validate (int iAdapterIndex, int iNumPossibleSLSMap, LPADLPossibleSLSMap lpPossibleSLSMaps, int *lpNumPossibleSLSMapResult, LPADLPossibleMapResult *lppPossibleMapResult)
;~ Validate the list of the SLS display configurations to determine if bezel is supported or not. -
Hi,
Zitat von Njahsdas Script funktioniert aber (bei der Bsp.dtx).
Das Script funktioniert nicht nur bei der Beispieldatei, sondern bei allen dtx-files, die nach diesem Schema aufgebaut sind.
Die Hauptarbeit ist gemacht, die Breite und Höhe der Bitmap liest man aus dem Header aus, man sollte wissen, wie 512 als Hexadezimalzahl geschrieben wird.
Ich denke, das muss man auch von einem absoluten Newbie erwarten
Wer nicht in der Lage ist, den Windows-Taschenrechner zu bedienen, der hat auch bei AutoIt nichts verloren...ZitatKönnte man es dynamisch machen, sprich,
dass man das Script nicht für jede
andere DTX neu machen muss?kapier ich nicht....ich hab das mit ca. 10 DTX-files getestet, funzt einwandfrei
Zitat von protexhabe auch nicht den gesamten Post verstanden
kein Problem^^
Zitataber dieses Script ist wohl nur darauf angepasst auf eine dtx die nach einem Bestimmten Muster aufgebaut ist
falsch s.o., wie gesagt, etwas Eigeninitiative erwarte ich einfach, um solche Kleinigkeiten wie Breite und Höhe aus einer Datei auszulesen.
Zitatum das ganze Dynamisch zu machen musst du glaube ich eine Menge zeit investieren..
hat mich insgesamt bisher eine halbe bis dreiviertel Stunde gekostet, wer das nicht investieren will/kann, der braucht auch definitiv keinen DTX-Viewer in AutoIt!
-
Zitat
Hätte nicht gedacht, dass sich jemand die Mühe macht.
hehe, ich auch nicht, wobei trotz der Vorlage bestimmt noch ne Anfrage kommt, "den Arm aus der Sonne zu legen"!
Wette? -
Nö, Augen aufgemacht und bissl geguckt^^
"Begnadet" würde ich das nicht nennen, aber wissen, wonach man suchen muss
-
[autoit]
stringtobinary()
[/autoit]
binarytostring() -
Hi,
hab da mal etwas zusammengebastelt, ist native AutoIt, aber zum Verstehen reichts....Zunächst mal habe ich mir die .DTX-Datei in Scite angeschaut, und eine "Struktur" und einen Header erkannt. Ist keine "Struktur" zu erkennen, wirds arbeitsintensiv, aber das war im vorliegenden Fall glücklicherweise nicht so
[autoit]
DTX in einen Hexeditor geladen, sah man den Header schon sehr deutlich, und auch die "Struktur" kam wesentlich besser raus.
Immer 8 Bytes waren durch "FFFF00000000" getrennt, also schnell AutoIt angeworfen und folgende Zeilen eingetippt:#include <Array.au3>
[/autoit]
$a=stringtobinary(fileread("beispiel.dtx"))
$array=stringsplit($a,"FFFF000000000000",3)
_arraydisplay($array)
Klasse, der Header war von den Daten getrennt, und 20480 mal hatte ich 8 Bytes, das mussten die Bilddaten sein!Dann habe ich mir mit PushTheButton (hehe, Eigenwerbung darf sein) im DTX-Viewer mal die ersten Pixel angeschaut, sowie die Größe der Bitmap (512x512) bestimmt.
Das Pixel oben links hat RGB 0x202220, aus der DTX-Datei (das ArrayDisplay() ) kamen die "Pixeldaten" 0x242104216AA92901
Das hab ich mir dann mit Hilfe des Windows-Taschenrechners BITWEISE angeschaut
0x202220 = 0010 0000 0010 0010 0010 0000 soweit sogut...
Weiterhin erkennt man aus dem Arraydisplay(), dass die vorderen 4 Bytes sehr "regelmässig" sind und oft widederholt werden , während die hinteren 4 bytes völlig unstrukturiert sind.Also schaut man sich die vorderen 4 Bytes aus dem Arraydisplay mal an
0x24210421 ergibt binär = 0010 0100 0010 0001 0000 0100 0010 0001Wer nun in Reverse Engeneering etwas Übung hat, "findet" nun Übereinstimmungen:
0010 00 und
100000 und
00100 aus 0x202220 ist in
0010 0100 0010 0001 0000 0100 0010 0001 enthalten
Hehe, das ist die von mir auch in Deskstream verwendete 565 Kodierung, um aus einer 32-Bit-Farbe eine 16 Bit-Farbe zu machen

Also sind die ersten 4 Bytes aus dem Arraydisplay zwei "Farben RGB"
Und die anderen 4 Bytes (32Bit)?
Naja, die Grafik hat 512x512 Pixel also muss es zwangsläufig noch andere "Pixel" geben, das Arraydisplay zeigt ja nur 20480x2 Pixel anSchaut man sich die Pixelfarben im Viewer an, dann erkennt man, dass in 4x4-Pixelblöcken nur maximal 4 verschiedene Farben vorkommen....
4x4 Pixel a nur 4 Farben, hehe, der Kenner weiss sofort, dass die 4 Zahlen 0 bis 3 binar in 2 Bit passen
Das heisst, in den 32 Bit stehen 16x2 Bit, also 16 (ist genau 4x4 Pixel^^) mal 2 Bit (4 Farben), claro?Die 32 Bit beschreiben also die "Farben" (wie eine Lookup-Tabelle) des 4x4 Pixelblocks.
Aufschreiben hilft^^
Wie erhält man 4 Farben aus 2 Farben? Naja, man interpoliert die beiden Farben "zwischen" den beiden bekannten Farben.
Anhand der Lookup-Tabelle (den 32Bit hinter den 2x16Bit Farben im Arraydisplay) kann man nun den 4x4 Pixelblock zusammensetzen.So kompliziert hab ich mirs nicht gemacht, ich hab nur aus dem ersten bekannten "Pixel" (also den ersten 2 Byte=16Bit) aus dem Arraydisplay die Farbe extrahiert und in eine Grafik geschrieben^^
Da statt 16 Pixel nur 1 Pixel gezeichnet wird, verkleinert sich natürlich die Grafik.
Zum Erkennen reichts jedenfalls, wer die "Orginalgröße" braucht, kann entweder alle 16 Pixel in einem 4x4er Block berechnen oder einfach per "StretchBlt()" die Grafik vergrössern
Die "Größe" (512x512) der Grafik holt man sich aus dem Header, woher sonst, viel Spass dabei, kompliziert ist das nicht^^
Anzeige-Script für Beispiel.DTX:
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>
#include <StructureConstants.au3>$a = StringToBinary(FileRead("beispiel.dtx"))
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$array = StringSplit($a, "FFFF000000000000", 3)
_ArrayDisplay($array);leere Bitmap erstellen
[/autoit] [autoit][/autoit] [autoit]
Global $iwidth = 512 / 4, $iheight = 512 / 4, $ptr, $hbmp
$DC_bmp = _CreateNewBmp32($iwidth, $iheight, $ptr, $hbmp);struct an der Position der Bitmap im Speicher, um die "Pixel" schreiben zu können
[/autoit] [autoit][/autoit] [autoit]
$struct = DllStructCreate("dword[" & $iwidth * $iheight & "]", $ptr);Bitmap beschreiben mit Daten aus Arraydisplay
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To UBound($array) - 1
;bytes in die richtige Reihenfolge bringen
$col565_1 = StringLeft($array[$i], 2)
$col565_2 = StringMid($array[$i], 3, 2)
$col565 = Dec($col565_2 & $col565_1) ;16Bit-Farbe
;aus 16 Bit 565RGB nun 888RGB machen
$r = Hex(BitShift(BitAND($col565, 0xF800), 8), 2)
$g = Hex(BitShift(BitAND($col565, 0x7E0), 3), 2)
$b = Hex(BitShift(BitAND($col565, 0x1F), -3), 2)$col = Dec($r & $g & $b) ;32Bit-Farbe
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
DllStructSetData($struct, 1, $col, $i)
Next;gui
[/autoit] [autoit][/autoit] [autoit]
$hgui = GUICreate("DTX-Viewer", $iwidth, $iheight)
GUISetState()
$DC_gui = _WinAPI_GetDC($hgui);bitmap in Gui blitten, ggf stretchblt um volle grösse anzuzeigen
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_BitBlt($DC_gui, 0, 0, $iwidth, $iheight, $DC_bmp, 0, 0, 0xCC0020)While GUIGetMsg() <> -3
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
WEndFunc _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe $HDC und $ptr und handle auf die Bitmapdaten
[/autoit] [autoit][/autoit] [autoit]
$hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
$tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iwidth)
DllStructSetData($tBMI, "Height", -($iheight)) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
$adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0) ;$DIB_RGB_COLORS = 0
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>_CreateNewBmp32Func _DeleteBitmap32($DC, $ptr, $hbmp)
[/autoit] [autoit][/autoit] [autoit][/autoit]
_WinAPI_DeleteDC($DC)
_WinAPI_DeleteObject($hbmp)
$ptr = 0
EndFunc ;==>_DeleteBitmap32 -
ja, die gesamte Umwandelei DIB/DDB und vv kostet einfach Zeit(wenn es auch nur einige zehntel ms sind....)
Aber das ist nichtmal das große Problem. 400.000 Bytes in nicht mal einer halben Sekunde aus dem Speicher auszulesen finde ich für eine Scriptsprache schon beachtlich.
Was im Testscript aber überhaupt nicht beachtet wird ist die Weiterverarbeitung. Wo sollen denn die einzelnen Pixel hin? In ein Array?
Irgend etwas soll ja damit passieren, einfach nur "auslesen" ist imho sinnlos, dann stehen die "Pixel" nur doppelt im Speicher.
Und bearbeiten? Ggf. lesen/schreiben? Das mag für einige Handvoll Pixel noch machbar sein, aber bei großen Datenmengen, also FullHD, reden wir mal schnell über 1920x1080x4=8,3MB
Für das Auslesen der "Pixel" braucht AutoIt dann 15 Sekunden, der Bitblt 5ms, insgesamt 0,06FPS
Per C oder ASM relativiert sich das, auslesen+bearbeiten 10ms, Blit 5ms, insgesamt 66FPSDatenbewegungen/Bearbeitungen per GDI laufen natürlich innerhalb des Videospeichers wesentlich schneller ab, als vom Hauptspeicher(über den Bus+Treiber) in den Videospeicher.
Daher ist auch ein "Blit" (nichts anderes als ein memcopy) zwischen zwei DC´s im Videomemory viel schneller als ein Blit von einem DC im Hauptspeicher in den DC im Videospeicher.