ImageIO.read ();вешать - PullRequest
       11

ImageIO.read ();вешать

0 голосов
/ 08 июня 2018

Хотя я видел, как некоторые люди говорили об этой проблеме, я не смог найти однозначного ответа.

В этом блоке программа будет зависать на ImageIO.read ()

System.out.println("1");
BufferedImage image = null;
System.out.println("2");
FileInputStream fis = prepareFile("./Textures/" + loc); <<-- "./Textures/TreeSmall.png"
System.out.println("3");
try {
    System.out.println("4"); <<- Logs
    image = ImageIO.read(fis); <<--Hangs
    System.out.println("5"); <<- Never reached
} catch (IOException e) {
    System.err.println("Unable to load Texture");
        System.exit(1);
    }

Я видел предложение использовать аргумент загрузки -Djava.awt.headless=true, и хотя это останавливает его зависание - он просто выпускает эту ошибку и не читает файл:

4
2018-06-08 10:29:42.742 java[2345:45920] [JRSAppKitAWT markAppIsDaemon]: Process manager already initialized: can't fully enable headless mode.
5

Вот инкапсулирующий класс:

...

public class TextureEngine {
    public int textureID;
    public TextureEngine(String loc){ 
            try {

                System.out.println("1");
               BufferedImage image = null;
               System.out.println("2");
               FileInputStream fis = prepareFile("./Textures/" + loc);
               System.out.println("3");

                   System.out.println("4");
                   image = ImageIO.read(fis);
                   System.out.println("5");


              int[] pixels = new int[image.getWidth() * image.getHeight()];
                image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());

                ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4);
                System.out.println("3");
                for(int y = 0; y < image.getHeight(); y++){
                    for(int x = 0; x < image.getWidth(); x++){
                        int pixel = pixels[y * image.getWidth() + x];
                        buffer.put((byte) ((pixel >> 16) & 0xFF));   
                        buffer.put((byte) ((pixel >> 8) & 0xFF));   
                        buffer.put((byte) (pixel & 0xFF));   
                        buffer.put((byte) ((pixel >> 24) & 0xFF)); 
                    }

                buffer.flip();

                textureID = glGenTextures(); 
                glBindTexture(GL_TEXTURE_2D, textureID); 

                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);

                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

                glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
                glBindTexture(GL_TEXTURE_2D, 0);

           }
               } catch (Throwable t) {
                   System.err.println("Unable to load Texture");
                   System.exit(1);
               }
    }
        public static FileInputStream prepareFile(String loc){
            File file = new File(loc);
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(file);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return fis;
        }
        protected void finalize() throws Throwable{
            glDeleteTextures(textureID);
            super.finalize();
        }
           public void bind(int sampler){
               if(sampler >= 0 && sampler <= 31){
                    glActiveTexture(GL_TEXTURE0 + sampler);
                    glBindTexture(GL_TEXTURE_2D, textureID);
               }
    }
}

Который называется так:

TextureEngine tex = new TextureEngine("TreeSmall.png");
    //Menu Loop
    while (!glfwWindowShouldClose(window)) {
        glfwPollEvents();
        tex.bind(0);
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_QUADS);
        glTexCoord2f(0,0);
        glVertex2f(-0.9f, 0.9f);

        glColor4f(0,0,0,0);
        glTexCoord2f(0,1);
        glVertex2f(0.9f, 0.9f);
        glTexCoord2f(1,1);
        glVertex2f(0.9f, -0.9f);
        glTexCoord2f(1,0);
        glVertex2f(-0.9f, -0.9f);
        glEnd();

Я попытался выполнить синтаксический анализ ByteArray как таковой:

Path texture = Paths.get("./Textures/" + loc);
byte[] fis = Files.readAllBytes(texture);
ByteArrayInputStream textureBIS = new
ByteArrayInputStream(fis);
System.out.println("4");
image = ImageIO.read(textureBIS);
System.out.println("5");

И с использованием BufferedImage - но он все еще висит на той же строке, 'ImageIO.read ();'

Я использую Hackintosh и слышал, что это может быть проблема с этимОС (я на 10.12.6)

Я довольно новичок в Java, и не совсем уверен, как продолжить, какие-нибудь указатели?

1 Ответ

0 голосов
/ 08 июня 2018

Три вещи для рассмотрения:

  1. Посмотрите на prepareFile, ваш входной поток может блокироваться в зависимости от того, что вы там делаете.

  2. В вашем примере также не учтена возможность возникновения неконтролируемой RuntimeException или Error.Так как это не отдельная программа с собственным public static void main() {}, мы не можем знать, завершится ли программа, если, например, из-за неправильной установки зависимостей здесь выдается NoClassDefFoundError.

    Если выу вас нет IDE, которая может показать, так ли это, тогда просто для отладки вы можете свернуть все это в } catch (Throwable t) { }, чтобы проверить.Если это действительно зависание, то, как вы сказали, у вас могут быть проблемы с ОС.

  3. Быстрый поиск в Интернете показывает, что некоторые пользователи Java на Mac видели, как ImageIO зависает при чтении изфайл, который, конечно, странно.Вы можете изолировать это далее, читая массив FileInputStream в byte, а затем передавая его как ByteArrayInputStream в ImageIO, но на этом этапе я буду проверять версии программного обеспечения.

...