Java Landkarte aus Bild erstellen

killingspree

Lieutenant
Registriert
Juli 2007
Beiträge
565
Hallo Leute,

ich bin momentan dabei für mich aus Spaß ein Landkartenprogramm zu schreiben.
Speziell geht es darum für das Spiel DayZ bzw die Standalone Version aus dem gegebenen Kartenmaterial das aus einem JPG besteht eine Zoombare Karte zu erstellen.

Ansich könnte ich natürlich in meinem Programm einfach die JPG Datei einbinden, allerdings ist es ja nicht sinnvoll eine ganze Karte zu laden jenachdem welche Zoomstufe man auswählt.

Gibt es dazu eine Möglichkeit ein Bild in einem Raster zu zerlegen um eben nicht das ganze Bild in den Speicher zu laden?

http://www.dayztv.com/map/chernarus-plus-high-res.jpg wäre die Komplette Karte als JPG

Das es sowas schon fertig auf dayzdb.com/map gibt weiß ich, sehe es auch einfach als Hobbyprojekt :)

Zu meinem Programmier Kenntnissen muss ich sagen das ich so die Basics drauf habe denke ich.

Mfg Robin :)
 
Hatte doch extra dabei geschrieben das ich weiß das es sowas schon fertig gibt, ich das aber als Hobbyprojekt für mich als Programm schreiben möchte ;)
 
Die Karte hat eine Größe von 5MB, da dürfte es wenig Probleme geben denn die ganze Java Swing GUI wird mehr benötigen + Java VM
 
Das ist nicht die komplette Karte, habe sie gerade von GermanDayZ als 320mb Version geladen, also deutlich höhere Auflösung ;)

Da gehts dann schon um den Speicher
 
Das Problem klingt für mich so trivial. Wo hakt es denn?
 
Ich weiß einfach nicht wie ich da rangehen muss um eben die Karte quasi in Felder zu unterteilen um sie eben nicht als ganzes zu laden sondern nur nach bedarf.

Einfach eine Bilddatei in die GUI zu laden und dann per MouseEvent zu skalieren wäre ja zu einfach ^^
 
Achso andererseits sind 320MB auch nicht gerade wahnsinnig viel. Selbst mit nur 32Bit soltlest du noch weit entfernt von den 1.2GB sein, wo es unter Windows Probleme geben würde.
 
Natürlich ist das nicht viel aber ich denke wenn es eine Möglichkeit gibt etwas zu optimieren dann kann man das ja nutzen ;)

Wiegesagt ich habe im Grunde nur Basiskenntnisse in Java.
 
Zuerst solltest du die Karte in verschiedene gröbere Auflösungen konvertieren. ZB maximale Details = maximale Auflösung (320 MB), mittlere Details = halbe Auflösung (~1/4 von 320 MB), geringe Details = Viertel der Auflösung (~1/8 von 320 MB) usw. Du musst schauen, welche Zoomstufen passend sind.

Dann zerlegst du die Karte in Tiles, wobei die Anzahl der Tiles von der Zoomstufe abhängt. Die Größe der Tiles hängt davon ab, was ein guter Kompromiss zwischen Speicherverbrauch und Nachladegeschwindigkeit ist. Machst du einen Tile so groß wie etwa das Fenster ist, dann musst du davon ausgehen, wenigstens 4 davon gleichzeitig anzuzeigen (wobei dann allerdings jeweils nur 1/4 zu sehen ist, man muss aber 4/4 im Speicher halten - das meine ich mit dem Kompromiss). Der Rest ist trivial.

Bis auf eines: Das asynchrone Nachladen und Anzeigen wird nochmal eine Herausforderung für sich.
 
Hast du vll für das arbeiten mit Tiles eine einfach gehaltene Anleitung?

Damit ich das vereinfacht erstmal testen kann?

Klingt ja doch sehr aufwendig ;D
 
Es ist eigentlich überhaupt nicht aufwendig. Im Grunde brauchst du nur ein Array pro Zoomstufe. Und je nachdem, wo man gerade hinschaut, werden die Bilddateipfade aus dem Array abgerufen und dann dementsprechend die Bilder von der Festplatte geladen und angezeigt.

Das stellt auch mit wenigen Programmierkenntnissen kein Problem dar.
 
Irgendwie hört sich das für mich stark nach MipMapping an. ;) (für den Thread-Ersteller zum Nachlesen)

Dann kannst du es evtl. sogar mit lwjgl (oder so etwas in der Richtung) auf die Grafikkarte auslagern :). (Hoffentlich ist es dann nicht schon zu viel was die Textur dann an Speicher frisst.)
 
Schau dir BufferedImage an, da gibt es eine Methode getTile(...)
Glaube damit kannst du ein Bild partiell laden. Ansonsten musst mal bei den Streams schauen, ob sich da der Datenfluss irgendwie manipulieren lässt.

http://docs.oracle.com/javase/7/docs/api/

Ich hätte es in Photoshop zerlegt und dann einfach das entsprechende Stück geladen.
Musst die Files halt gescheit benennen.
 
Zuletzt bearbeitet:
@black90
Einfach nur zerschneiden reicht nicht. Was ist, wenn man rauszoomen will? Dann muss er alles laden und anzeigen. Das ist bei 320 MB nicht mehr praktikabel.
 
Habs soweit erstmal mit 4 Tiles ausprobiert und es funktioniert, allerdings muss ich jetzt mal schauen wie man sie ohne Lücken aneinander anordnet.

Aussehen tut es aktuell so

Unbenannt-2.jpg
 
Also hast das Bild einfach zerschnitten? Weil laden müsste man das 320mb Ding ohnehin, auch wenn man nur einen Teil anzeigen will. Außer man kann irgendwie schon beim Lesezugriff bestimmen was gelesen wird, wobei man wieder wissen muss wie das File gespeichert wurde.
 
Zuletzt bearbeitet:
@black90
Der Trick ist, nur das zu laden, was angezeigt werden soll. Das Zerschneiden des Bilds hilft dabei. Auch lohnt es sich, die einzelnen Zoomstufen getrennt und in passender Auflösung abzuspeichern. Für die Gesamtansicht muss es zB nicht das ganze 320 MB-Bild sein, es reicht auch ein auf zB 1024x1024 Pixel geschrumpftes Bild.
Im Endeffekt muss das Programm dann immer nur mit vielleicht 2-3 MB Daten gleichzeitig umgehen.

Das selbe Prinzip wird zB bei Google Maps verwendet. Deren Satellitenfotos umfassen über 150 TBs. Da muss man einfach genau darauf achten, wie man die übertragenen Datenmengen gering hält.
 
Zurück
Oben