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

  • WinAPI: BitBlt sehr langsam, bei Verwendung von DIB

    • Andy
    • 13. März 2012 um 23:34
    Zitat

    Andy: Es ist ein kleiner Unterschied, ob man mit DIBs oder Device Dependent Bitmaps arbeitet denke ich.


    Fürs blitten (auf dem Bildschirm) macht das imho keinen Unterschied (jedenfalls bei herkömmlichen Frameraten). Da werden Bytes durch den Speicher geschoben. Auf anderen Devices sieht das sicher anders aus, aber da wird der Treiber dazwischenfunken bzgl Formaten usw.

    Zitat von MSDN

    ...Thus, a DDB is often called a compatible bitmap and it usually has better GDI performance than a DIB. For example, to create a bitmap for video memory, it is best to use a compatible bitmap with the same color format as the primary display. Once in video memory, rendering to the bitmap and displaying it to the screen are significantly faster than from a system memory surface or directly from a DIB....

    significantly....wzbw, du darfst aktiv werden ;)

  • WinAPI: BitBlt sehr langsam, bei Verwendung von DIB

    • Andy
    • 13. März 2012 um 21:43

    /OT/ BitBlt ist nicht wirklich langsam^^

    Spoiler anzeigen
    [autoit]

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

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

    opt("GUIOnEventMode",1)
    opt("GUICloseOnESC",1)

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

    _GDIPlus_Startup()

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

    $hgui=guicreate("",1024,768)
    guisetstate()
    GUISetOnEvent(-3, '_Exit', $hGUI)
    $hDC_gui = _WinAPI_GetDC($hGUI)
    $hDC = _WinAPI_GetDC(0)
    AdlibRegister("_FPS", 1000)

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

    global $fps=0

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

    while 1
    _WinAPI_BitBlt($hdc_gui, 0, 0, 1024, 768, $hdc, $fps/10, $fps/100, 0x00CC0020 );image in leere bitmap
    $fps+=1
    WEnd

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

    Func _FPS()
    WinSetTitle($hGUI, "", "FPS=" & $FPS )
    $FPS = 0
    EndFunc ;==>_FPS

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

    func _Exit()
    exit
    EndFunc

    [/autoit]


    wenn man die /10 und /100 im BitBlt entfernt, verfünffachen sich die Frameraten, auf meinem Gurkenrechner auf >6000
    d.h. ein blit vom Screen in ein Fenster dauert weniger als 0.1ms

  • WinAPI: BitBlt sehr langsam, bei Verwendung von DIB

    • Andy
    • 13. März 2012 um 19:55

    Hab dein Script mal bissl abgeändert und komme so nur auf 1/6 der Zeit

    Spoiler anzeigen
    [autoit]

    #include <Memory.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>

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

    Global $_SGP2_hDC_Screen, $_SGP2_hDC_Memory, $_SGP2_pBitmapBits, $_SGP2_hMem_Alloc, $_SGP2_aArea[4];, $tstruct

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

    $B = 100
    $H = 100

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

    _ScreenGetPixel_2_Startup($B, $H) ; 100x100 großer DIB-Bereich

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

    $iSum = 0
    For $i = 1 To 10
    _ScreenGetPixel_2_Refresh(0, 0) ;Random(0, 300, 1), Random(0, 300, 1)) ; einen 100x100 Bereich irgendwo ab X: 0-300, Y: 0-300 übertragen

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


    ;*********GEÄNDERT*********
    $tstruct = DllStructCreate("dword[" & $B * $H & "]", $_SGP2_pBitmapBits)
    ;**************************
    $iTimer = TimerInit()
    For $y = 0 To 99
    For $x = 0 To 99
    $iReturn = DllStructGetData($tstruct, 1, $y * $B + $x)
    ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iReturn = ' & $iReturn & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    Next
    Next

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

    $iTimer = TimerDiff($iTimer)
    $iSum += $iTimer
    ConsoleWrite('Durchgang #' & $i & ': ' & $iTimer & @CRLF)
    Next

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

    ConsoleWrite('Gesamt: ' & $iSum & @CRLF)
    ConsoleWrite('Durchschnitt: ' & $iSum / $i & @CRLF)
    _ScreenGetPixel_2_Shutdown()

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

    ;==========================================================
    ; Übergeben werden muss die Größe des Bildschirmbereiches,
    ; der später übertragen werden soll. Je größer der Bereich, desto
    ; länger dauert das BitBlt beim _ScreenGetPixel_2_Refresh()
    ;==========================================================
    Func _ScreenGetPixel_2_Startup($iWidth, $iHeight, $iX = 0, $iY = 0)
    Local Const $tagBITMAPINFOHEADER = 'dword biSize ;long biWidth;long biHeight;ushort biPlanes;ushort biBitCount;dword biCompression;dword biSizeImage;long biXPelsPerMeter;long biYPelsPerMeter;dword biClrUsed;dword biClrImportant;'

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

    Local $pBitmapHeader, $tBitmapHeader

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

    ; Wir holen uns zuerst den DC vom Desktop.
    $_SGP2_hDC_Screen = _WinAPI_GetDC(0)

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

    ; Dazu erstellen wir uns noch einen kompatiblen DC im Memory, der
    ; mit der DIB verknüpft wird. Wenn wir ein BitBlt in diesen DC machen,
    ; und die Farbinformationen vom Desktop-DC übertragen, enthält die DIB
    ; unsere Farbdaten.
    $_SGP2_hDC_Memory = _WinAPI_CreateCompatibleDC($_SGP2_hDC_Screen)
    ; Speicher für Bitmap-Header reservieren
    $_SGP2_hMem_Alloc = _MemGlobalAlloc(40, $GMEM_FIXED)

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

    If Not @error Then
    ; Pointer des reservierten Speichers holen
    $pBitmapHeader = _MemGlobalLock($_SGP2_hMem_Alloc)
    ; BitmapHeader in reserviertem Speicherbereich erstellen
    $tBitmapHeader = DllStructCreate($tagBITMAPINFOHEADER, $pBitmapHeader)

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

    ; Bitmapinfos ausfüllen
    DllStructSetData($tBitmapHeader, 'biSize', DllStructGetSize($tBitmapHeader))
    DllStructSetData($tBitmapHeader, 'biWidth', $iWidth)
    DllStructSetData($tBitmapHeader, 'biHeight', $iHeight)
    DllStructSetData($tBitmapHeader, 'biPlanes', 1)
    DllStructSetData($tBitmapHeader, 'biBitCount', @DesktopDepth)
    DllStructSetData($tBitmapHeader, 'biCompression', 0)
    DllStructSetData($tBitmapHeader, 'biSizeImage', 0)
    DllStructSetData($tBitmapHeader, 'biXPelsPerMeter', 0)
    DllStructSetData($tBitmapHeader, 'biYPelsPerMeter', 0)
    DllStructSetData($tBitmapHeader, 'biClrUsed', 0)
    DllStructSetData($tBitmapHeader, 'biClrImportant', 0)

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

    ; Globale Daten füllen
    $_SGP2_aArea[0] = $iX
    $_SGP2_aArea[1] = $iY
    $_SGP2_aArea[2] = $iWidth
    $_SGP2_aArea[3] = $iHeight

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

    ; DIB-Section erstellen. $_SGP2_pBitmapBits ist ein Pointer direkt auf die
    ; Farbinformationen der DIB.
    $hBitmap = _WinAPI_CreateDIBSection(0, $tBitmapHeader, 0, $_SGP2_pBitmapBits)

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

    ; DIB in den Device Context laden.
    _WinAPI_SelectObject($_SGP2_hDC_Memory, $hBitmap)

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

    _ScreenGetPixel_2_Refresh()

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

    EndIf
    EndFunc ;==>_ScreenGetPixel_2_Startup

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

    ;==========================================================
    ; Aktualisiert die Pixelfarben, die in zwischen-
    ; gespeicherter Form vorliegen.
    ;==========================================================
    Func _ScreenGetPixel_2_Refresh($iX = -1, $iY = -1)
    Local Const $SRCCOPY = 0x00CC0020 ; WindowsConstants.au3

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

    ; Wenn X oder Y Koordinate nicht mitgegeben wurde,
    ; verwende die bei StartUp angegebenen Koordinaten als
    ; linke obere Ecke.
    If $iX = -1 Then $iX = $_SGP2_aArea[0]
    If $iY = -1 Then $iY = $_SGP2_aArea[1]
    ; Hier passiert die Maagie!
    _WinAPI_BitBlt($_SGP2_hDC_Memory, 0, 0, $_SGP2_aArea[2], $_SGP2_aArea[3], $_SGP2_hDC_Screen, $iX, $iY, $SRCCOPY)
    EndFunc ;==>_ScreenGetPixel_2_Refresh

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

    ;==========================================================
    ; Holt eine Pixelfarbe aus den Bitmap Bits der DIB
    ;==========================================================
    Func _ScreenGetPixel_2_GetPixel($iX = 0, $iY = 0)
    Local $iReturn
    ; Struktur für Pixelfarbe erstellen

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

    ; Farbe auslesen

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

    ; Struktur freigeben
    $tstruct = 0
    Return $iReturn
    EndFunc ;==>_ScreenGetPixel_2_GetPixel

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

    ;==========================================================
    ; Aufräumarbeiten. Sollte vor einem erneuten
    ; _ScreenGetPixel_2_Startup IMMER durchgeführt werden!
    ;==========================================================
    Func _ScreenGetPixel_2_Shutdown()
    ; DCs freigeben.
    _WinAPI_ReleaseDC(0, $_SGP2_hDC_Screen)
    _WinAPI_DeleteDC($_SGP2_hDC_Memory)

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

    ; Speicher für den Bitmapheader freigeben .
    _MemGlobalFree($_SGP2_hMem_Alloc)

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

    $_SGP2_hDC_Screen = 0
    $_SGP2_hDC_Memory = 0
    $_SGP2_pBitmapBits = 0
    $_SGP2_aArea[0] = 0
    $_SGP2_aArea[1] = 0
    $_SGP2_aArea[2] = 0
    $_SGP2_aArea[3] = 0
    EndFunc ;==>_ScreenGetPixel_2_Shutdown

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

    ; From WinAPIEx.au3
    ;
    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _WinAPI_CreateDIBSection
    ; Description....: Creates a DIB that applications can write to directly.
    ; Syntax.........: _WinAPI_CreateDIBSection ( $hDC, $tBITMAPINFO, $iUsage, ByRef $pBits [, $hSection [, $iOffset]] )
    ; Parameters.....: $hDC - Handle to a device context. If the value of $iUsage is $DIB_PAL_COLORS, the function uses this
    ; device context's logical palette to initialize the DIB colors.
    ; $tBITMAPINFO - $tagBITMAPINFO structure that specifies various attributes of the DIB, including the bitmap
    ; dimensions and colors.
    ; $iUsage - The type of data contained in the $pBits array. (either logical palette indexes or literal RGB values).
    ; The following values are defined.
    ;
    ; $DIB_PAL_COLORS
    ; $DIB_RGB_COLORS
    ;
    ; $pBits - A pointer to the location of the DIB bit values.
    ; $hSection - Handle to a file-mapping object that the function will use to create the DIB.
    ; $iOffset - The offset from the beginning of the file-mapping object referenced by $hSection where storage
    ; for the bitmap bit values is to begin. This value is ignored if $hSection is 0.
    ; Return values..: Success - Handle to the newly created DIB, and $pBits points to the bitmap bit values. You can create the
    ; structure by using $pBits pointer to further its filling. For example,
    ; DllStructCreate('dword[4]', $pBits).
    ; Failure - 0 and sets the @error flag to non-zero, $pBits also is 0.
    ; Author.........: Yashied
    ; Modified.......:
    ; Remarks........: When you are finished using the icon, destroy it using the _WinAPI_DestroyIcon() function.
    ; Related........:
    ; Link...........: @@MsdnLink@@ CreateDIBSection
    ; Example........: Yes
    ; ===============================================================================================================================
    Func _WinAPI_CreateDIBSection($hDC, $tBITMAPINFO, $iUsage, ByRef $pBits, $hSection = 0, $iOffset = 0)

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

    Local $Ret = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', $hDC, 'ptr', DllStructGetPtr($tBITMAPINFO), 'uint', $iUsage, 'ptr*', 0, 'ptr', $hSection, 'dword', $iOffset)

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

    If (@error) Or (Not $Ret[0]) Then
    $pBits = 0
    Else
    $pBits = $Ret[4]
    EndIf
    Return SetError(Number(Not $Ret[0]), 0, $Ret[0])
    EndFunc ;==>_WinAPI_CreateDIBSection

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


    vorher:

    Code
    Durchgang #1: 125.994784253306
    Durchgang #2: 115.663024211178
    Durchgang #3: 114.455328819724
    Durchgang #4: 114.164509735176
    Durchgang #5: 113.9390620875
    Durchgang #6: 146.038113782618
    Durchgang #7: 165.428287673433
    Durchgang #8: 169.691678691007
    Durchgang #9: 169.400859606458
    Durchgang #10: 180.108645093161
    Gesamt: 1414.88429395356
    Durchschnitt: 128.625844904869
    Alles anzeigen

    nachher:

    Code
    Durchgang #1: 25.1467714472091
    Durchgang #2: 22.8590505217842
    Durchgang #3: 23.7608411124878
    Durchgang #4: 22.2581361597633
    Durchgang #5: 24.8953428438531
    Durchgang #6: 27.1780351972108
    Durchgang #7: 22.454250470381
    Durchgang #8: 21.3638884271604
    Durchgang #9: 22.400053638102
    Durchgang #10: 22.1690186881294
    Gesamt: 234.485388506081
    Durchschnitt: 21.3168535005528
    Alles anzeigen

    Weiterhin holt man noch mehr Geschwindigkeit heraus, indem man SÄMTLICHE nicht für den "Inner Loop" benötigten Befehle WEGLÄSST!
    ALLES, das heisst ALLES, was nicht unbedingt in den inner Loop gehört , KOMMT RAUS!
    D.h. auch sämtliches Fehlermananagement usw., das lagert man immer in die vorhergehenden Anweisungen aus.

    /EDIT/ z.B. Stoppst du 2x die RANDOM-Funktion mit^^
    Bitblt ist ziemlich schnell, in einer while/wend-schleife mit einem ausschliesslichen BitBlt() drin erreiche ich knapp 1000FPS bei 1680x1050

  • WinAPI: BitBlt sehr langsam, bei Verwendung von DIB

    • Andy
    • 13. März 2012 um 19:19

    Hi,
    mit

    [autoit]

    $t=timerinit()
    $a=_ScreenGetPixel_2_Startup(0,0,1000,1000)
    $m=timerdiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $t=timerinit()
    $a=_ScreenGetPixel_2_GetPixel(800,800)
    $m=timerdiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $a = ' & $a & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    erhalte ich

    Code
    @@ Debug(11) : $m = 4.66400059225404
    >Error code: 0
    @@ Debug(16) : $m = 0.038273020733082
    >Error code: 0
    @@ Debug(18) : $a = 16777215
    >Error code: 0
  • GDI+ und QuickDraw zu langsam für 65000 pixel

    • Andy
    • 3. März 2012 um 18:11

    Naja, gerade für solche "Pixelspielereien" bietet es sich an, 20 Zeilen Code und assembliert nicht mal 60 Bytes, genau dafür ist ASM gut^^

    Interessant dabei, meinen Athlon X2 lässt das Programm völlig kalt, im wahrsten Sinne des Wortes, der wacht nichtmal aus dem P3 auf....läuft also permanent mit 800Mhz statt mit 3Ghz.
    Wahrscheinlich liegt das daran, dass der komplette Code des Loops in den Instruction Cache passt, nur einige Cache misses gibts bei jedem Aufrufen der Funktion, weil die Bitmap nicht komplett in den Cache passt^^

  • Wie wichtig ist _BASS_Free() ?

    • Andy
    • 3. März 2012 um 09:48

    Google FTW!

  • Wie wichtig ist _BASS_Free() ?

    • Andy
    • 3. März 2012 um 08:48
    Zitat von progandy

    ...dass das Betriebssystem...

    wobei wir beim Thema wären :D

  • Riesen Zeitunterschiede ...

    • Andy
    • 3. März 2012 um 08:30

    Hi!

    Zitat

    Woran kann dies liegen?


    Handbook not read error!

    schau mal bei den options in der Hilfe von InetGetSize()....vor allem, was standardmäßig eingestellt ist!

  • Wie wichtig ist _BASS_Free() ?

    • Andy
    • 3. März 2012 um 08:20
    Zitat von Greenhorn


    Speicherlecks !!!


    Ja, aber nur während des Programmlaufs, ich denke, dass hast du auch gemeint :thumbup:
    Nach Beendigung des Programms räumt Windows den Speicher auf. (Abgesehen von irgendwelchen "manipulierten" Speicherbereichen anderer Prozesse).
    Übrigens kann man das relativ einfach prüfen, indem man im Task-Manager die Speicher"verbräuche" anzeigen lässt. Steigt während eines Programmlaufs der Speicherverbrauch permanent, hat man irgendwo ein "Leak". Gleiches gilt übrigens auch für GDI-Objekte, bzw Objekte im Allgemeinen.
    Daher kann man

    Zitat

    Wie wichtig ist es am Ende eines Skripts mit "_BASS_Free()" alle benutzen Ressources wieder freizugeben?

    mit "unwichtig, aber unsauber" beantworten

  • GDI+ und QuickDraw zu langsam für 65000 pixel

    • Andy
    • 3. März 2012 um 07:31

    Hi,

    Zitat von UEZ

    ASM würde dir hier sehr wahrscheinlich weiterhelfen!

    was heisst hier "sehr wahrscheinlich"?*rofl*

    Ich hab da mal was vorbereitet ;)
    die Palette benötigt trotz AssembleIt nur 2ms auf meinem Gurkenrechner....

    Spoiler anzeigen
    [autoit]

    #include <SliderConstants.au3>
    #include <GDIP.au3>
    #include <assembleit.au3>

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

    Func _farbverlauf()
    _("use32")
    ; _("org " & FasmGetBasePtr($Fasm));nur für _asmdbg()
    _("mov edi,[esp+4]") ;pointer pixel
    _("mov edx,[esp+8]") ;sliderwert

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

    _("mov ecx,0") ;x=0
    _("_xschleife:") ;for x=0 to 255 grün

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

    _("mov ebx,0") ;y=0
    _("_yschleife:") ;for y=0 to 255 ;blau

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

    _("mov eax,0xFF") ;000000AA alpha
    _("shl eax,8") ;0000AA00
    _("or eax,edx") ;0000AARR rot
    _("shl eax,8") ;00AARR00
    _("or eax,ebx") ;00AARRGG grün
    _("shl eax,8") ;AARRGG00
    _("or eax,ecx") ;AARRGGBB blau
    ; _asmdbg_() ;hier kann man sich die registerinhalte anschauen wenn man möchte ;)
    _("mov [edi],eax") ;pixel an adresse schreiben
    _("add edi,4") ;nächstes pixel

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

    _("inc ebx") ;blau=blau+1
    _("cmp ebx,256") ;ist blau=256?
    _("jne _yschleife") ;nein, dann nächstes blau

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

    _("inc ecx") ;grün=grün+1
    _("cmp ecx,256") ;ist grün=256
    _("jne _xschleife") ;nein, dann nächstes grün

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

    _("ret") ;Ende

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

    EndFunc ;==>_farbverlauf

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

    $gui = GUICreate("example", 296, 256)

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

    $slider = GUICtrlCreateSlider(261, 5, 30, 251, BitOR($TBS_VERT, $TBS_TOP, $TBS_LEFT, $TBS_BOTH, $TBS_NOTICKS, $TBS_ENABLESELRANGE))
    GUICtrlSetLimit(-1, 255, 0)

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

    _GDIPlus_Startup()

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

    $graphics = _GDIPlus_GraphicsCreateFromHWND($gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(256, 256, $graphics)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
    $brush = _GDIPlus_BrushCreateSolid()

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

    GUISetState()

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

    $DC_gui = _WinAPI_GetDC($gui)
    Global $ptr, $hbmp ;pointer auf die pixel, handle bitmap
    $DC_bitmap = _CreateNewBmp32(256, 256, $ptr, $hbmp);bitmap erstellen

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

    While GUIGetMsg() <> -3

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

    $a = GUICtrlRead($slider)

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

    ;~ For $b = 0 To 255
    ;~ For $c = 0 To 255
    ;~ $color = "0xFF"&Hex($a, 2) & Hex($b, 2) & Hex($c, 2)
    ;~ _GDIPlus_BitmapSetPixel($bitmap,$b,$c,$color)
    ;~ ;_GDIPlus_BrushSetFillColor($brush, "0xFF" & $color)
    ;~ ;_GDIPlus_GraphicsFillRect($buffer, $b, $c, 1, 1, $brush)
    ;~ Next
    ;~ Next

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

    ; $_assembleit_flag = 1
    Local $ret = _AssembleIt("int", "_farbverlauf", "ptr", $ptr, "int", $a);stride,width,height,scan0,wert

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

    _WinAPI_BitBlt($DC_gui, 0, 0, 256, 256, $DC_bitmap, 0, 0, $srccopy)
    ;_GDIPlus_GraphicsDrawImage($graphics, $bitmap, 0, 0)

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

    WEnd

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

    _GDIPlus_Shutdown()
    _DeleteBitmap32($DC_bitmap, $ptr, $hbmp)

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

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe $HDC und $ptr und handle auf die Bitmapdaten
    $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)
    $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 ;==>_CreateNewBmp32

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

    Func _DeleteBitmap32($DC, $ptr, $hbmp)
    _WinAPI_DeleteDC($DC)
    _WinAPI_DeleteObject($hbmp)
    $ptr = 0
    EndFunc ;==>_DeleteBitmap32

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

    wer AssembleIt und den ASM-Code nicht mitschleppen möchte, setzt _AssembleIt_Flag=0 und verfährt nach den weiteren Anweisungen, also einfach nur mit Ctrl+v den AutoIt-Code einfügen und die Parameter in den Call kopieren.

    Dann erhält man

    Spoiler anzeigen
    [autoit]

    #include <SliderConstants.au3>
    #include <GDIP.au3>

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

    $gui = GUICreate("example", 296, 256)

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

    $slider = GUICtrlCreateSlider(261, 5, 30, 251, BitOR($TBS_VERT, $TBS_TOP, $TBS_LEFT, $TBS_BOTH, $TBS_NOTICKS, $TBS_ENABLESELRANGE))
    GUICtrlSetLimit(-1, 255, 0)

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

    ;assemblercode
    Global $tCodeBuffer = DllStructCreate("byte[62]") ;reserve Memory for opcodes
    DllStructSetData($tCodeBuffer, 1, "0x8B7C24048B542408B900000000BB00000000B8FF000000C1E00809D0C1E00809D8C1E00809C8890783C7044381FB0001000075DE4181F90001000075D0C3") ;write opcodes into memory

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

    GUISetState()

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

    $DC_gui = _WinAPI_GetDC($gui) ;DeviceContext holen
    Global $ptr, $hbmp ;pointer auf die pixel, handle bitmap
    $DC_bitmap = _CreateNewBmp32(256, 256, $ptr, $hbmp);bitmap erstellen

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

    While GUIGetMsg() <> -3
    $a = GUICtrlRead($slider)
    $ret = DllCall("user32.dll", "int", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "ptr", $ptr, "int", $a, "int", 0, "int", 0)
    _WinAPI_BitBlt($DC_gui, 0, 0, 256, 256, $DC_bitmap, 0, 0, 0xCC0020);bitmap in DC blitten
    WEnd

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

    _DeleteBitmap32($DC_bitmap, $ptr, $hbmp)

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

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe $HDC und $ptr und handle auf die Bitmapdaten
    $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)
    $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 ;==>_CreateNewBmp32

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

    Func _DeleteBitmap32($DC, $ptr, $hbmp)
    _WinAPI_DeleteDC($DC)
    _WinAPI_DeleteObject($hbmp)
    $ptr = 0
    EndFunc ;==>_DeleteBitmap32

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


    die Bitmap wird dann in 0.2ms erstellt, Faktor 10000 schneller als per setpixel


    übrigens kann man natürlich auch mit den "GDI+"-Funktionen arbeiten, wenn man den DC und die $hbmp entsprechend umwandelt, einfach hinter dem "While/Wend" einfügen

    [autoit]

    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHDC($DC_Bitmap)
    _GDIPlus_GraphicsDrawline($hGraphics, 1, 1,200,200) ;linie zeichnen
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
    _GDIPlus_ImageSaveToFile($hbitmap, "GDIPlus_Image.jpg");grafik speichern
    shellexecute("GDIPlus_Image.jpg")

    [/autoit]

    man kann das Ganze natürlich noch "extrem" beschleunigen und verkürzen, 8o

    Spoiler anzeigen
    [autoit]

    Func _farbverlauf()
    _("use32")
    ; _("org " & FasmGetBasePtr($Fasm));nur für _asmdbg()
    _("mov edi,[esp+4]") ;pointer pixel
    _("mov edx,[esp+8]") ;sliderwert

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

    _("mov eax,0xFF00") ;0000AA00 alpha
    _("or eax,edx") ;0000AARR rot
    _("shl eax,16") ;AARR0000

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

    _("mov ecx,0") ;x=0
    _("_xschleife:") ;for x=0 to 255 grün

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

    _("mov ebx,0") ;y=0
    _("_yschleife:") ;for y=0 to 255 ;blau

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

    _("mov ah,bl") ;AARRGGBB grün
    _("mov al,cl") ;AARRGGBB blau
    _("stosd")

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

    _("inc ebx") ;blau=blau+1
    _("cmp ebx,256") ;ist blau=256?
    _("jne _yschleife") ;nein, dann nächstes blau

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

    _("inc ecx") ;grün=grün+1
    _("cmp ecx,256") ;ist grün=256
    _("jne _xschleife") ;nein, dann nächstes grün

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

    _("ret") ;Ende

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

    EndFunc ;==>_farbverlauf

    [/autoit]
  • Happy Birthday eukalyptus

    • Andy
    • 2. März 2012 um 17:18

    Glücklichen Herzwunsch und alles Gute!!!
    Bereichere das Forum weiterhin mit deinen tollen Beiträgen.

  • IP in Binär umrechnen und umgekehrt

    • Andy
    • 28. Februar 2012 um 20:42
    Spoiler anzeigen
    [autoit]


    MsgBox(0, 3423413, int2bin(3423413))
    MsgBox(0, 2^3, int8_2bin(2 ^ 3))
    MsgBox(0, @IPAddress1, IP2bin(@IPAddress1))

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

    ;allgemein
    Func int2bin($integer) ;32Bit int in binärstring darstellen
    Local $bin_string = ""
    For $i = 31 To 0 Step -1 ;integer in bits
    If Mod($i + 1, 8) = 0 Then $bin_string &= " ";trenner
    $bin_string &= String(Int(BitAND($integer, 2 ^ $i) / (2 ^ $i)))
    Next
    Return $bin_string
    EndFunc ;==>int2bin

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

    ;8bit
    Func int8_2bin($integer) ;8Bit int in binärstring darstellen
    Local $bin_string = ""
    For $i = 7 To 0 Step -1 ;integer in bits
    If Mod($i + 1, 8) = 0 Then $bin_string &= " ";trenner
    $bin_string &= String(Int(BitAND($integer, 2 ^ $i) / (2 ^ $i)))
    Next
    Return $bin_string
    EndFunc

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

    func IP2bin($IP)
    ;hier gehört das regex rein, um eine reguläre IPv4 zu erkennen^^
    local $ip_array=stringsplit($IP,".",2)
    local $binstring=""
    for $i in $ip_array
    $binstring&=int8_2bin($i)
    next
    return $binstring
    endfunc

    [/autoit]
  • PixelSearch

    • Andy
    • 24. Februar 2012 um 23:03

    Hi,

    Zitat

    bei pixelsearch können ja auch mal andere pixel gefunden werden, die eigentlich nicht gefunden werden sollten

    Ja, aber nur, wenn völlig dilletantisch nach EINEM Pixel gesucht wird^^
    Man sucht eigendlich immer nach einem bestimmten Bereich, also mehreren Pixeln. Da lässt man dann z.B. das obere linke Pixel suchen und vergleicht den gefundenen Bereich mit z.B. PixelChecksum().
    Icons und Buttons werden sehr selten dynamisch erstellt, d.h. bei unterschiedlicher Bildschirmauflösung sind die "Bilder" immer gleich groß (Breite x Höhe).
    PushtheButton sucht und klickt übrigens immens schnell und erstellt auch gleich noch die "Suchbilder":thumbup:

  • Send Key Problem "@"

    • Andy
    • 23. Februar 2012 um 21:59

    Hi,
    ggf ein UTF8 / Ansi /UTF16 Problem?

    [autoit]

    stringtobinary()

    [/autoit]


    Btw, wieso überhaupt Send, wenn es eine Outlook-UDF gibt

  • GDIPlus Fraktale

    • Andy
    • 22. Februar 2012 um 18:15

    Sehr nice,
    aber der Speicherverbrauch ist gewaltig, sobald man die Iterationen etwas erhöht.
    Imho hat UEZ da auch mal Beispiele gemacht, allerdings sieht man bei ihm das "Zeichnen". Habe jetzt keine Ahnung was schneller ist, aber die Path-Funktionen sind jedenfalls sehr einfach anzuwenden!

  • GDIPlus Digitaluhr

    • Andy
    • 21. Februar 2012 um 21:15

    name22, sieht gut aus :thumbup: sehr geschmeidig animiert!

    Jeahaha

    Zitat

    OMG 300 Zeilen Code für ne Uhr

    und wo ist deine Uhr?
    Und bevor du mich fragst, wo meine ist...

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Timers.au3>

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

    Dim $ws[12] = [0, 0, 10, -7, 50, -7, 60, 0, 50, 7, 10, 7] ;Koordinaten Polygonzug: von links nach rechts WAAGRECHTER Balken, von rechts nach links SENKRECHTER Balken
    Dim $ziffer[10] = [239, 10, 118, 94, 154, 220, 253, 14, 254, 222] ;alle gesetzten bits des Indexes in der 7-segmentanzeige ergeben die Ziffer
    Dim $balkenpos[8] = [0, "60.0", "0.0", "60.60", "0.60", "0.60", "0.120", "0.0"] ;position der Leuchtbalken der 7-Segmentanzeige innerhalb der Ziffer
    Dim $p[7][2] ;nimmt die polygonzug-koordinaten zum Zeichnen auf
    $p[0][0] = 6 ;6 Punkte im Polygonzug

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

    Global $hgui = GUICreate('Uhr', 620, 175, -1, -1, $WS_POPUP, $WS_EX_CONTROLPARENT) ;GUI erstellen ohne Rahmen
    GUISetBkColor(0x000000) ;Hintergrund der GUI schwarz
    WinSetTrans($hgui, "", 205) ;transparenz
    GUISetState() ;GUI anzeigen

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

    _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui) ;"Leinwand" erstellen, auf der gezeichnet werden kann
    ;_time()
    _Timer_SetTimer($hgui, 1000, "_TIMER_CALLBACK")

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

    Do ;Endlosschleife, solange bis..
    Until GUIGetMsg() = -3 ;..ESC gedrückt wird

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

    _Timer_KillAllTimers($hgui)
    _GDIPlus_GraphicsDispose($hGraphic) ;freigeben
    _GDIPlus_Shutdown()

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

    Func _TIMER_CALLBACK($hWnd, $Msg, $iIDTimer, $dwTime)
    ;Uhrzeit anzeigen :o)
    For $k = 1 To 6 ;die 6 Ziffern der Uhrzeit
    $setbits = $ziffer[StringMid(String(@HOUR & @MIN & @SEC), $k, 1)] ;gesetzte Bits in der siebensegmentanzeige anhand der Ziffer in der Uhrzeit holen
    For $bitnr = 7 To 1 Step -1 ;alle Bits durchlaufen
    _drawpolygon(BitAND($setbits, 128), $k * 100 - 80 + ($k = 1 Or $k = 3 Or $k = 5) * 20, $bitnr) ;parameter: bit gesetzt ja/nein, position der gesamten ziffer,nummer des bits(gerade=waagrechter balken, ungerade=senkrechter balken)
    $setbits = BitShift($setbits, -1) ;nächstes Bit holen
    Next
    Next
    $brush = _GDIPlus_BrushCreateSolid(0xFF440000 + (@SEC / 2 = Int(@SEC / 2)) * 0xBB0000) ;Pinsel erstellen, wenn Ziffer gerade, dann farbig, ansonsten schwarz
    _GDIPlus_GraphicsFillEllipse($hGraphic, 202, 55, 15, 15, $brush) ;Punkte zeichnen
    _GDIPlus_GraphicsFillEllipse($hGraphic, 402, 55, 15, 15, $brush)
    _GDIPlus_GraphicsFillEllipse($hGraphic, 202, 105, 15, 15, $brush)
    _GDIPlus_GraphicsFillEllipse($hGraphic, 402, 105, 15, 15, $brush)
    _GDIPlus_BrushDispose($brush) ;Pinsel auflösen
    EndFunc ;==>_TIMER_CALLBACK

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

    Func _drawpolygon($bit, $xpos, $bitnr) ;zeichnet einen polygonzug ("Balken") an die entsprechende Position
    $split = StringSplit($balkenpos[$bitnr], ".", 3) ;x- und y-koordinaten des Balkens innerhalb der Ziffer holen
    $b = (($bitnr / 2) = Int($bitnr / 2)) ;$bit gerade => $b = true => Balken waagrecht, ansonsten Balken senkrecht
    $step = -1 + 2 * $b ;schrittweite durch das $WS-Array
    For $i = 11 - 11 * $b To 11 * $b Step 2 * $step ;array mit waagrechten (bit=gerade) oder (Bit=ungerade) senkrechten Balken füllen
    $r = Int(Abs((11 * (Not ($b))) - $i) / 2) + 1 ;abhängig von der Reihenfolge, egal ob $i von 0 bis 11 oder von 11 bis 0, $r muss immer 1,2,3,4,5,6
    $p[$r][0] = $ws[$i] + $split[0] + $xpos ;x- und
    $p[$r][1] = $ws[$i + $step] + $split[1] + 30 ;y-position in das polygonarray schreiben
    Next
    $brush = _GDIPlus_BrushCreateSolid(0xFF440000 + ($bit <> 0) * 0xBB0000) ;wenn bit gesetzt, dann farbig, ansonsten schwarz
    _GDIPlus_GraphicsFillPolygon($hGraphic, $p, $brush) ;Balken zeichnen
    _GDIPlus_BrushDispose($brush)
    EndFunc ;==>_drawpolygon

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

    sind auch "nur" 50 Zeilen Code...

  • BilderVergleich | FASM

    • Andy
    • 20. Februar 2012 um 22:54

    Um den ASM-Teil etwas zu straffen, hier mal die Minimalversion^^

    Spoiler anzeigen
    [autoit]

    Func _asm()
    _("use32") ; 32-Bit Assembler
    ;_("org " & FasmGetBasePtr($Fasm))
    _("mov ebx, dword[esp+4]") ; EBX = Pointer zum ParameterStruct
    _("mov edi, dword[ebx]") ; -\ Bild1
    ; _("mov edx, dword[ebx+12]") ; EDX = $iMode
    _("mov ecx, dword[ebx+8]") ; ECX = PixelCount
    _("mov esi, dword[ebx+4]") ; -\Bild2

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

    _("_nextPixel:")
    _("lodsd") ; -/ EAX = [ESI]PixelColor Bild1
    _("mov ebx, dword[edi]") ; -/ EBX = PixelColor Bild2
    ;hier die verknüpfung angeben
    _("xor eax,ebx") ; -
    ;_asmdbg_()
    _("stosd") ;[EDI]=eax
    _("loop _nextPixel")
    _("ret")
    ;-------------------------

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

    EndFunc ;==>_asm

    [/autoit]


    aufzurufen mit

    [autoit]

    _assembleit("ptr", "_asm", "ptr", DllStructGetPtr($tParameters))

    [/autoit]


    Wer lust hat, asssembliert sich den code und macht für alle erdenklichen Verknüpfungen eine Unterfunktion.
    Diese könnte man dann in eine Listview packen und von dort in eine weitere Liste ziehen, um die Bild"bearbeitungen" dann nacheinander anzuwenden. So könnte man sicher schöne "Filter" zusammenstellen.

    Btw, sämtliche asm-Funktionen, also auch DIV, NOT, OR, MUL usw. sind verwendbar, viel Spass beim experimentieren^^

  • Rubik's Cube

    • Andy
    • 20. Februar 2012 um 21:07

    Meiner fällt bald auseinander, die vielen Tuningeinheiten mit Vaseline haben Spuren hinterlassen.
    Übrigens hatten wir 1981 in der Schule Wettbewerbe, ich hab den Würfel mit einer Hand gelöst und nen Sonderpreis gewonnen. Hehe, ich weiss das deshalb so genau, weil ich in diesem Jahr eine Ehrenrunde gedreht hatte^^

  • BilderVergleich | FASM

    • Andy
    • 20. Februar 2012 um 12:33

    Eins noch, auch problemlos umzusetzen, verschieden große Bilder in die GUI zu ziehen.

    Verknüpfungen simpel und farbig:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <array.au3>
    #include <AssembleIt.au3>

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

    Opt("GUIOnEventMode", 1)
    ;Opt("MustDeclareVars", 1)

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

    _GDIPlus_Startup()
    #region +++++++++ GUI +++++++++
    Global $hGui = GUICreate("Farbdifferenz | Coded by K4z", 905, 750, 214, 108, Default, $WS_EX_ACCEPTFILES)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GuiEvent")
    GUISetOnEvent($GUI_EVENT_DROPPED, "_GuiEvent")

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

    Global $Bild1 = GUICtrlCreateGroup("Bild1", 5, 8, 435, 361)
    Global $idPic1 = GUICtrlCreatePic("", 12, 20, 420, 340), $sPath1

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

    Global $Bild2 = GUICtrlCreateGroup("Bild2", 460, 8, 435, 361)
    Global $idPic2 = GUICtrlCreatePic("", 466, 20, 420, 340), $sPath2

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

    Global $Result = GUICtrlCreateGroup("Result", 230, 384, 435, 361)
    Global $idPic3 = GUICtrlCreatePic("", 237, 396, 420, 340), $sPath3
    GUICtrlSetOnEvent(-1, "_GuiEvent")

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

    GUICtrlCreateGroup("", -99, -99, 1, 1)
    Global $idBtnRed = GUICtrlCreateRadio("Rot", 680, 536, 113, 17)
    GUICtrlSetOnEvent(-1, "_GuiEvent")
    Global $idBtnGreen = GUICtrlCreateRadio("Grün", 680, 561, 113, 17)
    GUICtrlSetOnEvent(-1, "_GuiEvent")
    Global $idBtnBlue = GUICtrlCreateRadio("Blau", 680, 587, 113, 17)
    GUICtrlSetOnEvent(-1, "_GuiEvent")

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

    GUICtrlSetState($idPic1, $GUI_DROPACCEPTED)
    GUICtrlSetState($idPic2, $GUI_DROPACCEPTED)
    GUISetState(@SW_SHOW)
    #endregion +++++++++ GUI +++++++++

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

    Global $tCodeBuffer = DllStructCreate("byte[100]")
    DllStructSetData($tCodeBuffer, 1,"0x8B7424048B5C24088B038946648B43048946688B530C8B4B088B46648B008B5E688B1B83FA0177107208C1E808C1EB08EB06C1E810C1EB1038D8760286C328C3B0FFC1E00888D8C1E00888D8C1E00888D88B5E648903834664048346680483E90177B6C3")
    Global $tParameters = DllStructCreate("ptr scan1;ptr scan2;int size;int mode")

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

    While 1
    Sleep(50)
    WEnd

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

    Func _GuiEvent()
    Switch @GUI_CtrlId
    Case $GUI_EVENT_CLOSE
    _GDIPlus_Shutdown()
    Exit
    Case $GUI_EVENT_DROPPED
    GUICtrlSetImage(@GUI_DropId, @GUI_DragFile)
    If StringRegExp(@GUI_DragFile, '(?i)\.(jpg|bmp)$') Then
    If @GUI_DropId = $idPic1 Then $sPath1 = @GUI_DragFile
    If @GUI_DropId = $idPic2 Then $sPath2 = @GUI_DragFile
    EndIf
    Case $idBtnRed
    If $sPath1 <> '' And $sPath2 <> '' Then
    $sPath3 = _GetColorDifference(0, $sPath1, $sPath2)
    GUICtrlSetImage($idPic3, $sPath3)
    EndIf
    Case $idBtnGreen
    If $sPath1 <> '' And $sPath2 <> '' Then
    $sPath3 = _GetColorDifference(1, $sPath1, $sPath2)
    GUICtrlSetImage($idPic3, $sPath3)
    EndIf
    Case $idBtnBlue
    If $sPath1 <> '' And $sPath2 <> '' Then
    $sPath3 = _GetColorDifference(2, $sPath1, $sPath2)
    GUICtrlSetImage($idPic3, $sPath3)
    EndIf
    Case $idPic3
    If $sPath3 <> '' Then ShellExecute($sPath3)
    EndSwitch
    EndFunc

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

    Func _GetColorDifference($iColor, $sPath1, $sPath2)
    ; $iColor: --- 0=Rot --- 1=Grün --- 2=Blau ---
    Local $hBitmap1, $hBitmap2, $iWidth1, $iWidth2, $iHeight1, $iHeight2

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

    $hBitmap1 = _GDIPlus_BitmapCreateFromFile($sPath1)
    $iWidth1 = _GDIPlus_ImageGetWidth($hBitmap1)
    $iHeight1 = _GDIPlus_ImageGetHeight($hBitmap1)

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

    $hBitmap2 = _GDIPlus_BitmapCreateFromFile($sPath2)
    $iWidth2 = _GDIPlus_ImageGetWidth($hBitmap2)
    $iHeight2 = _GDIPlus_ImageGetHeight($hBitmap2)

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

    If ($iWidth1 <> $iWidth2) Or ($iHeight1 <> $iHeight2) Then
    MsgBox(48, "Fehler", "Unterschiedliche Größen!")
    Return
    EndIf

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

    Local $hBitmapData1 = _GDIPlus_BitmapLockBits($hBitmap1, 0, 0, $iWidth1, $iHeight1, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32RGB)
    Local $hBitmapData2 = _GDIPlus_BitmapLockBits($hBitmap2, 0, 0, $iWidth2, $iHeight2, $GDIP_ILMREAD, $GDIP_PXF32RGB)

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

    DllStructSetData($tParameters, "scan1", DllStructGetData($hBitmapData1, "Scan0"))
    DllStructSetData($tParameters, "scan2", DllStructGetData($hBitmapData2, "Scan0"))
    DllStructSetData($tParameters, "size", $iWidth1 * $iHeight1)
    DllStructSetData($tParameters, "mode", $iColor)

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

    local $_assembleit_flag=0
    _assembleit("ptr", "_asm2","ptr", FasmGetBasePtr($Fasm), "ptr", DllStructGetPtr($tParameters))

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

    ;~ local $a=DllCall("user32.dll", "ptr", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer),"ptr", DllStructGetPtr($tCodeBuffer), "ptr", DllStructGetPtr($tParameters), "int", 0, "int", 0)
    ;~ _arraydisplay($a)
    _GDIPlus_BitmapUnlockBits($hBitmap1, $hBitmapData1)
    _GDIPlus_BitmapUnlockBits($hBitmap2, $hBitmapData2)
    If @error Then Return
    _GDIPlus_ImageSaveToFile($hBitmap1, @TempDir & "\321654r3sult.jpg")

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

    Return @TempDir & "\321654r3sult.jpg"
    EndFunc

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

    Func _asm2()
    _("use32") ; 32-Bit Assembler
    ; _("org " & FasmGetBasePtr($Fasm))
    _("mov esi, dword[esp+4]") ; ESI = BasePointer
    _("mov ebx, dword[esp+8]") ; EBX = Pointer zum ParameterStruct
    _("mov eax, dword[ebx]") ; -\
    _("mov dword[esi+ptrPic1], eax") ; -/ ptrPic1 = Pointer zum ersten Bild
    _("mov eax, dword[ebx+4]") ; -\
    _("mov dword[esi+ptrPic2], eax") ; -/ ptrPic2 = Pointer zum zweiten Bild
    _("mov edx, dword[ebx+12]") ; EDX = $iMode
    _("mov ecx, dword[ebx+8]") ; ECX = PixelCount

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

    _("_nextPixel:")

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

    _("mov eax, dword[esi+ptrPic1]") ; -\
    _("mov eax, dword[eax]") ; -/ EAX = PixelColor Bild1

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

    _("mov ebx, dword[esi+ptrPic2]") ; -\

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

    ;hier kann man experimentieren, statt dem ADD entweder XOR, SUB, AND, OR oder kombinationen einsetzen
    _("ADD eax, dword[ebx]") ; -/ EBX = PixelColor Bild2

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

    _("mov ebx, dword[esi+ptrPic1]") ; -\
    _("mov dword[ebx], eax") ; -/ PixelSetColor: EAX
    _("add dword[esi+ptrPic1], 4") ; - ptrPic1 += 4
    _("add dword[esi+ptrPic2], 4") ; - ptrPic2 += 4
    _("sub ecx, 1") ; - ECX -= 1
    _("ja _nextPixel") ;

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

    _("ret")
    ;-------------------------
    _("ptrPic1 dd ?")
    _("ptrPic2 dd ?")
    EndFunc ;==>_asm

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

    einfach im ASM-code die Zeile entsprechend mit der Vernüpfung ändern....

  • BilderVergleich | FASM

    • Andy
    • 20. Februar 2012 um 12:10

    K4z,
    hehe, Registerpressure....von denen kann man nie genug haben, ist eins der dunklen Seiten der x86-Architektur.

    chip,
    feines Beispiel!
    Farbig ist eigendlich ganz einfach, entweder jeden Farbkanal einzeln voneinander abziehen (supersimpel umzusetzen), oder das "Graubild" erstellen und nachher per YUV-Format den U und V-Kanal dazuaddieren....Spielwiese pur 8o

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™