動的にイメージを作成したい、作成したイメージがいくつかの要件を満たしている必要があります。 作成されたイメージはpngでなければならず、ファイルから読み込まれたpngの場合と同じ動作をする必要があります。 LWJGLで使用するテクスチャの作成用です。 私はファイルとしてPNGイメージをロードし、BufferedImageを持っているとき、私は私のテクスチャのための次のコードを使用することができます。 を(テクスチャコンストラクタがロードされたイメージで使用するために設計されています)Java:BufferedImageから動的にpngイメージを作成する
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;
}
}
あなたのコードは、PNGに関係ないです。 – leonbloy
最後のコードスニペットは、意図した 'bi'の代わりに' grahpicsGetterBi'イメージに描画しているので動作しません。私はあなたがそれを使って範囲を計算する必要があると理解していますが、その 'Graphics'オブジェクトを処分し、代わりに' bi'から1つを取得し、 'createGraphics()'メソッドを使ってキャストを避けてください。 – haraldK