_LoadBitmap zu langsam (_WinApi)

  • Hey

    Dieser Skript ist mir um einiges zu langsam:

    [autoit]


    Func LoadBitmap($sFilename, $LoadData = False)
    Local $RetArr[3]
    Local $byref
    Local $bih, $bfg, $buffer, $fhandle
    $bfh = DllStructCreate($BITMAPFILEHEADER)
    $bih = DllStructCreate($BITMAPINFOHEADER)
    $fhandle = _WinAPI_CreateFile($sFilename, 2, 2, 0, 0)
    _WinAPI_ReadFile($fhandle, DllStructGetPtr($bfh), DllStructGetSize($bfh), $byref)
    _WinAPI_ReadFile($fhandle, DllStructGetPtr($bih), DllStructGetSize($bih), $byref)
    $RetArr[0] = $bfh
    $RetArr[1] = $bih

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

    If Not $LoadData Then
    _WinAPI_CloseHandle($fhandle)
    Return $RetArr
    EndIf

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

    $buffer = DllStructCreate("byte[" & DllStructGetData($bfh, "size")-54 & "]")
    $RetArr[2] = $buffer
    _WinAPI_ReadFile($fhandle, DllStructGetPtr($buffer), DllStructGetSize($buffer), $byref)
    _WinAPI_CloseHandle($fhandle)

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

    Return $RetArr
    EndFunc ;==>LoadBitmap

    [/autoit]

    Dieser soll 'nur' eine JPG oder ein BMP als _WinApi-Handel laden.
    Wer weiß wie man dies schneller machen kann?

    thx4help ;(

    Nur keine Hektik - das Leben ist stressig genug

    Einmal editiert, zuletzt von Antispeed (6. Mai 2010 um 20:35)

  • Versuch die GDI+ Methode :D.

    [autoit]

    _GDIPlus_BitmapCreateFromFile ;Wenn es unbedingt eine Bitmap sein soll
    _GDIPlus_ImageLoadFromFile

    [/autoit]


    Aber nicht _GDIPlus_Startup/Shutdown und die Resourcenfreigabe vergessen. ;)
    Und wenn du ein HBITMAP Handle benötigst:

    [autoit]

    $hBitmap = _GDIPlus_BitmapCreateFromFile($sFile)
    $HBITMAP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)

    [/autoit]
  • Hmm
    Ich bin iwie blöd:

    [autoit]

    Func _BitHandel($file)
    $f = _GDIPlus_BitmapCreateHBITMAPFromBitmap($file)
    MsgBox(0,5,$f)
    Return $f
    EndFunc

    [/autoit]

    Return von 0..
    wieso?

    Nur keine Hektik - das Leben ist stressig genug

  • Weil du die Datei erst alden musst.

    [autoit]

    _GDIPlus_BitmapCreateFromFile

    [/autoit]


    und davon das Handle beziehen.

  • Ähm weil du dafür BEIDE Befehle brauchst die ich gepostet habe ^^.

    Spoiler anzeigen
    [autoit]

    Func _BitHandel($file)
    $hBitmap = _GDIPlus_BitmapCreateFromFile($file)
    $f = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    MsgBox(0,5,$f)
    Return $f
    EndFunc

    [/autoit]


    Davor muss außerdem _GDIPlus_Startup aufgerufen werden, wie ich vorhin schon gesagt habe.
    Außerdem darfst du das Aufräumen der Ressourcen nicht vergessen. (_GDIPlus_BitmapDispose für die Bitmap und _WinApi_DeleteObject für das HBITMAP Handle)

  • hi
    iw, dass screenshot schon den handel zurückgibt. ist ja nur ein bsp.:

    [autoit]

    #include <File.au3>
    #include <ScreenCapture.au3>
    $hBmp = _TempFile(@TempDir,"~",".jpg")
    _ScreenCapture_Capture($hBmp, 0, 0, -1, -1)
    MsgBox(0,"Handel",_BitHandel($hBmp))

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

    Func _BitHandel($file)
    $hBitmap = _GDIPlus_BitmapCreateFromFile($file)
    $f = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    Return $f
    EndFunc

    [/autoit]

    Nur keine Hektik - das Leben ist stressig genug

  • ^^ sry
    funktioniert super: :D

    [autoit]


    #include <File.au3>
    #include <ScreenCapture.au3>
    #include <GDIPlus.au3>
    $hBmp = _TempFile(@TempDir,"~",".jpg")
    _ScreenCapture_Capture($hBmp, 0, 0, -1, -1)
    MsgBox(0,"Handel",_BitHandel($hBmp))

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

    Func _BitHandel($file)
    _GDIPlus_Startup()
    $hBitmap = _GDIPlus_BitmapCreateFromFile($file)
    $f = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_Shutdown()
    Return $f
    EndFunc

    [/autoit]

    Nur keine Hektik - das Leben ist stressig genug

  • Du hast schon wieder die Hälfte meines Posts überlesen...

    Zitat

    Da steht drin, dass _ScreenCapture_Capture ohne 1.Parameter ein HBITMAP Handle zurückgibt...


    Also geht es so viel einfacher. :rolleyes:

    Spoiler anzeigen
    [autoit]

    #include <ScreenCapture.au3>
    $hBmp = _ScreenCapture_Capture("", 0, 0, -1, -1)
    MsgBox(0,"Handel",$hBmp)

    [/autoit]