Bonjour,
Je developpe actuellement un éditeur de map pour un jeu en developpement également, dans le cadre d'un projet de synthèse de fin de DUT informatique.
Voici mon problème :
Nous avons une application réalisée en QT qui genere des Tuiles pour réduire les images : en gros nos tuiles sont sous cette forme:
- Header contenant les Informations de l'image
- Image compressée avec la methode qCompress de QT ( utilisant la zlib )
L'idée c'est que l'éditeur de map est en Java, et que je dois pouvoir recharger les tuiles en questions pour afficher les images correspondantes dans l'éditeur, et pouvoir les exporter en base de donnée avec leur placement ensuite.
Donc pour la lecture des tuile cela fonctionne, j'ai testé, le problème est la decompression de la partie Image du fichier.
J'ai utilisé un Inflater qui me renvoi "Unknown compression Method" si je met le constructeur a false ou rien, et "invalid stored block lengths" si je met le constructeur a true.
Je suis donc un peu bloqué dans l'avancement de ce programme relativement important.
Si quelqu'un a une idée d'ou peut venir le problème, merci d'avance.
Voici mes sources:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 public static byte[] loadImageinFile(File inputFile) throws IOException { FileInputStream fis = new FileInputStream(inputFile); int oct; Vector<Byte> tempor = new Vector<Byte>(); fis.skip(16);// on saute le header while((oct = fis.read()) != -1) tempor.add(new Byte((byte)oct)); byte [] finalbuffer = new byte [tempor.size()]; for(int idx = 0; idx < tempor.size(); idx++) finalbuffer[idx] = tempor.get(idx).byteValue(); return finalbuffer; } public void load(String path) throws DataFormatException { // Lecture du fichier et remplissage des byte array tfile = new File(path); DataInputStream fis = null; FileInputStream fis2 = null; TileHeader theader = new TileHeader(); ByteBuffer bbf = null; if(!tfile.exists()) JOptionPane.showMessageDialog(null,"Fichier inexistant"); else { try { fis2 = new FileInputStream(path); fis = new DataInputStream(new BufferedInputStream(fis2)); theader.signature = Integer.reverseBytes(fis.readInt()); theader.width = Short.reverseBytes(fis.readShort()); theader.height = Short.reverseBytes(fis.readShort()); theader.baseTileWidth = Short.reverseBytes(fis.readShort()); theader.baseTileHeight = Short.reverseBytes(fis.readShort()); theader.baseTileX = Short.reverseBytes(fis.readShort()); theader.baseTileY = Short.reverseBytes(fis.readShort()); System.out.println(theader.signature); System.out.println("Lecture header finie"); /*if(theader.signature != TILE_SIGN) JOptionPane.showMessageDialog(null,"Tuile invalide"); else { //remplissage du tileinfo }*/ tileInfo = new Rectangle(theader.baseTileX, theader.baseTileY, theader.width, theader.height); System.out.println("info tuile : "+tileInfo); System.out.println("Chargement de l'image"); byte[] compressedbuffer = loadImageinFile(tfile); // on lit l'image dans le fichier System.out.println("image chargee"); System.out.println(compressedbuffer); // decompression du buffer Inflater decompresser = new Inflater(true); decompresser.setInput(compressedbuffer); System.out.println("Input selectionnee"); byte[] buffer = new byte[theader.width * theader.height * 4]; System.out.println("buffer alloue"); int resultLength = decompresser.inflate(buffer); System.out.println("decompression faite"); decompresser.end(); System.out.println("Buffer decompresse"); // construction de l'image BufferedImage bfimage = new BufferedImage(tileInfo.width, tileInfo.height, BufferedImage.TYPE_INT_ARGB); System.out.println("bfimage cree"); for(int idy = 0; idy < bfimage.getHeight(); idy++) for(int idx = 0; idx < bfimage.getWidth(); idx++) { byte red = buffer[(idx + idy * bfimage.getWidth()) * 4]; byte green = buffer[(idx + idy * bfimage.getWidth()) * 4 + 1]; byte blue = buffer[(idx + idy * bfimage.getWidth()) * 4 + 2]; byte alpha = buffer[(idx + idy * bfimage.getWidth()) * 4 + 3]; int rgb =0; rgb |= ((int)alpha) << 24; rgb |= ((int)red) << 16; rgb |= ((int)green) << 8; rgb |= ((int)blue); bfimage.setRGB(idx, idy, rgb); } System.out.println("Image recomposee"); this.img = (Image)bfimage; } catch(IOException e) { System.out.println("unable to open inputstream"); } finally { try { fis.close(); } catch(IOException e) { System.out.println("unable to close file"); } } } }
Partager