2016-06-19 6 views
1

Я хочу динамически создавать изображение, и созданное изображение должно соответствовать некоторым требованиям. Созданное изображение должно быть png, и оно должно иметь такое же поведение, как если бы оно было загруженным png из файла. Это для создания текстуры, используемой в LWJGL. Когда я загружаю PNG изображения как файл и есть BufferedImage, я могу использовать следующий код для моей текстуры: (Конструктор текстура предназначен для использования с загруженными изображениями)Java: динамически создавать png-изображение из BufferedImage

public class Texture { 

    public Texture(BufferedImage bi) { 

     width = bi.getWidth(); 
     height = bi.getHeight(); 

     System.out.println(bi.toString()); 

     int[] pixels_raw = new int[width * height]; 
     pixels_raw = bi.getRGB(0, 0, width, height, null, 0, width); 

     ByteBuffer pixels = BufferUtils.createByteBuffer(width * height * 4); 

     for(int i = 0; i < width; i++) { 
      for(int j = 0; j < height; j++) { 

       int pixel = pixels_raw[i * width + j]; // This is the error line. 
       pixels.put((byte)((pixel >> 16) & 0xFF)); // red 
       pixels.put((byte)((pixel >> 8) & 0xFF)); // green 
       pixels.put((byte)(pixel & 0xFF));   // blue 
       pixels.put((byte)((pixel >> 24) & 0xFF)); // alpha 
      } 
     } 

     pixels.flip(); 

     id = glGenTextures(); 

     glBindTexture(GL_TEXTURE_2D, id); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 


     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 
    } 
} 

Но когда я пытаюсь создайте изображение динамически, не загружая ничего из файла, затем я получаю ArrayIndexOutOfBoundsException в строке 18 вышеуказанного кода (см. комментарий в коде). Конечно, это как-то связано с битами на пиксель созданного BufferedImage. Я попытался изменить тип изображения для своего BufferedImage и изменить размер массива при инициализации массива pixels_raw. Но я все еще получаю исключения из массива. Таким образом, описанный выше метод конструктора работает только при передаче экземпляра BufferedImage, который поступает из загруженного png. Когда я проходил в BurfferedImage, который я создал динамически с помощью кода ниже, он дает мне исключения, о которых я упоминал ранее.

public class TextDrawer { 

    public BufferedImage drawText(String text, Font font, Color color) { 

     BufferedImage graphicsGetterBi = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); 
     Graphics g = graphicsGetterBi.getGraphics(); 
     Graphics2D g2 = (Graphics2D) g; 

     Rectangle2D bounds = font.getStringBounds(text, 0, text.length(), g2.getFontRenderContext()); 

     BufferedImage bi = new BufferedImage((int) bounds.getWidth(), (int) bounds.getHeight(), BufferedImage.TYPE_INT_ARGB); 

     System.out.println("Created the image. \n"); 
     g2.setColor(color); 
     g2.setFont(font); 
     g2.drawString(text, 0, 0); 

     return bi; 
    } 
} 
+1

Ваш код мало или ничего общего с PNG. – leonbloy

+1

Ваш последний фрагмент кода не будет работать, потому что вы рисуете изображение 'grahpicsGetterBi', а не предполагаемое' bi'. Я понимаю, что вам нужно вычислить границы, используя его, но тогда вы должны избавиться от этого объекта Graphics и вместо этого получить его из 'bi', используя метод' createGraphics() ', чтобы избежать отливки. – haraldK

ответ

1

вместо int pixel = pixels_raw[i * width + j]; должно быть int pixel = pixels_raw[i * height + j]; или int pixel = pixels_raw[j * width + i];. У вас есть изображение ширины = 2x и height = x. Тогда размер массива равен 2x^2, а максимальный индекс, который вы запрашиваете, равен (2x - 1) * 2x + x - 1 = 4x^2 - x - 1, что больше, чем 2x^2 для x> 2