2016-06-19 13 views
1

動的にイメージを作成したい、作成したイメージがいくつかの要件を満たしている必要があります。 作成されたイメージは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; 
    } 
} 
+1

あなたのコードは、PNGに関係ないです。 – leonbloy

+1

最後のコードスニペットは、意図した 'bi'の代わりに' grahpicsGetterBi'イメージに描画しているので動作しません。私はあなたがそれを使って範囲を計算する必要があると理解していますが、その 'Graphics'オブジェクトを処分し、代わりに' bi'から1つを取得し、 'createGraphics()'メソッドを使ってキャストを避けてください。 – haraldK

答えて

1

の代わりint pixel = pixels_raw[i * width + j];それはint pixel = pixels_raw[i * height + j];またはint pixel = pixels_raw[j * width + i];でなければなりません。 width = 2x、height = xの画像があるとします。配列のサイズは2x^2ですが、あなたが要求する最大インデックスは(2x - 1)* 2x + x - 1 = 4x^2 - x - 1です。x> 2の場合は2x^2以上です。

関連する問題