Hallo zusammen,
ich lade von openstreetmap die Karten Tiles. Das funktioniert auch prima. Um nicht bei jedem Zoomwechsel oder beim verschieben der Karte alle Tiles neu laden zu müssen, wollte ich die Tiles cachen. Leider bekomme ich es nicht hin die Tiles zu speichern, bzw. die Bilder sind entweder immer alle schwwarz oder alle komplett transparent.
Meine Vermutung ist, das ich beim Umwandeln des Images in ein BufferedImage den falschen Typ auswähle. Aber igendwie scheint da gar nichts zu funktionieren.
Habe ein Testbeispiel gebaut mit dem man das Problem nachstellen kann:
Wäre super wenn mir einer sagen könnte welchen Type ich verwenden muss, bzw. wie ich die Tiles(PNG-Bilder) anders gespeichert bekomme.
Danke!
Gruß
A.T.
ich lade von openstreetmap die Karten Tiles. Das funktioniert auch prima. Um nicht bei jedem Zoomwechsel oder beim verschieben der Karte alle Tiles neu laden zu müssen, wollte ich die Tiles cachen. Leider bekomme ich es nicht hin die Tiles zu speichern, bzw. die Bilder sind entweder immer alle schwwarz oder alle komplett transparent.
Meine Vermutung ist, das ich beim Umwandeln des Images in ein BufferedImage den falschen Typ auswähle. Aber igendwie scheint da gar nichts zu funktionieren.
Habe ein Testbeispiel gebaut mit dem man das Problem nachstellen kann:
Code:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BufferedImageTest extends JFrame {
public BufferedImageTest() {
super("");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
setLayout(new BorderLayout());
Panel pan = new Panel();
pan.setLayout(new BorderLayout());
add(BorderLayout.CENTER, pan);
setSize(500, 500);
setVisible(true);
pan.setVisible(true);
}
public static void main(String[] args) {
new BufferedImageTest();
}
private class Panel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
// loadAndPaintComponent(g);
loadSaveAndPaintComponent(g);
}
// Bild wird bei jedem paint neu geladen und angezeigt <--- Das funktioniert
private void loadAndPaintComponent(Graphics g) {
URL url = null;
try {
url = new URL("http://tile.openstreetmap.org/" + 16 + "/"
+ 34320 + "/" + 21924 + ".png");
} catch (Exception e) {
e.printStackTrace();
}
g.drawImage(Toolkit.getDefaultToolkit().getImage(url), 0, 0, this);
}
// Bild nur einmal laden und speichern. Dann immer die Gespeicherte <----- Diese Version funktioniert nicht!
// Version verwenden.
private void loadSaveAndPaintComponent(Graphics g) {
String tmpPath = System.getProperty("java.io.tmpdir");
String tmpSavePath = tmpPath + File.separator + "tmpSaveDir";
File tmpSaveDir = new File(tmpSavePath);
if (tmpSaveDir.exists()) {
// Hier wird das schwarze Bild angezeigt. Das Bild im temp Ordner ist bereits schwarz. Laden scheint also zu funktioneren.
g.drawImage(Toolkit.getDefaultToolkit().getImage(tmpSavePath+ File.separator + "tile.png"),0,0,this);
} else {
tmpSaveDir.mkdir();
URL url = null;
try {
url = new URL("http://tile.openstreetmap.org/" + 16 + "/"
+ 34320 + "/" + 21924 + ".png");
} catch (Exception e) {
e.printStackTrace();
}
Image image = Toolkit.getDefaultToolkit().getImage(url);
BufferedImage bufferedImage = new BufferedImage(256, 256,
BufferedImage.TYPE_3BYTE_BGR); //<------------------------------- hier schient das Problem zu liegen?!
Graphics bIG = bufferedImage.createGraphics();
bIG.drawImage(image, 0, 0, null);
bIG.dispose();
try {
ImageIO.write(bufferedImage, "png", new File(tmpSaveDir + File.separator + "tile.png"));
} catch (Exception e) {
e.printStackTrace();
}
g.drawImage(image,0,0,this);
}
}
}
}
Danke!
Gruß
A.T.