1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • User status

    • Andy
    • 14. Juli 2010 um 21:39
    Zitat

    denn wer 1000 Post´s hat, wir wohl nicht 1000 mal Bulshit gepostet haben.

    doch, genau so siehts aus, verfolge die laufenden Threads und die Shoutbox über den Zeitraum eines Tages und du wirst massig "Bullshit" lesen. Mittlerweile wird es so viel, daß unser ehrenwerter Forenhäuptling einige User für einen bestimmten Zeitraum gebant hat. Verwarnungen gibts auch schon einige....
    Also bemüht euch, hier nicht allzuviel hochgradig geistigen Dünnschi** von euch zu geben, dafür gibts doch gerade im Web 2.0 genug andere Anlaufstellen^^

  • Probleme auf fremdem Rechner

    • Andy
    • 14. Juli 2010 um 17:45

    Mal ganz radikal gesagt, wer in der Lage ist 2000 Zeilen Scripte als Unternehmenssoftware zu erstellen und dann in einem Forum mit nichts anderem als

    Zitat

    wenn ichs auf nem anderen Rechner versuche fliegen überall Errors.

    nach Hilfe sucht, den halte ich für lächerlich.
    Hier posten 14-Jährige detailliertere Fehlermeldungen und machen sich selbst schon Gedanken, an welche Stellen es in ihrem Programm hapern könnte. Niemand verlangt, ein 2000 Zeilen Script einzustellen, da ist das Debuggen m.E. schon nur noch mit finanzieller Aufwandentschädigung machbar. Aber eine Kopie der Fehlermeldungen oder die wichtigsten Debug-Tracelines muss man von einem hauptberuflichen "Programmierer" nicht erwarten, sondern verlangen!

  • Pixel eines Bildes auslesen ohne es darzustellen

    • Andy
    • 13. Juli 2010 um 17:46

    Kein Thema :)
    Wenn du WIRKLICH unter die Hardliner gehen willst, dann mußt du den String=Dateiinhalt nichtmal laden, sondern kannst nur ein einzelnes Byte direkt aus der Datei lesen.
    Vergleich: Pixelfarbe lesen mit GDI+ dauert ca 25x länger auf meinem Rechner! Vorteil hierbei, bei Bitmaps, welche Farbtabellen mitliefern, ist die Umwandlung in RGB inclusive. Wobei man beim direkten Lesen der Bytes bei "normalen" BMP´s die Farbe direkt aus der Struct auslesen kann, also 25x schneller ist somit eine Ansage, wenn es auf Geschwindigkeit ankommt!

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $t=timerinit()
    $tBuffer = DllStructCreate("byte") ;ein Byte Speicherverbrauch für die Farbe...verkraftbar :o)
    local $nbytes ;variable byref anzahl gelesener bytes aus der datei
    $hfile = _WinAPI_CreateFile("bg_1.bmp",2,2) ;Datei lesend öffnen
    $x = 243
    $y = 87

    [/autoit] [autoit][/autoit] [autoit]

    $t=timerinit()
    _WinAPI_SetFilePointer($hfile,640 * 482 - 640 * $y + $x + 1078) ;filepointer auf position des bytes setzen
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tBuffer), 1, $nBytes) ;byte lesen
    $color=dllstructgetdata($tbuffer,1)
    $m=timerdiff($t)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $color = ' & $color & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _WinAPI_CloseHandle($hFile)

    [/autoit] [autoit][/autoit] [autoit]

    ;gdi+, 20x langsamer, aber liefert dafür die farbe direkt in RGB
    _GDIPlus_Startup ()
    $hbitmap=_GDIPlus_ImageLoadFromFile("bg_1.bmp")
    ;global $ghGDIPDLL=dllopen("gdi_plus.dll")
    $t=timerinit()
    $color=hex(_GDIPlus_GetPixel($hbitmap,$x,$y),6)
    $m=timerdiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $color = ' & $color & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GDIPlus_GetPixel($hBitmap,$X,$Y)
    ; Prog@ndy
    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

    [/autoit]

    /edit/ ohne winapi

    [autoit]

    $x=243
    $y=87

    [/autoit][autoit][/autoit][autoit]

    $hfile=fileopen("bg_1.bmp",16)
    filesetpos($hfile,640 * 482 - 640 * $y + $x + 1078,0)
    $col=dec(hex(fileread($hfile,1)))
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $col = ' & $col & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    fileclose($hfile)

    [/autoit]
  • API für *.AMR Dateien?

    • Andy
    • 12. Juli 2010 um 21:03

    BugFix , seh das einfach so:
    In der Zeit, in der er mit einem Disassembler die Parameter der Funktionen der dll analysiert, stellt er hier keine Fragen. Und danach hat er soviel Ahnung, dann stellt er erst recht keine Fragen. ^^
    Das sollte eigentlich das Ziel sein....
    Im Umkehrschluss heisst das aber auch, wenn er trotz dieses genialen Tips dauernd Fragen stellt, läuft es darauf hinaus dass er jemanden sucht, der ihm die Arbeit abnimmt. Und da kommst DU dann wieder ins Spiel ;)

  • Pixel eines Bildes auslesen ohne es darzustellen

    • Andy
    • 12. Juli 2010 um 17:05
    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GDIPlus.au3>
    $bytes = FileRead("bg_1.bmp") ;alle Bytes lesen

    [/autoit] [autoit][/autoit] [autoit]

    $width = 640 ;breite bmp
    $height = 482 ;höhe bmp

    [/autoit] [autoit][/autoit] [autoit]

    Dim $array[483][641] ;array für alle pixel

    [/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    For $x = 1 To 640 ;x-koordinate pixel
    For $y = 1 To 482 ;y-koordinate pixel
    $array[$y][$x] = Hex(Asc(StringMid($bytes, $width * $height - $width * $y + $x + 1078, 1)), 2) ;farbe in hex
    Next
    Next
    $m = TimerDiff($t)
    MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @LF & '$m' & @LF & @LF & 'Return:' & @LF & $m) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($array)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()
    ;bissl GDI
    $hgui = GUICreate("Bildermaler", 640, 482)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui)
    GUISetState()
    For $x = 1 To 640 ;x-koordinate pixel
    For $y = 1 To 482 ;y-koordinate pixel
    Switch $array[$y][$x] ;den "Farben" in der Datei die richtigen Farbcodes zuweisen
    Case "00"
    $color = 0xFF000000
    Case "01"
    $color = 0xFFFF0000
    Case "02"
    $color = 0xFF00FF00 ;ich hab die hier mal grün gemacht^^
    Case "03"
    $color = 0xFFFFFFFF
    EndSwitch
    $hpen = _GDIPlus_PenCreate($color)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $x, $y, 1, 1, $hpen)
    _GDIPlus_PenDispose($hpen)
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Until GUIGetMsg() = -3

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;die formel für die farbe lautet also
    $color = Hex(Asc(StringMid($bytes, 640 * 482 - 640 * $y + $x + 1078, 1)), 2)

    [/autoit]

    sodele, nun funktionierts
    Du musst beachten, daß die Farben noch nicht "transformiert" sind, dafür sind die 1024 Byte Farbtabelle da. Ich habe im "Bildermaler" die Farbcodes aus der Datei, z.B. 03 mal in weiß, und den Farbcode 01 der Farbe Rot zugeordnet

    ;Hausaufgabe für dich!
    ;Erstelle Anhand der Daten im Header eine allgemeine Formel, um aus jeder *.BMP-Datei die Farbe eines Pixels mit gegebener x- und y-Koordinate herauszufinden^^

    //edit// Noch nen "Bildermaler" hinzugefügt^^ . Das geht natürlich mit bitblt Millionen mal schneller, aber so sieht man was passiert

  • Pixel eines Bildes auslesen ohne es darzustellen

    • Andy
    • 12. Juli 2010 um 08:18

    sry, Fehler von mir!^^
    Die bmp-Datei wird idR "Bottom Up" gespeichert, d.h. die unterste Zeile als erstes usw...Diese Info erhält man aus dem Header.
    Ich ändere das Script im laufe des Tages ab, so dass es bei dir "passt"

  • C#-DLL in AutoIt einbinden

    • Andy
    • 10. Juli 2010 um 13:49

    Ich ziehe den Thread mal berechtigterweise nach oben (sowas gehört STICKY!), da in letzter Zeit schon mehrfach nach Einbindung "fremder" DLL´s gefragt wurde.
    @RAPTOR-ONE, VB bzw .Net würde ich auch noch in den Titel mit aufnehmen^^

    Ich selbst drifte gerade zw. VB.net(Visual Studio), Assembler und AutoIt hin und her, und muß zugestehen, Assembler bzw damit erstellte DLL´s benutze ich nur noch "just for Fun", oder wenn es wirklich auf das letzte bisschen Speed ankommt.Was zugegebenermaßen nicht sehr oft vorkommt, da VB.net von der Geschwindigkeit betrachtet in etwa so schnell ist wie C#.
    Gerade für das Problem 32Bit-DLL´s auf 64Bit-Systemen (und umgekehrt) sehe ich da Hoffnung, da nur noch eine DLL kompiliert werden muss....

  • Priority Queue

    • Andy
    • 8. Juli 2010 um 14:37

    Hi,
    habe dazu auch mal etwas gebastelt, sogar mit grafischer Darstellung^^
    Im Prinzip werden die Ereignisse in eine nach Prioritäten (0 bis 9, höchste Priorität ist 0) sortierte Liste eingetragen.
    Dann hatte ich 2 Ansätze, um diese Liste (welche immer wieder aufgefüllt wird) abzuarbeiten.

    1. Ansatz: Das Ereignis mit der höchsten Priorität wird auch als erstes abgearbeitet. Ist keins vorhanden, dann das Ereignis mit der nächst niedrigeren Priorität. Ist zwischenzeitlich wieder ein Ereignis mit höherer Priorität eingetroffen, wird das zuerst abgearbeitet.
    Vorteil: Ereignisse mit hoher Priorität werden sehr schnell abgearbeitet, da sie "ganz oben" in der Liste stehen, Die Liste wird in jedem durchlauf von oben nach unten abgearbeitet.
    Nachteil: Das letzte Ereignis mit der niedrigsten Priorität braucht sehr lange, bis es abgearbeitet ist.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;stures abarbeiten der Liste, Ereignisse mit höherer Priorität werden zuerst abgearbeitet

    [/autoit] [autoit][/autoit] [autoit]

    global $debug=0 ;debug=0 , script läuft ohne Msgboxen und arraydisplays
    ;priority queue
    ;tabelle mit Ereignissen einer bestimmten Priorität
    ;
    ;Es gibt Prioritäten von 0 bis 9
    ; 0 hat die höchste Priorität
    Dim $queue[10][1000] ;maximal 1000 Ereignisse pro Priorität
    ;
    ;[priorität] [0]=Anzahl der ereignisse [1 bis n]=Ereignisse
    ; 0 [0]=3 [1]=Ereignis_33 [2]=ereignis_855 [3]=ereignis_1456
    ; 1 [0]=4 [1]=Ereignis_345 [2]=ereignis_98 [3]=ereignis_5 [4]=Ereignis_44
    ; 2 [0]=2 [1]=Ereignis_45 [2]=ereignis_686
    ; 3 [0]=5 [1]=Ereignis_45 [2]=ereignis_686 [3]=Ereignis_745 [4]=ereignis_798 [5]=ereignis_8055
    ;uswusf
    ;

    [/autoit] [autoit][/autoit] [autoit]

    Dim $progress[10] ;10x progress-control
    Local $ereignis ;ereigniszähler

    [/autoit] [autoit][/autoit] [autoit]

    $hgui = GUICreate("Priority queue")
    For $i = 0 To 9 ;progressbars erstellen
    $progress[$i] = GUICtrlCreateProgress(20, $i * 30 + 30, 300, 25)
    Next
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ;liste mit zufälligen ereignissen füllen
    For $zufall = 1 To 200 ;Zufällige Anzahl der kommenden Ereignisse
    $ereignis += 1 ;es kommt ein Ereignis...
    $prio = Random(0, 9, 1) ;mit einer priorität....
    _fillqueue($prio, $ereignis) ;ereignis in liste eintragen
    Next

    [/autoit] [autoit][/autoit] [autoit]

    if $debug then _arraydisplay($queue)

    [/autoit] [autoit][/autoit] [autoit]

    $lastereignis = 0 ;letzte ereignisnummer
    $random = 3
    $schnitt=0 ;Durchschnittliche Anzahl der Ereignisse, bis ein Ereignis höchster Priorität (0) abgearbeitet wurde
    $lastitem = $queue[9][$queue[9][0]] ;letztes Ereignis in der gesamten liste
    ;MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$lastitem' & @lf & @lf & 'Return:' & @lf & $lastitem) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit]

    Do ;prioritätenliste abarbeiten

    [/autoit] [autoit][/autoit] [autoit]

    ;~ For $zufall = 1 To Random(1, $random, 1) ;Zufällige Anzahl der kommenden Ereignisse
    $ereignis += 1 ;es kommt ein Ereignis...
    $prio = Random(0, 9, 1) ;mit einer priorität....
    _fillqueue($prio, $ereignis) ;ereignis in liste eintragen
    ;~ Next
    ;_ArrayDisplay($queue)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ _readqueue(0) ;das dringenste Ereignis auslesen
    ; _readqueue(Random(5, 9, 1)) ;auch die weniger dringenden Ereignisse müssen irgendwann abgearbeitet werden
    winsettitle($hgui,"",$queue[9][1]&" "&$lastitem)
    ;ab hier nur Statistik-Geplänkel, wann erreicht das letzte item der liste die erste position?
    If $ereignis > 100000 Then
    $ereignis = 0
    $lastereignis = 0
    $schnitt=0
    EndIf
    if stringright($queue[0][1],2)="_0" then $schnitt+=1
    If $queue[9][1] = $lastitem Or $queue[1][1] = $lastitem Then ;das letzte Item aus der Liste hat es bis zum löschen geschafft
    MsgBox(0, "priority queue","Anzahl der Durchläufe, bis das letzte Ereigniss der niedrigsten Priorität (9) aus der Liste gelöscht wurde: "& $ereignis - $lastereignis & @crlf & _
    "Durchschnittliche Anzahl der Ereignisse, bis ein Ereignis höchster Priorität (0) abgearbeitet wurde : "&(($ereignis - $lastereignis)/$schnitt) & @crlf & _
    "Anzahl der Ereignisse mit der höchsten Priorität gesamt: "&$schnitt)
    $schnitt=0
    $lastereignis = $ereignis
    For $i = 9 To 0 Step -1
    If $queue[$i][0] = 0 Then ContinueLoop
    $lastitem = $queue[$i][$queue[$i][0]] ;letztes Item aus der liste holen
    ExitLoop
    Next
    ;~ MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$lastitem' & @lf & @lf & 'Return:' & @lf & $lastitem) ;### Debug MSGBOX
    ;~ _arraydisplay($queue)
    ;_ArrayDisplay($queue)
    EndIf
    _readqueue(0) ;das dringenste Ereignis auslesen
    ;Until guigetmsg()*Sleep(10) = -3
    Until guigetmsg() = -3

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _fillqueue($prio, $ereignis) ;queue mit ereignissen einer bestimmten priorität füllen
    $queue[$prio][0] += 1 ;Anzahl der Ereignisse in der bestimmten Priorität um eins erhöhen
    $queue[$prio][$queue[$prio][0]] = "Ereignis_" & $ereignis &"_prio_"&$prio;Ereignis an die letzte Position in der Kette schreiben
    GUICtrlSetData($progress[$prio], $queue[$prio][0])
    EndFunc ;==>_fillqueue

    [/autoit] [autoit][/autoit] [autoit]

    Func _readqueue($prio) ;ereignis einer bestimmten Priorität aus der Liste holen
    ; $time=timerinit()
    Local $ereignis
    For $i = $prio To UBound($queue, 1) - 1 ;prioritäten und alle weiteren mit geringerer priorität
    ;~ If $queue[0][0] = 0 Then ;die erste prioritätenreihe ist leer, alle anderen Prioritäten eins nach "unten" rutschen
    ;~ if $debug then Msgbox(0,"priority queue","in der folgenden liste sieht man, wie die prioritäten eine zeile weiter nach unten sortiert wurden",3)
    ;~ ;_ArrayDisplay($queue)
    ;~ For $t = 0 To 8 ;alle prioritäten eins nach unten, aus [1] wird [0] aus [2] wird [1] usw
    ;~ For $f = 0 To $queue[$t + 1][0]
    ;~ $queue[$t][$f] = $queue[$t + 1][$f]
    ;~ Next
    ;~ If $t < 8 Then ;die ereignisse mitsortieren
    ;~ For $f = $queue[$t + 2][0] To $queue[$t + 1][0]
    ;~ $queue[$t + 1][$f] = 0
    ;~ Next
    ;~ EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Next
    ;~ For $f = $queue[9][0] To 0 Step -1 ;letzte reihe löschen
    ;~ $queue[9][$f] = 0
    ;~ Next
    ;~ if $debug then _ArrayDisplay($queue)
    ;~ EndIf

    [/autoit] [autoit][/autoit] [autoit]

    if $debug then _ArrayDisplay($queue)
    If $queue[$i][0] = 0 Then ContinueLoop ;es sind keine ereignisse vorhanden, nächste Priorität

    [/autoit] [autoit][/autoit] [autoit]

    $ereignis = $queue[$i][1] ;erstes ereignis einer priiorität aus der liste holen
    For $anz = 2 To $queue[$i][0] + 1 ;ereignisse der priorität ein feld weiter nach unten schieben
    $queue[$i][$anz - 1] = $queue[$i][$anz]
    Next
    $queue[$i][0] -= 1 ;anzahl der ereignisse in der liste um eins verkleinern
    GUICtrlSetData($progress[$i], $queue[$i][0])
    ExitLoop ;ereignis gefunden
    Next
    ;~ $l=timerdiff($time)
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $l = ' & $l & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    Return $ereignis

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_readqueue

    [/autoit]

    2. Ansatz: Es wird immer nur das Ereignis mit der höchsten Priorität abgearbeitet!
    Gibt es nun kein Ereignis mit der höchsten Priorität mehr, dann werden alle Ereignisse in ihrer Priorität eine Stufe erhöht d.h. aus 1 wird 0 , aus 2 wird 1 usw
    Vorteil: Das letzte Element mit der niedrigsten Priorität wird sehr schnell erreicht! D.h. auch Niedrige Prioritäten werden schnell berücksichtigt.
    Nachteil: Neue Elemente mit höchster Priorität müssen im schlechtesten Fall etwas warten, bis die "aufgerückten" Elemente abgearbeitet sind

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    global $debug=0 ;debug=0 , script läuft ohne Msgboxen und arraydisplays, debug=1 für info´s
    $speed=1 ;zum beschleunigen speed=0

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;priority queue
    ;tabelle mit Ereignissen einer bestimmten Priorität
    ;
    ;Es gibt Prioritäten von 0 bis 9
    ; 0 hat die höchste Priorität
    Dim $queue[10][1000] ;maximal 1000 Ereignisse pro Priorität
    ;
    ;[priorität] [0]=Anzahl der ereignisse [1 bis n]=Ereignisse
    ; 0 [0]=3 [1]=Ereignis_33 [2]=ereignis_855 [3]=ereignis_1456
    ; 1 [0]=4 [1]=Ereignis_345 [2]=ereignis_98 [3]=ereignis_5 [4]=Ereignis_44
    ; 2 [0]=2 [1]=Ereignis_45 [2]=ereignis_686
    ; 3 [0]=5 [1]=Ereignis_45 [2]=ereignis_686 [3]=Ereignis_745 [4]=ereignis_798 [5]=ereignis_8055
    ;uswusf
    ;

    [/autoit] [autoit][/autoit] [autoit]

    Dim $progress[10] ;10x progress-control
    Local $ereignis ;ereigniszähler

    [/autoit] [autoit][/autoit] [autoit]

    $hgui = GUICreate("Priority queue")
    For $i = 0 To 9 ;progressbars erstellen
    $progress[$i] = GUICtrlCreateProgress(20, $i * 30 + 30, 300, 25)
    Next
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ;liste mit zufälligen ereignissen füllen
    For $zufall = 1 To 200 ;Zufällige Anzahl der kommenden Ereignisse
    $ereignis += 1 ;es kommt ein Ereignis...
    $prio = Random(0, 9, 1) ;mit einer priorität....
    _fillqueue($prio, $ereignis) ;ereignis in liste eintragen
    Next

    [/autoit] [autoit][/autoit] [autoit]

    if $debug then _arraydisplay($queue)

    [/autoit] [autoit][/autoit] [autoit]

    $lastereignis = 0 ;letzte ereignisnummer
    $random = 3
    $schnitt=0 ;Durchschnittliche Anzahl der Ereignisse, bis ein Ereignis höchster Priorität (0) abgearbeitet wurde
    $lastitem = $queue[9][$queue[9][0]] ;letztes Ereignis in der gesamten liste
    ;MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$lastitem' & @lf & @lf & 'Return:' & @lf & $lastitem) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit]

    Do ;prioritätenliste abarbeiten

    [/autoit] [autoit][/autoit] [autoit]

    ;~ For $zufall = 1 To Random(1, $random, 1) ;Zufällige Anzahl der kommenden Ereignisse
    $ereignis += 1 ;es kommt ein Ereignis...
    $prio = Random(0, 9, 1) ;mit einer priorität....
    _fillqueue($prio, $ereignis) ;ereignis in liste eintragen
    ;~ Next
    ;_ArrayDisplay($queue)

    [/autoit] [autoit][/autoit] [autoit]

    _readqueue(0) ;das dringenste Ereignis auslesen
    ; _readqueue(Random(5, 9, 1)) ;auch die weniger dringenden Ereignisse müssen irgendwann abgearbeitet werden

    [/autoit] [autoit][/autoit] [autoit]

    ;ab hier nur Statistik-Geplänkel, wann erreicht das letzte item der liste die erste position?
    If $ereignis > 100000 Then
    $ereignis = 0
    $lastereignis = 0
    $schnitt=0
    EndIf
    if stringright($queue[0][1],2)="_0" then $schnitt+=1
    If $queue[0][1] = $lastitem Or $queue[1][1] = $lastitem Then ;das letzte Item aus der Liste hat es bis zum löschen geschafft
    MsgBox(0, "priority queue","Anzahl der Durchläufe, bis das letzte Ereigniss der niedrigsten Priorität (9) aus der Liste gelöscht wurde: "& $ereignis - $lastereignis & @crlf & _
    "Durchschnittliche Anzahl der Ereignisse, bis ein Ereignis höchster Priorität (0) abgearbeitet wurde : "&(($ereignis - $lastereignis)/$schnitt) & @crlf & _
    "Anzahl der Ereignisse mit der höchsten Priorität gesamt: "&$schnitt)
    $schnitt=0
    $lastereignis = $ereignis
    For $i = 9 To 0 Step -1
    If $queue[$i][0] = 0 Then ContinueLoop
    $lastitem = $queue[$i][$queue[$i][0]] ;letztes Item aus der liste holen
    ExitLoop
    Next
    ;~ MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$lastitem' & @lf & @lf & 'Return:' & @lf & $lastitem) ;### Debug MSGBOX
    ;~ _arraydisplay($queue)
    ;_ArrayDisplay($queue)
    EndIf
    if $speed then sleep(30)
    Until guigetmsg() = -3

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _fillqueue($prio, $ereignis) ;queue mit ereignissen einer bestimmten priorität füllen
    $queue[$prio][0] += 1 ;Anzahl der Ereignisse in der bestimmten Priorität um eins erhöhen
    $queue[$prio][$queue[$prio][0]] = "Ereignis_" & $ereignis &"_prio_"&$prio;Ereignis an die letzte Position in der Kette schreiben
    GUICtrlSetData($progress[$prio], $queue[$prio][0])
    EndFunc ;==>_fillqueue

    [/autoit] [autoit][/autoit] [autoit]

    Func _readqueue($prio) ;ereignis einer bestimmten Priorität aus der Liste holen
    ; $time=timerinit()
    Local $ereignis
    For $i = $prio To UBound($queue, 1) - 1 ;prioritäten und alle weiteren mit geringerer priorität
    If $queue[0][0] = 0 Then ;die erste prioritätenreihe ist leer, alle anderen Prioritäten eins nach "unten" rutschen
    if $debug then Msgbox(0,"priority queue","in der folgenden liste sieht man, wie die prioritäten eine zeile weiter nach unten sortiert wurden",3)
    ;_ArrayDisplay($queue)
    For $t = 0 To 8 ;alle prioritäten eins nach unten, aus [1] wird [0] aus [2] wird [1] usw
    For $f = 0 To $queue[$t + 1][0]
    $queue[$t][$f] = $queue[$t + 1][$f]
    Next
    If $t < 8 Then ;die ereignisse mitsortieren
    For $f = $queue[$t + 2][0] To $queue[$t + 1][0]
    $queue[$t + 1][$f] = 0
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Next
    For $f = $queue[9][0] To 0 Step -1 ;letzte reihe löschen
    $queue[9][$f] = 0
    Next
    if $debug then _ArrayDisplay($queue)
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $queue[$i][0] = 0 Then ContinueLoop ;es sind keine ereignisse vorhanden, nächste Priorität

    [/autoit] [autoit][/autoit] [autoit]

    $ereignis = $queue[$i][1] ;erstes ereignis einer priiorität aus der liste holen
    For $anz = 2 To $queue[$i][0] + 1 ;ereignisse der priorität ein feld weiter nach unten schieben
    $queue[$i][$anz - 1] = $queue[$i][$anz]
    Next
    $queue[$i][0] -= 1 ;anzahl der ereignisse in der liste um eins verkleinern
    GUICtrlSetData($progress[$i], $queue[$i][0])
    ExitLoop ;ereignis gefunden
    Next
    ;~ $l=timerdiff($time)
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $l = ' & $l & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    Return $ereignis

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_readqueue

    [/autoit]

    Um die "Laufzeiten" der Ereignisse mit niedrigster Priorität zu veranschaulichen, habe ich einen debug-mode eingebaut. Dort wird in jedem Durchlauf die Liste angezeigt.
    Für kleine Bildschirme sollte man die Startliste auf 100 Elemente begrenzen oder noch weniger...dem Prinzip ist das egal, da pro Durchlauf immer ein Ereignis hinzugefügt, und ein Ereignis herausgenommen wird

  • Zeilenanzahl auslesen um letzte Zeile zu überschreiben.

    • Andy
    • 8. Juli 2010 um 10:57

    Es ist aber wesentlich schneller, die Datei zu öffnen, per

    [autoit]

    filegetpos() fileread()

    [/autoit]


    den letzten CRLF zu suchen und ab dieser Position die letzte Zeile zu überschreiben. Dabei muss nicht die gesamte Datei geladen/umgewandelt/geschrieben werden, sondern nur einige Bytes...

  • GDIPlus MeasureString

    • Andy
    • 7. Juli 2010 um 17:57

    TextMeter

  • _WinAPI_RedrawWindow()

    • Andy
    • 7. Juli 2010 um 09:49

    Lies dir mal Bugfix´ens Tut´s zum Thema durch....
    IdR werden einer Funktion die Pointer auf eine Struct übergeben. Das hat den großen Vorteil, bei angenommenen 10 Parametern nur eine einzige Variable an die Funktion bzw. DLL übergeben zu müssen. Eine Struct ist nichts weiter als eine Liste von bestimmter Struktur im Speicher.
    Wenn du Pralinen kaufen möchtest, dann gehst du auch nicht in den Laden und kaufst die einzeln(" 7 Nuss, 8 Weinbrandbohnen, 3 Nougat, 5 Weiße Schokolade..."), sondern in einer Schachtel. Da weiss auch jeder, was drin ist. Oder Wurstaufschnitt...da sind in jeder Packumg immer gleich viele Scheiben der unterschiedlichsten Sorten.
    Der "Pointer" auf diese Struktur ist der Wegweiser zur Packung Pralinen bzw Wurstaufschnitt. Fach Nr. 127.
    In unserem Fall ist der Pointer also die Beschreibung, an welcher Speicherstelle die Struktur liegt.
    Der Vorteil ist, daß man mehrere Strukturen erstellen kann und dann der Funktion statt 28 Parameter nur EINEN Zeiger (Pointer) auf die Daten übergibt.

    [autoit]

    $pointer=DllStructGetPtr($struct) ;Pointer auf den Anfang der Struct
    $pointer=DllStructGetPtr($struct,"Right") ;Pointer auf ein Element der Struct

    [/autoit]
  • _WinAPI_RedrawWindow()

    • Andy
    • 6. Juli 2010 um 23:23

    Beispiel:

    [autoit]

    $tagRECT = "int Left;int Top;int Right;int Bottom" ;structstruktur benennen
    $struct = DllStructCreate($tagRECT) ;struct erstellen
    DllStructSetData($struct,"Left" , 100) ;hier die parameter eingeben
    DllStructSetData($struct,"Top", 100) ;struct beschreiben
    DllStructSetData($struct,"Right", 150)
    DllStructSetData($struct,"Bottom", 200)

    [/autoit][autoit][/autoit][autoit]

    $a=DllStructGetData($struct,"Right") ;struct auslesen

    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$a' & @lf & @lf & 'Return:' & @lf & $a) ;### Debug MSGBOX

    [/autoit][autoit][/autoit][autoit][/autoit]

    /EDIT/ ....die Vorschau hat nuts Thread nicht angezeigt, obwohl dieser mehrere Minuten vorher gepostet wurde...das kam in letzter Zeit schon öfter vor!?

  • bplaced.net - FTP Upload

    • Andy
    • 6. Juli 2010 um 22:40

    Sowohl Up- als auch Download gingen bei bplaced schon immer ohne irgendwelche Blockereien...
    Sowohl mit AutoIt-Scripten, als auch mit allen anderen FTP-Clients...

  • Pixel eines Bildes auslesen ohne es darzustellen

    • Andy
    • 6. Juli 2010 um 21:50

    /EdIT/ Beitrag zerschossen....

    Bei Wikipedia gibts nen schönen Artikel zum Bitmap-Format. So gut wie alles, was intern in Windows abläuft, dreht sich um Bitmaps, alles andere sind nur verschiedene Dateiformate

    Deins:

    [autoit]

    $array = hex(asc(StringMid($bytes, (300 + 482) * (1 + 1078), 1)),2) ;farbe in hex

    [/autoit]


    Meins:

    [autoit]

    $array = hex(asc(StringMid($bytes, $b + 482 * $h + 1078, 1)),2) ;farbe in hex

    [/autoit]

    Fällt dir was auf...Grundschule, Punkt vor Strichrechnung...wenn man schon Klammern setzt, dann sollte man auch wissen, wo die Dinger hingehören ;)

  • Pixel eines Bildes auslesen ohne es darzustellen

    • Andy
    • 6. Juli 2010 um 17:32

    jpgs per _GDIPlus_BitmapCreateFromFile() öffnen,mit _GDIPlus_BitmapLockBits() die Bitmapdaten holen und auslesen. Dazu gibts aber sicher 20 Threads....auf der ersten Seite der Suche^^

  • Pixel eines Bildes auslesen ohne es darzustellen

    • Andy
    • 6. Juli 2010 um 16:13

    640x482 x 8Bpp... die Scripte sind in dieser Form für 32Bpp, wenn du 8Bpp hast, musst du doch nur 1 Byte statt 4 auslesen...

    Fileopen binär, Daten lesen, 54 Byte BMP-Header vorne abschneiden, der Rest sind die Pixel, 1 Byte pro Pixel
    Hab gerade gesehen, 1024 Bytes Farbtabelle sind in deinem Bild auch noch drin....die also auch vorne abschneiden.
    Also ab Offset 1078 (54+1024) sind die Pixeldaten,
    Wenn du jetzt die Pixelfarbe von 77,88 haben willst, dann rechne 77+482x88=42493, dazu den Offset 1078 ergibt 43571. Dieses Byte hat die Farbe des Pixels

    [autoit]


    $bytes = FileRead("bg_1.bmp") ;alle Bytes lesen

    [/autoit][autoit][/autoit][autoit]

    Dim $array[480][640] ;array für alle pixel
    For $b = 0 To 639
    For $h = 0 To 479
    $array[$h][$b] = hex(asc(StringMid($bytes, $b + 482 * $h + 1078, 1)),2) ;farbe in hex
    Next
    Next

    [/autoit][autoit][/autoit][autoit]

    _arraydisplay($array)

    [/autoit]
  • OpenGl - Rotating Scaling Cube

    • Andy
    • 4. Juli 2010 um 20:48
    Zitat

    oder für was ist OpenGl eig ausgelegt??

    Im Profibereich ist OpenGL DER Standard überhaupt. Billyboy beisst sich heute noch in den Hintern, daß MS vor einigen Jahren als eines der Gründungsmitglieder die Stimmberechtigung in der Entwicklung abgegeben hat....
    Pinguin, je nach Grafikkarte bzw Treiber hast du ca 300 Befehle, da ist mit Sicherheit etwas passendes auch für dich dabei ;)

  • Pixel eines Bildes auslesen ohne es darzustellen

    • Andy
    • 4. Juli 2010 um 20:28

    hmmm, funktioniert bei mir einwandfrei mit deinem bild bg_1.bmp
    Btw, ist das Bild immer in diesen Abmessungen oder sind die Bilder auch größer/kleiner?

  • Der musikalische SEuBo

    • Andy
    • 4. Juli 2010 um 20:22

    5 stars from me^^

  • Pixel eines Bildes auslesen ohne es darzustellen

    • Andy
    • 4. Juli 2010 um 15:22

    Wenn du in der Lage bist Bitmap-Dateien, vorzugsweise 32Bit, zu bearbeiten, gibt es eine sehr schnelle Variante den Pixel direkt aus der Datei auszulesen.
    Das BMP-Format ist sehr einfach s. Wikipedia. 54 Byte Header mit allen notwendigen Informationen, der Rest ist reine Pixelsuppe.
    Mühe wurde sich bereits an anderer Stelle gemacht...

    Spoiler anzeigen
    [autoit]

    #include <ScreenCapture.au3>
    #include-once

    [/autoit] [autoit][/autoit] [autoit]

    $file="test.bmp"
    _ScreenCapture_Capture($file,0,0,500,500)
    $t=timerinit()
    $hbmp=_BMPOpen($file)
    $col=_pixelread($hbmp,450,377)
    $m=timerdiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $col = ' & $col & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    shellexecute($file)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ----------------------------------------------------------------------------
    ;
    ; AutoIt Version: 3.2.10.0
    ; Author: Evilertoaster <evilertoaster at yahoo dot com>
    ;
    ; Script Function:
    ; Basic BMP file managment.
    ;Script Version:
    ; 2.1
    ; ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func _BMPGetWidth(ByRef $BMPHandle)
    If IsArray($BMPHandle)=0 Then Return 0
    Return $BMPHandle[1]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _BMPGetHeight(ByRef $BMPHandle)
    If IsArray($BMPHandle)=0 Then Return 0
    Return $BMPHandle[2]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _BMPGetChecksum(ByRef $BMPHandle,$step=1)
    if not IsArray($BMPHandle) then Return -1
    $length=BinaryLen($BMPHandle[3])
    $a=1
    $b=0
    for $i=54 to $length
    $a=Mod($a+Dec(Hex(BinaryMid($BMPHandle[3],$i,1))),65521)
    $b=Mod($a+$b,65521)
    Next
    Return (BitShift(BitShift($b,-16),1)*2) + $a
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _PixelFill(ByRef $BMPHandle,$x,$y,$color,$variation=0)
    Local $CheckChart[UBound($BMPHandle,1)][UBound($BMPHandle,2)]
    Local $count=0
    $Tset=1
    Local $tracer[$Tset]
    $tracer[$tset-1]=$x&","&$y
    Local $CheckColor=Dec(_PixelRead($BMPHandle,$x,$y))
    $CheckChart[$y][$x]=1
    While 1
    if Abs(Dec(_PixelRead($BMPHandle,$x-1,$y))-$CheckColor)<=$variation Then
    $CheckChart[$x-1][$y]=1
    $count+=1
    _PixelWrite($BMPHandle,$x-1,$y,$color)
    $Tset+=1
    ReDim $tracer[$Tset]
    $tracer[$Tset-1]=$x&","&$y
    $x=$x-1
    ContinueLoop
    EndIf
    if Abs(Dec(_PixelRead($BMPHandle,$x,$y-1))-$CheckColor)<=$variation Then
    $CheckChart[$x][$y-1]=1
    $count+=1
    _PixelWrite($BMPHandle,$x,$y-1,$color)
    $Tset+=1
    ReDim $tracer[$Tset]
    $tracer[$Tset-1]=$x&","&$y
    $y=$y-1
    ContinueLoop
    EndIf
    if Abs(Dec(_PixelRead($BMPHandle,$x+1,$y))-$CheckColor)<=$variation Then
    $CheckChart[$x+1][$y]=1
    $count+=1
    _PixelWrite($BMPHandle,$x+1,$y,$color)
    $Tset+=1
    ReDim $tracer[$Tset]
    $tracer[$Tset-1]=$x&","&$y
    $x=$x+1
    ContinueLoop
    EndIf
    if Abs(Dec(_PixelRead($BMPHandle,$x,$y+1))-$CheckColor)<=$variation Then
    $CheckChart[$x][$y+1]=1
    $count+=1
    _PixelWrite($BMPHandle,$x,$y+1,$color)
    $Tset+=1
    ReDim $tracer[$Tset]
    $tracer[$Tset-1]=$x&","&$y
    $y=$y+1
    ContinueLoop
    EndIf
    $Point=StringSplit($tracer[$Tset-1],",")
    $x=$Point[1]
    $y=$Point[2]
    $Tset-=1
    ReDim $tracer[$Tset]
    if $tset=1 then ExitLoop
    Wend
    Return $count
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _RectangleWrite(ByRef $BMPHandle,$x,$y,$Width,$Height,$color,$Thickness=1)
    if $Thickness<1 then Return 0
    if $Thickness>1 then
    Return SubRectangleWrite($BMPHandle,$x,$y,$Width,$Height,$color,$Thickness)
    EndIf
    Local $TempW=Round($Width/2)
    Local $TempH=Round($Height/2)
    _LineWrite($BMPHandle,$x-$TempW,$y-$TempH,$x+$TempW,$y-$TempH,$color)
    _LineWrite($BMPHandle,$x+$TempW,$y-$TempH,$x+$TempW,$y+$TempH,$color)
    _LineWrite($BMPHandle,$x+$TempW,$y+$TempH,$x-$TempW,$y+$TempH,$color)
    _LineWrite($BMPHandle,$x-$tempw,$y+$TempH,$x-$TempW,$y-$TempH,$color)
    Return $Width*$Height
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func SubRectangleWrite(ByRef $BMPHandle,$x,$y,$Width,$Height,$color,$Thickness)
    For $a=1 to $Thickness
    _RectangleWrite($BMPHandle,$x,$y,$Width-Round($a/2),$Height-Round($a/2),$color)
    _RectangleWrite($BMPHandle,$x,$y,$Width+Round($a/2),$Height+Round($a/2),$color)
    Next
    Return $Width*$Height
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func _EllipseWrite(ByRef $BMPHandle,$X,$Y,$Width,$Height,$color,$Thickness=1)
    if $Thickness<1 then Return 0
    if $Thickness>1 then
    Return SubEllipseWrite($BMPHandle,$x,$y,$Width,$Height,$color,$Thickness)
    EndIf
    Local $SumA=$Width/2
    Local $SumB=$Height/2
    Local $LastY=0
    Local $temp,$test,$h
    _PixelWrite($BMPHandle,Floor($x-$Width/2),$y,$color)
    _PixelWrite($BMPHandle,$x+$Width/2,$y,$color)
    For $a=-$Width/2 to $Width/2
    $temp=Sqrt(($SumB^2)*(1-(($a^2)/($SumA^2))))
    if $temp>$LastY then
    $test=$temp-$LastY
    Else
    $test=$LastY-$temp
    EndIf
    If $test<=1 then
    _PixelWrite($BMPHandle,$x+$a,$y+$temp,$color)
    _PixelWrite($BMPHandle,$x+$a,$y-$temp,$color)
    Else
    _LineWrite($BMPHandle,$x+$a-1,$y+$LastY,$x+$a,$y+$temp,$color)
    _LineWrite($BMPHandle,$x+$a-1,$y-$LastY,$x+$a,$y-$temp,$color)
    EndIf
    $LastY=$temp
    Next
    $h=(($sumA-$SumB)^2)/(($sumA+$SumB)^2)
    Return 3.14159*($SumA+$SumB)*(1+((3*$h)/(10+Sqrt(4-(3*$h)))))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func SubEllipseWrite(ByRef $BMPHandle,$x,$y,$Width,$Height,$color,$Thickness)
    for $a=1 to $Thickness
    _EllipseWrite($BMPHandle,$x,$y,$Width+$a,$Height+$a,$color)
    Local $Return=_EllipseWrite($BMPHandle,$x,$y,$Width-$a,$Height-$a,$color)
    Next
    Return $Return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func SubLineWrite(ByRef $BMPHandle,$x1,$y1,$x2,$y2,$color,$loops)
    if $loops<1 then Return 0
    for $a=1 to $loops-1
    Local $Return=_LineWrite($BMPHandle,$x1+$a,$y1,$x2+$a,$y2,$color)
    _LineWrite($BMPHandle,$x1-$a,$y1,$x2-$a,$y2,$color)
    Next
    Return $Return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _LineWrite(ByRef $BMPHandle,$x1,$y1,$x2,$y2,$color,$Thickness=1)
    If $Thickness<>1 then
    Local $Return=SubLineWrite($BMPHandle,$x1,$y1,$x2,$y2,$color,$Thickness)
    Return $Return
    EndIf
    If $x1=$x2 or $y1=$y2 Then
    if $x1=$x2 and $y1=$y2 then
    _PixelWrite($BMPHandle,$x1,$y1,$color)
    Return 1
    EndIf
    if $x1=$x2 then
    if $y1>$y2 Then
    Local $hold=$y1
    $y1=$y2
    $y2=$hold
    EndIf
    For $a=$y1 to $y2
    _PixelWrite($BMPHandle,$x1,$a,$color)
    Next
    Return $y2-$y1
    EndIf
    if $y1=$y2 Then
    If $x1>$x2 Then
    Local $hold=$x2
    $x2=$x1
    $x1=$hold
    EndIf
    for $a=$x1 to $x2
    _PixelWrite($BMPHandle,$a,$y1,$color)
    Next
    Return $x2-$x1
    EndIf
    EndIf
    If $x1>$x2 Then
    Local $hold=$x2
    $x2=$x1
    $x1=$hold
    $hold=$y1
    $y1=$y2
    $y2=$hold
    EndIf
    Local $slope=($y2-$y1)/($x2-$x1)
    if $y2>$y1 Then
    Local $highy=$y2
    Local $lowy=$y1
    Else
    Local $highy=$y1
    Local $lowy=$y2
    EndIf
    If $x2-$x1>$highy-$lowy Then
    Local $stepx=1
    Local $stepy=$slope
    Else
    Local $stepx=1/abs($slope)
    if $y1>$y2 then
    Local $stepy=-1
    Else
    Local $stepy=1
    EndIf
    EndIf
    Local $count=0
    for $a=$x1 to $x2 step $stepx
    _PixelWrite($BMPHandle,$a,$y1+($stepy*$count),$color)
    $count+=1
    Next
    Return Sqrt(($highy-$lowy)*($highy-$lowy)+($x2-$x1)*($x2-$x1))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _BMPCreate ($Width,$Height)
    Local $c=Mod($Width,4)
    Local $d=Binary("")
    if $c=3 then $d=Binary("0x000000")
    if $c=2 then $d=Binary("0x0000")
    if $c=1 then $d=Binary("0x00")
    ;***BMP header (54bytes total)***
    Local $Header=Binary("0x424D"& _ ;2bytes, BM signature
    "00000000"& _ ;4bytes, filesize (optional, omitted)
    "0000"& _ ;2bytes, reserved
    "0000"& _ ;2bytes, reserved
    "36000000"& _ ;4bytes, offset to image data
    "28000000"& _ ;4bytes, BITMAPINFOHEADER
    _Reverse8(Hex($Width,8))& _ ;4bytes, bitmap width
    _Reverse8(Hex($Height,8))& _ ;4bytes, bitmap hieght
    "0100"& _ ;2bytes, bitmap planes
    "1800"& _ ;2bytes, bitmap bitdepth
    "00000000"& _ ;4bytes, bitmap compression type (none)
    _Reverse8(Hex(($Height)* _
    ($Width)*3+($Height*$c),8))& _ ;4bytes, bitmap data size
    "00000000"& _ ;4bytes, bitmap horizontal resolution (optional,omitted)
    "00000000"& _ ;4bytes, bitmap vertical resolution (optional,omitted)
    "00000000"& _ ;4bytes, bitmap colors (optional?, omitted)
    "00000000") ;4bytes, important colors (optional?, omitted)
    ;***End Header***
    Local $rowData=Binary("")
    Local $imageData=Binary("")
    for $n=1 to $Width
    $rowData&=Binary("0xFFFFFF")
    Next
    $rowData&=$d
    for $m=1 to $Height
    $imageData&=$rowData
    Next
    Local $BMPHandle[4]
    $BMPHandle[0]=$c
    $BMPHandle[1]=$Width
    $BMPHandle[2]=$Height
    $BMPHandle[3]=$Header&$imageData
    Return $BMPHandle
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _BMPOpen($Path,$Progress=1)
    Local $Bpath=FileOpen($Path,16)
    If $Bpath=-1 then Return -1
    $AllOf=FileRead($Bpath)
    If BinaryMid($AllOf,1,2)<>"0x424D" then Return -2
    $x=Dec(_Reverse8(Hex(BinaryMid($AllOf,19,4))))
    $y=Dec(_Reverse8(Hex(BinaryMid($AllOf,23,4))))
    if $x=0 or $y=0 then Return -3
    for $c=$x to 0 step -4
    if $c<4 then ExitLoop
    Next
    Local $BMPHandle[4]
    $BMPHandle[0]=$c
    $BMPHandle[1]=$x
    $BMPHandle[2]=$y
    $BMPHandle[3]=$AllOf
    return $BMPHandle
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _PixelRead(ByRef $BMPHandle,$x,$y)
    If IsArray($BMPHandle)=False or $x>$BMPHandle[1]-1 Or $x<0 Or $y>$BMPHandle[2]-1 Or $y<0 Then Return 0
    $color = Hex(BinaryMid($BMPHandle[3],_ChordToOffset($x,$y,$BMPHandle),3))
    $color = _Reverse6($Color)
    Return $Color
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _PixelWrite(ByRef $BMPHandle,$x,$y,$color)
    If $x>$BMPHandle[1]-1 Or $x<0 Or $y>$BMPHandle[2]-1 Or $y<0 or StringLen($color)<>6 or Dec($Color)=0 Then Return 0
    $color = _Reverse6($Color)

    [/autoit] [autoit][/autoit] [autoit]

    $BMPHandle[3]=BinaryMid($BMPHandle[3],1,_ChordToOffset($x,$y,$BMPHandle))&Binary("0x"&$color)&BinaryMid($BMPHandle[3],_ChordToOffset($x,$y,$BMPHandle)+4)

    [/autoit] [autoit][/autoit] [autoit]

    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ChordToOffset($x,$y,ByRef $BMPHandle)
    Local $row=($BMPHandle[1]*3+$BMPHandle[0])
    return 54+(($BMPHandle[2]*$row)-(($y+1)*$row)+($x*3))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _BMPWrite(ByRef $BMPHandle,$Fpath,$Progress=1)
    if IsArray($BMPHandle)=False then Return 0
    $out=FileOpen($Fpath,18)
    if $out=-1 then return -1
    FileWrite($out,$BMPHandle[3])
    FileClose($out)
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Reverse8($inHex)
    Return StringMid($inHex,7,2)&StringMid($inHex,5,2)&StringMid($inHex,3,2)&StringMid($inHex,1,2)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Reverse6($inHex)
    Return StringMid($inHex,5,2)&StringMid($inHex,3,2)&StringMid($inHex,1,2)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    wenn man es noch schneller und noch kürzer ohne die Funktionen haben möchte, bei 32Bpp einfach alles unwichtige rausschmeissen, dann wirds ein 3-Zeiler

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™