我想动态创建图像,创建的图像必须满足一些要求。 创建的图像应该是png,并且它必须具有与从文件加载的png相同的行为。 它用于创建在LWJGL中使用的纹理。 当我将png图像作为文件加载并具有BufferedImage时,我可以使用以下代码作为我的纹理: (Texture构造函数设计用于加载图像)
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);
}
}
但是当我尝试动态创建图像而不加载文件中的任何内容时,我在上面代码的第18行得到ArrayIndexOutOfBoundsException
(请参阅代码中的注释)。
当然,它与创建的BufferedImage的每像素位有关。我尝试更改BufferedImage的图像类型,并在初始化pixels_raw
数组时更改数组大小。但我仍然得到数组异常。所以,上面的构造函数方法只有在我传递一个来自加载的png的BufferedImage实例时才有效。当我传入一个我用以下代码动态创建的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;
}
}
答案 0 :(得分:1)
而不是int pixel = pixels_raw[i * width + j];
应该是int pixel = pixels_raw[i * height + j];
或int pixel = pixels_raw[j * width + i];
。考虑你有宽度= 2x和高度= x的图像。那么数组大小是2x ^ 2,而你请求的最大索引是(2x-1)* 2x + x-1 = 4x ^ 2-x-1,对于x> 1,这大于2x ^ 2。 2