Schnelles, nicht prozessorlastiges HBitmap zu byte Array

    • Offizieller Beitrag

    Hallo

    Ich schon wieder ;) Ihr könnt euch bald auf eine komplett neue Ära der LCD Fernsteuerung für die G15 freuen. Diesmal greif ich nämlich direkt auf das SDK zu.
    So, aber nun zu meinem Problem:
    Wenn man ein Bitmap auf der LCD anzeigen will, reicht es nicht, einfach das HBITMAP zu übergeben, sondern man muss das Bitmap in ein byte Array packen.
    Bisher mach ich das so:

    Spoiler anzeigen
    [autoit]

    Global Const $LGLCD_STRUCT_Bitmap160x43x1 = DllStructCreate("dword Format;byte pixel["&$LGLCD_BMP_HEIGHT*$LGLCD_BMP_WIDTH&"]")
    DllStructSetData($LGLCD_STRUCT_Bitmap160x43x1,1,$LGLCD_BMP_FORMAT_160x43x1)
    $hDC_tmp = _WinAPI_GetDC(0)
    $hDC = _WinAPI_CreateCompatibleDC($hDC_tmp)
    _WinAPI_ReleaseDC(0, $hDC_tmp)
    _WinAPI_SelectObject($hDC,$hBitmap)
    For $y = 0 To 42
    For $x = 0 To 159
    $aCall = DLLCall("gdi32.dll","int","GetPixel","int",$hDC,"int",$x,"int",$y)
    $z +=1
    DllStructSetData($LGLCD_STRUCT_Bitmap160x43x1,2, $aCall[0]*255/0xffffff,$z)
    Next
    Next
    _WinAPI_DeleteDC ($hDC)

    [/autoit]

    Dies Funktioniert auch einwandfrei und auch relativ schnell.
    Das Problem allerdings ist, dass diese Funktion ggf. 10 mal in der Sekunde oder sogar öfter aufgerufen wird.
    Und das brauch "ordentlich" Prozessorleistung (bei meinem Quadcore ca 6%) was natürlich über einen langen Zeitraum zu viel ist.

    Hat jemand eine Idee, wie man diesen Vorgang besser machen kann?
    Vielen Dank schonmal :)

    Mfg Spider

  • mach es doch mit GetDIBits ;)

    Spoiler anzeigen
    [autoit]

    #include<gdi\GDI.au3> ; GDI.au3 [ http://progandy.pr.funpic.de/index.php/comp…/id,23/lang,de/ ]
    ; Bitmapinfo mit 256 Farben.
    $tagBMPInfo256 = $tagBITMAPINFOHEADER & "dword RGBQuad[256];"

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

    $BMPInfo = DllStructCreate($tagBMPInfo256)
    MsgBox(0, '', @error)
    DllStructSetData($BMPInfo,1,DllStructGetSize(DllStructCreate($tagBITMAPINFOHEADER,1)))
    DllStructSetData($BMPInfo,"biWidth",160) ; breite 160
    DllStructSetData($BMPInfo,"biHeight",-43) ; höhe 43, negativ, damit oben angefangen wird (definition des Bitmapformats)
    DllStructSetData($BMPInfo,"biPlanes",1)
    DllStructSetData($BMPInfo,"biBitCount",8) ; 1 byte
    DllStructSetData($BMPInfo,"biCompression",$BI_RGB) ; uncompressed
    DllStructSetData($BMPInfo,"biSizeImage",160*43) ; byte-größe der DIBitmap
    DllStructSetData($BMPInfo,"biClrUsed",256) ; verwendete Farben
    ; Farbe 1 bis 127 schwarz, der Rest weiß
    For $i = 1 To 256
    If $i >= 128 Then DllStructSetData($BMPInfo,"RGBQuad",0x00FFFFFF,$i) ; uncompressed
    Next

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

    ; die DLLStruct zur Aufnahme der DIBitmap
    $BMPData = DllStructCreate("byte[" & (160*43) & "]")
    Local $pBMPData = DllStructGetPtr($BMPData) ; Pointer zur DIB
    ; die ersten 43 Zeilen der Bitmap $hBMP holen, mnit den Infos aus Bitmapinfo
    $hBMP = _GDI_GetDIBits($hDC,$hBMP,0,43,$pBMPData,DllStructGetPtr($BMPInfo),$DIB_RGB_COLORS)
    ; Bytes formatiert in eine Datei schreiben
    $data = DllStructGetData($BMPData,1)
    $data = StringTrimLeft($data,2)
    $data = StringRegExpReplace($data,"(.{160}.{160})","$1"&@CRLF)
    FileWrite(@DesktopDir & "\DIBmp_bytes.txt",$data)

    [/autoit]
    • Offizieller Beitrag

    Hallo

    Vielen Dank schon mal für die Antwort, aber so gibt mir dein Script nur nullen (0) in die Datei.
    Testbitmap ist im Anhang
    So hab ich es, ohne Erfolg, probiert:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include<gdi\GDI.au3> ; GDI.au3 [ http://progandy.pr.funpic.de/index.php/comp…/id,23/lang,de/ ]
    ; Bitmapinfo mit 256 Farben.

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

    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap(_GDIPlus_BitmapCreateFromFile("test.bmp"))

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

    $hDC_tmp = _WinAPI_GetDC(0)
    $hDC = _WinAPI_CreateCompatibleDC($hDC_tmp)
    _WinAPI_ReleaseDC(0, $hDC_tmp)
    _WinAPI_SelectObject($hDC, $hBitmap)

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

    $tagBMPInfo256 = $tagBITMAPINFOHEADER & "dword RGBQuad[256];"

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

    $BMPInfo = DllStructCreate($tagBMPInfo256)
    MsgBox(0, '', @error)
    DllStructSetData($BMPInfo, 1, DllStructGetSize(DllStructCreate($tagBITMAPINFOHEADER, 1)))
    DllStructSetData($BMPInfo, "biWidth", 160) ; breite 160
    DllStructSetData($BMPInfo, "biHeight", -43) ; höhe 43, negativ, damit oben angefangen wird (definition des Bitmapformats)
    DllStructSetData($BMPInfo, "biPlanes", 1)
    DllStructSetData($BMPInfo, "biBitCount", 8) ; 1 byte
    DllStructSetData($BMPInfo, "biCompression", $BI_RGB) ; uncompressed
    DllStructSetData($BMPInfo, "biSizeImage", 160 * 43) ; byte-größe der DIBitmap
    DllStructSetData($BMPInfo, "biClrUsed", 256) ; verwendete Farben
    ; Farbe 1 bis 127 schwarz, der Rest weiß
    For $i = 1 To 256
    If $i >= 128 Then DllStructSetData($BMPInfo, "RGBQuad", 0x00FFFFFF, $i) ; uncompressed
    Next

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

    ; die DLLStruct zur Aufnahme der DIBitmap
    $BMPData = DllStructCreate("byte[" & (160 * 43) & "]")
    Local $pBMPData = DllStructGetPtr($BMPData) ; Pointer zur DIB
    ; die ersten 43 Zeilen der Bitmap $hBMP holen, mnit den Infos aus Bitmapinfo
    $hBMP = _GDI_GetDIBits($hDC, $hBitmap, 0, 43, $pBMPData, DllStructGetPtr($BMPInfo), $DIB_RGB_COLORS)
    ; Bytes formatiert in eine Datei schreiben
    $data = DllStructGetData($BMPData, 1)
    $data = StringTrimLeft($data, 2)
    $data = StringRegExpReplace($data, "(.{160}.{160})", "$1" & @CRLF)
    FileWrite(@DesktopDir & "\DIBmp_bytes.txt", $data)

    [/autoit]

    Mfg Spider

  • Moin,

    warum und wo möchtest/musst Du die Bitmap so oft hintereinander zeichnen ?

    Wenn es immer die gleiche Bitmap ist kannst Du sie in ein DIB (Geräteunhabhängiges Bitmap) umwandeln, damit lässt sich für gewöhnlich schneller arbeiten.

    Sieh dir mal die DIB Funktionen und Beispiele in der MSDN an.
    CreateBIBSection
    CreateDIBitmap
    GetBitmapBits
    SetBitmapBits

    EDIT:
    GetDIBits() gibt einen int zurück und kein Bitmaphandle !


    Gruß
    Greenhorn

    p.s. Warum sind 6 % CPU Auslastung zuviel ???


    3 Mal editiert, zuletzt von Greenhorn (26. Dezember 2008 um 19:52)

  • naja wenn er unterschiedliche Sachen darstellen möchte auf der G15 schnell wechselnde Sachen oder Text der von einer zu anderen Seite läuft

    • Offizieller Beitrag

    Hallo

    Genau lev. 6% sind ganz einfach zu viel, weil meiner ein Quadcore ist. Also auf einem Singlecore währen das dann schon 6*4%
    Aber selbst 6% auf einem Singlecore währe zu viel, da die, die eine G15 haben, wahrscheinlich auch Spiele spielen, die oft fast 100% Systemleistung brauchen.

    Mfg Spider

  • @GTA-Spider: Dein Code geht doch... du hast nur _GDIPlus_Startup() vergessen ;)

    Spoiler anzeigen


    //Edit: für eine .BMP kannst du auch _WinAPI_LoadImage( verwenden:

    [autoit]

    $hBitmap = _WinAPI_LoadImage(0,"C:\Pfad\bild.bmp",$IMAGE_BITMAP,0,0,$LR_LOADFROMFILE)

    [/autoit]

    Greenhorn: Du hast schon Recht, GetDIBits gibt kein BitmapHandle zurück. Ich hatte es erst mit CreateDIBSection versucht und vergessen, die Variable zu entfernen ;)

    • Offizieller Beitrag

    Hallo

    Ich geb da mal kein Kommentar zu ab :D Danke auf jedenfall, klappt jetzt einwandfrei ohne CPU Last ;)

    Mfg Spider

    Edit: Ups, da war ich wohl etwas zu schnell.
    Also es funktioniert jetzt relativ gut, aber z.B. bei dem Beispiel BMP werden komische Ränder angezeigt (Pixel die da nicht hingehören)
    Und bei folgendem Bitmap wird der Text nicht angezeigt (also Prozentbar usw schon, nur der Text nicht) sondern nur 2-3 Punkte anstelle des Textes:
    autoit.de/wcf/attachment/3570/
    Der Text ist auch leicht grau und nicht Weiß, obwohl ich weiß angegeben hab bei gdi+
    Der Text sieht dann so aus:

    Spoiler anzeigen

    Hat da jemand eine Idee? Anscheinend arbeitet das Teil nicht ganz sauber.

    Edit2: Mh, also bei diesem By GtaSpider BMP: Ich hab hier mal die Stellen Fett markiert die angezeigt werden, es aber nicht sollten.
    z.B. beim G unten

    Spoiler anzeigen

    0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A4FFFFFFFFFFFFFFFFFFFFFFFF079B00000052F6FFFFFFFFF700000000000000009BFFFFFFFFFF5B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0700000052FFFFFFFFFFA40000000000009BFFFFFFFFFF9B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF070000009BFFFFFFFFFF9B0000000052F6FFFFFFFF9B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525252525252525252525252529BF6FFFFFFFF520000009BFFFFFFFFFF9B000052F6FFFFFFFFA400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004908FFFFFFFF52000000009BFFFFFFFFFF9B0008FFFFFFFFF70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60000000000009BFFFFFFFFFF08FFFFFFFFF7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5200000000000000F7FFFFFFFFFFFFFFFF0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF070000000000000000F7FFFFFFFFFFFF070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFF08A4A4A4A4A4A4A4A4A408FFFFFFFF520000000000000000F7FFFFFFFF07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFF07000000000000000000A4FFFFFFFF52000000000000000000FFFFFFFFA4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF600000000000000000000FFFFFFFFA4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65B00000000000000000000FFFFFFFFA4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7490000000000000000000000FFFFFFFFA4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009BA4A4A4A4A4A4A4A4A4A4A4A4A4520000000000000000000000000000070707079B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000005252525252525252525252520000005252525252525252525252525252520000000000525200000000000000000000000000000052525252525252525252525252525200000000525252525252525252525200000000000049525252520000000049525252525252525200000000000000005252525252525252525252525252524900000052525252525252525252520000000000000000
    00000000009B07FFFFFFFFFFFFFFFFFFFFFFFFA40000F7FFFFFFFFFFFFFFFFFFFFFFFFFFF6520000005207FFFF07520000000000000000000000A4F6FFFFFFFFFFFFFFFFFFFFFFFFFFFF9B000000F7FFFFFFFFFFFFFFFFFFFFFFF6F752000000A4FFFFFFFF00000049F6FFFFFFFFFFFFFFFFFF08A44900000052FFFFFFFFFFFFFFFFFFFFFFFFFFFF07000000F7FFFFFFFFFFFFFFFFFFFFFFFF08A40000000000
    0000005207FFFFFFFFFFFFFFFFFFFFFFFFFFF70000A4FFFFFFFFFFFFFFFFFFFFFFFFFFFF5200000000F6FFFFFFFFF60000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4000000A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B0000A4FFFFFFFF00000007FFFFFFFFFFFFFFFFFFFFFFFFF6A4000052FFFFFFFFFFFFFFFFFFFFFFFFFFF6490000A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65B000000
    000052F6FFFFFFFFFFFFFFFFFFFFFFFFFF0700009BFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B0000000007FFFFFFFFFFFF070000000000000000F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B00A4FFFFFFFF0000F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA40052FFFFFFFFFFFFFFFFFFFFFFFFFF5200009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF520000
    000008FFFFFFFF08A45252525252525252490000525252525252FFFFFFFFF75252525200000000A4FFFFFFFFFFFFFFFFA400000000000000F6FFFFFFFF9B525252525252525252520000000052525252525252525252525252A4F6FFFFFF0800A4FFFFFFFF0000525252525252525252529BF7FFFFFFFFFF5252FFFFFFFFA45252525252525252000000525252525252525252525252525BF7FFFFFFFFF70000
    005BFFFFFFFFF700000000000000000000000000000000000000FFFFFFFFA4000000000000005BFFFFFFFFFFFFFFFFFFFF5200000000000008FFFFFFFFF7A4A4A4A4A4A4A4A4A452000000000000000000000000000000000000A4FFFFFFFF00A4FFFFFFFF00000000000000000000000000009BFFFFFFFFF752FFFFFFFF52000000000000000000000000000000000000000000000000000007FFFFFFF60000
    00A4FFFFFFFF49F70707070707070707070707A4000000000000FFFFFFFFA400000000000049F6FFFFFFFFA4F7FFFFFFFF08000000000000A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF085B00000000000000000000000000000000A4FFFFFFFF00A4FFFFFFFF005207070707520000000000000000F7FFFFFFFF52FFFFFFFFFFFFFFFFFFFFFFFFFFFF9B0000000000000000000000000000000007FFFFFFF60000
    0007FFFFFF070052FFFFFFFFFFFFFFFFFFFFFF07000000000000FFFFFFFFA400000000000007FFFFFFFF07000008FFFFFFFFF7000000000000F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B0052525252525252525252525252A4F6FFFFFF0800A4FFFFFFFF0052FFFFFFFF5200000000000000009BFFFFFFFF52FFFFFFFFFFFFFFFFFFFFFFFFFFA40000525252525252525252525252525BF7FFFFFFFFF70000
    00F7FFFFFF0800009BFFFFFFFFFFFFFFFFFFFF07000000000000FFFFFFFFA40000000000A4FFFFFFFFF600000052FFFFFFFFFFA400000000000052F7F6FFFFFFFFFFFFFFFFFFFFFFFFFFFF49FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B00A4FFFFFFFF0052FFFFFFFF520000000000000000A4FFFFFFFF52FFFFFFFFFFFFFFFFFFFFFFFFF7000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6520000
    009BFFFFFFFF520000A40707070707F6FFFFFF07000000000000FFFFFFFFA4000000005BFFFFFFFFFF5200000000A4FFFFFFFFFF52000000000000000000000000000000000052F6FFFFFFA4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B0000A4FFFFFFFF0052FFFFFFFF52000000000000000008FFFFFF0752FFFFFFFFF7A4A4A4A4A4A4A400000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF652000000
    0000F6FFFFFFF69B0000000000000007FFFFFF07000000000000FFFFFFFFA400000049F6FFFFFFFFA4000000000000F7FFFFFFFF0800000000000000000000000000000000000008FFFFFFA4FFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F752000000A4FFFFFFFF0052FFFFFFFF520000000000004907FFFFFFFF9B52FFFFFFFF520000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF070000000000
    00009BFFFFFFFFFFF6070707070707F6FFFFFF07000000000000FFFFFFFFA400000007FFFFFFFFF70007FFFFFFFFFFFFFFFFFFFFFFF7000000005B0707070707070707070707F6FFFFFFFF52FFFFFFFFF7525252525252525252000000000000A4FFFFFFFF0052FFFFFFFF07070707070707FFFFFFFFFF070052FFFFFFFF070707070707070707070752FFFFFFFFF752525252525B07FFFFFFFFFFA400000000
    0000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07000000000000FFFFFFFFA40000F7FFFFFFFF0800A4FFFFFFFFFFFFFFFFFFFFFFFFFF9B000052F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF700FFFFFFFFA4000000000000000000000000000000A4FFFFFFFF0052FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07000052FFFFFFFFFFFFFFFFFFFFFFFFFFFFA400FFFFFFFFA400000000000000F7FFFFFFFFFFF7000000
    000000005207FFFFFFFFFFFFFFFFFFFFFFFFFF07000000000000FFFFFFFFA4009BFFFFFFFFFF525BFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6520007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA40000FFFFFFFFA4000000000000000000000000000000A4FFFFFFFF0052FFFFFFFFFFFFFFFFFFFFFFFFFFF6A400000052FFFFFFFFFFFFFFFFFFFFFFFFFFF70000FFFFFFFFA40000000000000000A4FFFFFFFFFF075200
    00000000000052A4F707070707070707070707A4000000000000070707079B00A4A4A4A4A45B00A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A49BA407070707070707070707070707F7A449000000070707079B0000000000000000000000000000009B0707070700520707070707070707070707A45B000000000052070707070707070707070707F7000000070707079B0000000000000000005B0707070707F749
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000[/code]

    Edit3: Achso, mit der alten Version hat das alles einwandfrei geklappt.

    • Offizieller Beitrag

    Hallo

    Hab noch was herausgefunden:
    So gibt getDIBits das By GtaSpider BMP aus:

    Spoiler anzeigen

    Und so gibt GetPixel das BMP aus:

    Spoiler anzeigen

    Man sieht sehr gut, das unten rechts in der Ecke vom G bei GetPixels ein 8F steht (richtig) und von dem getDIBits ein A4 steht (falsch)

    Hat dafür jemand eine Erklärung?

    Mfg Spider

  • das könnte daran liegen, dass den Farbwerten in der Farbtabelle nur Weiß und schwarz zugeordnet wird. Könnte man mal mit Graustufen versuchen ;)

    [autoit]

    ; Farbe 1 bis 127 schwarz, der Rest weiß
    ; aber mal Test, da Grausufen mit reinzumachen:
    For $i = 0 To 255
    DllStructSetData($BMPInfo, "RGBQuad", BitOr(BitShift($i,-16),BitShift($i,-8),$i), $i+1) ; uncompressed
    Next

    [/autoit]


    //Edit: Nein, das liegt daran, dass GetDIBits die Farben in der RGBQuad-Tabelle selbst zuordnet. Die verwendeten Farben werden einfach der Reihen nach reingeschrieben und nicht den Farben angepasst, die man selbst in der Tabelle setzt.

    Einmal editiert, zuletzt von progandy (28. Dezember 2008 um 11:01)

    • Offizieller Beitrag

    Hallo

    Genau. Wenn ich dort eine Zahl größer als 8 eingebe (16,24,32) wird nichts auf dem LCD angezeigt.
    Wenn ich da 8 eingebe, wird alles angezeigt bis auf der Text (der halt leicht grau ist, GetDIBits zeigt es aber als 0x08 an (fast schwarz, es ist aber eher weiß)
    Wenn ich da 4 eingebe, wird der Text zwar angezeigt, aber viel kleiner (halb so groß) wie er eigentlich sein sollte. Dadurch kann man ihn halt auch nicht lesen :(
    Bei 1 oder 0 wird wieder nichts angezeigt.

    Mfg Spider

  • Ich habe es mal etwas umgeschrieben und getestet (mit WINE) ...

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GDI/GDI.au3> ; GDI.au3 [ http://progandy.pr.funpic.de/index.php/comp…/id,23/lang,de/ ]
    ; Bitmapinfo mit 256 Farben.

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

    Global Const $IMAGE_BITMAP = 0
    Global Const $LR_LOADFROMFILE = 16

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

    Global $hBitmap, $hBitmapOld, _
    $hdcMem, $hdcTmp, _
    $BMPInfo, $BMPData, _
    $hInst = _WinAPI_GetModuleHandle (0)

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

    $hBitmap = _WinAPI_LoadImage ($hInst, "test.bmp", $IMAGE_BITMAP, 160, 43, $LR_LOADFROMFILE)

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

    $hdcTmp = _WinAPI_GetDC (0)
    $hdcMem = _WinAPI_CreateCompatibleDC ($hdcTmp)
    _WinAPI_ReleaseDC (0, $hdcTmp)
    $hBitmapOld = _WinAPI_SelectObject ($hdcMem, $hBitmap)

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

    $tagBMPInfo256 = $tagBITMAPINFOHEADER & "dword RGBQuad[256];"

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

    $BMPInfo = DllStructCreate ($tagBMPInfo256)
    MsgBox(0, '', @error)
    DllStructSetData ($BMPInfo, 1, DllStructGetSize(DllStructCreate($tagBITMAPINFOHEADER, 1)))
    DllStructSetData ($BMPInfo, "biWidth" , 160) ; breite 160
    DllStructSetData ($BMPInfo, "biHeight" , -43) ; höhe 43, negativ, damit oben angefangen wird (definition des Bitmapformats)
    DllStructSetData ($BMPInfo, "biPlanes" , 1)
    DllStructSetData ($BMPInfo, "biBitCount" , 8) ; 1 byte
    DllStructSetData ($BMPInfo, "biCompression", $BI_RGB) ; uncompressed
    DllStructSetData ($BMPInfo, "biSizeImage" , 160 * 43) ; byte-größe der DIBitmap
    DllStructSetData ($BMPInfo, "biClrUsed" , 256) ; verwendete Farben
    ; Farbe 1 bis 127 schwarz, der Rest weiß
    For $i = 1 To 256 ; 0xbbggrr
    If $i >= 128 Then DllStructSetData($BMPInfo, "RGBQuad", 0xFFFFFF00, $i) ; uncompressed
    Next

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

    ; die DLLStruct zur Aufnahme der DIBitmap
    $BMPData = DllStructCreate("byte[" & (160 * 43) & "]")
    Local $pBMPData = DllStructGetPtr($BMPData) ; Pointer zur DIB
    ; die ersten 43 Zeilen der Bitmap $hBMP holen, mnit den Infos aus Bitmapinfo
    _GDI_GetDIBits($hdcMem, $hBitmap, 0, 43, $pBMPData, DllStructGetPtr($BMPInfo), $DIB_RGB_COLORS)
    ; Bytes formatiert in eine Datei schreiben
    $data = DllStructGetData($BMPData, 1)
    $data = StringTrimLeft($data, 2)
    $data = StringRegExpReplace($data, "(.{160}.{160})", "$1" & @CRLF)
    FileWrite(@DesktopDir & "\DIBmp_bytes.txt", $data)

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

    Func OnAutoItExit ( )
    ; Selbsterzeugte GDI-Objekte müssen wieder freigegeben werden,
    ; sonst Speicherlecks !!!
    _WinAPI_DeleteDC ($hdcMem)
    _WinAPI_DeleteObject (_WinAPI_SelectObject ($hdcMem, $hBitmapOld))

    EndFunc

    [/autoit]


    ... und bekomme folgende Werte:

    Spoiler anzeigen


    LoadImage

    sieh dir mal fuLoad an ... (LR_CREATEDIBSECTION, LR_MONOCHROME)

    Den Code kann man also noch optimieren ...


    Gruß
    Greenhorn


  • das problem ist, dass die farbindexe in die bitmap gespeichert werden. Diese werden jedoch durch getdibits belegt, daher ist die Reihenfolge der Farben nicht bestimmbar.
    Daher solltest du doch CreateDIBSection nehmen. der in der LCDUI sdk geht es z.B. so:
    http://svn.baysse.fr/svn/pouchintv/…DK_1.04.153.zip

    LCDGfx.cpp
    • Offizieller Beitrag

    Hallo

    Danke erstmal ihr Beiden. Wenn ich bei der Version von Greenhorn $LR_MONOCHROM anfüge, funktioniert alles so wie es soll :)
    Muss jetzt nur noch irgendwie von dem LoadImage wegkommen, da das Bild normalerweise ja aus dem Speicher und nicht von einer Datei gelesen wird, aber das schaff ich schon.
    Andy: Ok, das werde ich mir auch mal angucken. Werd mich dann gleich nochmal melden.

    Was tät ich nur ohne euch :love:

    Mfg Spider

  • Was tät ich nur ohne euch :love:


    deine Zeit mit google verschwenden ^^
    Greenhorn: du hast schon recht, bei RGBQuad ist die byte-folge BGR - reserved.
    Aber DWORD hat zu BYTE[4] die umgekehrte Byte-Folge, also reserved-RGB:

    [autoit]

    $dword = DllStructCreate("dword")
    $bytes = DllStructCreate("byte[4]",DllStructGetPtr($dword))
    DllStructSetData($dword,1,0x10203040)

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

    MsgBox(0, '', "DWORD: 0x" & Hex(DllStructGetData($dword,1)) & @CRLF & "4 BYTES: " & DllStructGetData($bytes,1) & @CRLF & _
    "--> DWORD: ARGB, BYTE: BGRA")

    [/autoit]


    also musst du nicht 0xFFFFFF00 für weiß angeben, sondern 0x00FFFFFF == 0xFFFFFF ;)

  • Hallo

    Danke erstmal ihr Beiden. Wenn ich bei der Version von Greenhorn $LR_MONOCHROM anfüge, funktioniert alles so wie es soll :)
    Muss jetzt nur noch irgendwie von dem LoadImage wegkommen, da das Bild normalerweise ja aus dem Speicher und nicht von einer Datei gelesen wird, aber das schaff ich schon.
    Andy: Ok, das werde ich mir auch mal angucken. Werd mich dann gleich nochmal melden.

    Was tät ich nur ohne euch :love:

    Mfg Spider


    Sieh dir doch mal das Beispiel von Andy an, hier, vielleicht hilft dir das ein wenig weiter ...

    Andy
    Ja, da haste Recht. ;)

    Gruß
    Greenhorn