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.
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.
Du kannst die Datei aber zippen und wenn sie klein genug ist kannst du sie anschließend auch hochladen.
Du musst schauen wie das Format aufgebaut ist, wenn die Entwickler da keine Dokumentation angegeben haben ist das sehr schwierig Bilder zu extrahieren
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.
Also in VB.NET sieht die gewünschte Funktion so aus:
Public Class MapOrganizer
Dim MapFile As String = "C:\Temp\Graue Bastion_GiTM Djamboo.fc2map"
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
PicBox1.Image = ReadImage(MapFile)
End Sub
Private Function ReadImage(ByVal sFile As String) As Image
Dim MyPicture As Image = Nothing
Dim Offset As Integer = 0
Using FileStream As FileStream = File.OpenRead(sFile)
FileStream.Seek(28, SeekOrigin.Begin) 'Set pointer to initial position
Offset = ReadInt32(FileStream) 'Creator
FileStream.Seek(Offset, SeekOrigin.Current)
FileStream.Seek(8, SeekOrigin.Current)
Offset = ReadInt32(FileStream) 'Author
FileStream.Seek(Offset, SeekOrigin.Current)
Offset = ReadInt32(FileStream) 'Name
FileStream.Seek(Offset, SeekOrigin.Current)
FileStream.Seek(80, SeekOrigin.Current)
ReadInt32(FileStream) 'MapSize
FileStream.Seek(4, SeekOrigin.Current)
ReadInt32(FileStream) 'GameMode
Dim num As Integer = ReadInt32(FileStream)
Dim num2 As Integer = ReadInt32(FileStream)
Dim num3 As Integer = ReadInt32(FileStream)
Dim num4 As Integer = ReadInt32(FileStream)
Dim num5 As Integer = CInt(num * num2 * num3 * num4 / 8)
If num5 > 0 Then
Dim array As Byte() = New Byte(num5 - 1) {}
FileStream.Read(array, 0, num5)
Dim bitmap As Bitmap = New Bitmap(num, num2)
Dim bitmapData As Imaging.BitmapData = bitmap.LockBits(New Rectangle(0, 0, bitmap.Width, bitmap.Height), Imaging.ImageLockMode.WriteOnly, Imaging.PixelFormat.Format32bppArgb)
Marshal.Copy(array, 0, bitmapData.Scan0, num5)
bitmap.UnlockBits(bitmapData)
MyPicture = bitmap
End If
End Using
Return MyPicture
End Function
Private Function ReadInt32(ByVal Stream As FileStream) As Integer
Dim array As Byte() = New Byte(4 - 1) {}
Stream.Read(array, 0, 4)
Return BitConverter.ToInt32(array, 0)
End Function
End Class
Alles 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
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. Hexeditor FTW!
#include <WinAPI.au3>
#include <StructureConstants.au3>
#include <APIGdiConstants.au3>
#include <WindowsConstants.au3>
$inhalt=fileread("Graue Bastion_GiTM Djamboo.fc2map")
[/autoit] [autoit][/autoit] [autoit]$struct_inhalt=dllstructcreate("char["&stringlen($inhalt)&"]")
dllstructsetdata($struct_inhalt,1,$inhalt)
$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
$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
$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
$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
$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
$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
$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
$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
$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
$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
$bmp_len=$width*$height*$bpp
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $bmp_len = ' & $bmp_len & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$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()
Local $ptr_bitmap, $hbmp_bitmap ;byref
$hDC_bitmap = _CreateNewBmp32($width, $height, $ptr_bitmap, $hbmp_bitmap)
$struct_bitmap=dllstructcreate("byte["&$bmp_len&"]",$ptr_bitmap)
dllstructsetdata($struct_bitmap,1,$bmpdata)
_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
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