Image aus Datei extrahieren

  • Hallo zusammen,

    Ist es möglich mit autoit, Image aus einer fc2map Datei zu extrahieren ?

    Ich kann die Datei hier nicht hochladen wegen ungültiger Dateiendung. ( .fc2map )

    Die Map wurde mit dem Far Cry 2 Map Editor erstellt.

    Einmal editiert, zuletzt von VinceA (13. November 2014 um 22:30)

  • Danke für den Hinweis, konnte die Dateien so hochladen.

    Ich habe mich vielleicht nicht richtig ausgedrückt, ich habe hier ein kleines Programm das zeigt in einer PictureBox von jeder Map die angeklickt wird ein Vorschaubild.
    Zum Testen hab ich den FC2Maporganizer und eine Far Cry 2 Map hochgeladen. Das Programm ist in C# geschrieben. Hab den den Code mit Telerik JustDecompile und ILSpy angeschaut, leider versteh ich noch nicht viel C#, bin blutiger Anfänger, deshalb wollte ich wissen ob sowas auch mit Autoit machbar ist.

    4 Mal editiert, zuletzt von VinceA (17. November 2014 um 13:43)

  • Also in VB.NET sieht die gewünschte Funktion so aus:

    Spoiler anzeigen


    Jetzt muss nur noch jemand diese Funktionen in AutoIt umsetzen!

    Und der Beweis, dass es funktioniert ist gleich hier.
    Ich habe die EXE aus VB.NET gleich hochgeladen.
    Einfach starten - wenn ihr möchtet - und Load Map drücken. Danach wird die Karte dargestellt.


    Ich habe die Exe selbst erstellt und weiss, dass sie keinen Virus enthält. Aber im Zweifel lieber einmal mehr prüfen, als einmal weniger.
    Es ist der gleiche Code wie oben im Spoiler, ausser, dass ich beim Button Klick nun den Dateinamen abfrage.

    Gruss Veronesi

    4 Mal editiert, zuletzt von veronesi (17. November 2014 um 15:03)

  • schnell mal getippert...ist ja "nur" eine simple Bitmap, die in der Datei steckt. Lediglich zum Bestimmen der Parameter mussten einige Bytes gezählt werden. 8) Hexeditor FTW!

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <StructureConstants.au3>
    #include <APIGdiConstants.au3>
    #include <WindowsConstants.au3>

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

    $inhalt=fileread("Graue Bastion_GiTM Djamboo.fc2map")

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

    $struct_inhalt=dllstructcreate("char["&stringlen($inhalt)&"]")
    dllstructsetdata($struct_inhalt,1,$inhalt)

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

    $ptr_start=dllstructgetptr($struct_inhalt)+28

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

    $struct_lencreator=dllstructcreate("int",$ptr_start)
    $lencreator=dllstructgetdata($struct_lencreator,1)
    $struct_creator=dllstructcreate("char["&$lencreator&"]",$ptr_start+4)
    $creator=dllstructgetdata($struct_creator,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $creator = ' & $creator & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $struct_lenauthor=dllstructcreate("int",$ptr_start+4+$lencreator+8)
    $lenauthor=dllstructgetdata($struct_lenauthor,1)
    $struct_author=dllstructcreate("char["&$lenauthor&"]",$ptr_start+4+$lencreator+8+4)
    $author=dllstructgetdata($struct_author,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $author = ' & $author & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $struct_lenname=dllstructcreate("int",$ptr_start+4+$lencreator+8+4+$lenauthor)
    $lenname=dllstructgetdata($struct_lenname,1)
    $struct_name=dllstructcreate("char["&$lenname&"]",$ptr_start+4+$lencreator+8+4+$lenauthor+4)
    $name=dllstructgetdata($struct_name,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $name = ' & $name & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $struct_mapsize=dllstructcreate("int",$ptr_start+4+$lencreator+8+4+$lenauthor+4+$lenname+80+4)
    $mapsize=dllstructgetdata($struct_mapsize,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $mapsize = ' & $mapsize & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $struct_gamemode=dllstructcreate("int",$ptr_start+4+$lencreator+8+4+$lenauthor+4+$lenname+80+4+4)
    $gamemode=dllstructgetdata($struct_gamemode,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $gamemode = ' & $gamemode & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $struct_breite=dllstructcreate("int",$ptr_start+4+$lencreator+8+4+$lenauthor+4+$lenname+80+4+4+4)
    $width=dllstructgetdata($struct_breite,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $breite = ' & $width & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $struct_hoehe=dllstructcreate("int",$ptr_start+4+$lencreator+8+4+$lenauthor+4+$lenname+80+4+4+4+4)
    $height=dllstructgetdata($struct_hoehe,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hoehe = ' & $height & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $struct_bpp=dllstructcreate("int",$ptr_start+4+$lencreator+8+4+$lenauthor+4+$lenname+80+4+4+4+4+4)
    $bpp=dllstructgetdata($struct_bpp,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $bpp = ' & $bpp & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $struct_8=dllstructcreate("int",$ptr_start+4+$lencreator+8+4+$lenauthor+4+$lenname+80+4+4+4+4+4+4)
    $8=dllstructgetdata($struct_8,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $8 = ' & $8 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $bmp_start=28+4+$lencreator+8+4+$lenauthor+4+$lenname+80+4+4+4+4+4+4+4
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $bmp_start = ' & $bmp_start & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $bmp_len=$width*$height*$bpp
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $bmp_len = ' & $bmp_len & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $bmpdata=stringmid($inhalt,$bmp_start+1,$bmp_len)

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

    $hgui = GUICreate($name, $width, $height, 1, 1) ;GUI erstellen
    $hdc_gui = _WinAPI_GetDC($hgui) ;HDC holen zum blitten
    GUISetState()

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

    Local $ptr_bitmap, $hbmp_bitmap ;byref
    $hDC_bitmap = _CreateNewBmp32($width, $height, $ptr_bitmap, $hbmp_bitmap)

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

    $struct_bitmap=dllstructcreate("byte["&$bmp_len&"]",$ptr_bitmap)
    dllstructsetdata($struct_bitmap,1,$bmpdata)

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

    _WinAPI_BitBlt($hdc_gui, 0, 0, $width, $height, $hDC_bitmap, 0, 0, $srccopy) ;Bitmap in die GUI blitten

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

    while guigetmsg()<>-3
    wend

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

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
    ;by Andy
    Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, 1, DllStructGetSize($tBMI) - 4) ;Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, 2, $iwidth)
    DllStructSetData($tBMI, 3, -$iheight) ;minus =standard = bottomup
    DllStructSetData($tBMI, 4, 1)
    DllStructSetData($tBMI, 5, 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, '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]