2017-07-18 4 views
0

Ich bin mit einem Tutorial Buch über LWJGL3 gefolgt und ich habe versucht, meinen eigenen Bild laden Code (Der Buch-Code verwendet nicht die STB-Bibliothek) und es funktioniert einwandfrei, wenn das Projekt wird normal ausgeführt (IntelliJ IDE, direkt aus dem Build-Ordner), Es lädt das Bild aus dem ByteBuffer und stbi_load_from_memory funktioniert gut, aber sobald es kompiliert und in eine JAR-Datei eingefügt wird funktioniert es einfach, auch das Bild wurde erfolgreich in den ByteBuffer geladen, als ob die stbi_load_from_memory Funktion nur null zurückgibt, wenn sie in einem Jar ist.LWJGL 3 stbi_load_from_memory funktioniert nicht in jar

Der Code:

public static ByteBuffer loadImage(String fileName, IntBuffer w, 
    IntBuffer h, IntBuffer comp) throws Exception 
    { 
     ByteBuffer image; 
     //the class name is Utils 
     InputStream imageFile = 
     Utils.class.getResourceAsStream(fileName); 

     //The image data gets put into the byte array no matter if 
     //its a jar or not 
     byte[] imageData = new byte[imageFile.available()]; 
     imageFile.read(imageData); 
     ByteBuffer imageBuffer = 
     BufferUtils.createByteBuffer(imageData.length); 
     imageBuffer.put(imageData); 
     imageBuffer.flip(); 
     //imageBuffer is the right size and has the right contents    

     //This is where everything fails if its in a jar, 
     //image is set to null and the Exception is thrown 
     image = stbi_load_from_memory(imageBuffer, w, h, comp, 0); 

     if(image == null) 
     { 
      throw new Exception("Failed to load image: " + fileName); 
     } 

     return image; 
    } 

Es kann keine falsch geschriebene Dateinamen oder Regress Pfad sein, weil es die Daten in das Array lädt richtig, egal ob es ein Glas ist oder nicht.

Weitere Informationen:

  • Java-Version: 1.8.0_131 64bit

  • Prozessorarchitektur: amd64

  • IDE-Version (wenn aus irgendeinem Grund erforderlich): IntelliJ 2017.01.04 Ultimative

  • Betriebssystem: Ubuntu 16.04 LTS 64 Bit

  • Kernel: Linux 4.8.0-58-generic amd64

  • LWJGL Version: 3.1.2

  • Das Projekt in Gradle gemacht 3.3

  • erforderlich, wenn ich werde hochladen und veröffentlichen die Link des gesamten Quellcodes

Antwort

0

Das Problem liegt wahrscheinlich in Ihrem imageFile.available(). Die available Methode von InputStream ist keine gute Möglichkeit, um die Größe des Streams zu erhalten; In der Tat können Sie die Größe des Streams nicht erreichen, Sie müssen es bis zum Ende lesen.

Was Sie tun möchten, ist Ihre InputStream in ein Byte-Array konvertieren. Schau hier, wie man das macht: link. Der Rest des Codes sollte in Ordnung sein. Beachten Sie, dass Sie einen direkten ByteBuffer benötigen, daher funktioniert das Umbrechen des Bytearrays nicht, aber Sie verwenden bereits die richtige Methode (BufferUtils.createByteBuffer).

Falls Sie immer noch Probleme haben, von LWJGL bei diesem Beispiel aussehen: https://github.com/LWJGL/lwjgl3/blob/master/modules/core/src/test/java/org/lwjgl/demo/stb/Image.java#L43

+0

Ok ja das Problem auch nach mehr Debuggen Anscheinend sind die verdammten Arrays sind nicht die gleiche Größe schließlich gefunden (hatte es in eine Datei zu schreiben sowohl für die jar als auch für die non jar Version und überprüfe die Größe und Bytes). Sorry für die späte Antwort war im Urlaub. Danke Kumpel. – MCcomando