2015-11-13 3 views
1

У меня есть ByteBuffer, в котором хранится изображение RGBA произвольных размеров. Я пытаюсь наложить некоторые части этого изображения треугольниками одного, случайного, цвета RGBA. Тем не менее, я получаю IndexOutOfBoundsException, что не имеет смысла для меня.ByteBuffer за пределами исключения

public ByteBuffer getByteBuffer() 
{ 
    /*Creates a ByteBuffer containing an image of a single background colour. A single pixel in the image is 
    represented as a float array of size 4*/ 
    ByteBuffer buffer = Helpers.getBGByteBuffer(new float[]{1f, 1f, 1f, 1f}, width * height * 4 * Float.BYTES); 
    ByteBuffer triBuffer; 
    int  offset; 

    for(RenderTriangle triangle : triangleList) 
    { 
     offset = triangle.getOffset().y; //Indicates the offset (position) of the triangle in relation to the image 
     triBuffer = triangle.getByteBuffer(); //Gets the ByteBuffer of the triangle. 

     for(int i = 0; i < triBuffer.capacity(); i += 4 * Float.BYTES) //Float.BYTES = 4 
     { 
      byte[] rgba1 = new byte[4 * Float.BYTES]; 
      byte[] rgba2 = new byte[4 * Float.BYTES]; 

      triBuffer.get(rgba1, i, rgba1.length); //Throws exception for i = 16 
      buffer.get(rgba2, offset + i, rgba2.length); 

      byte[] rgbaAdded = Helpers.addBytesAsFloats(rgba1, rgba2); //Calculates resulting RGBA value 

      buffer = buffer.put(rgbaAdded, offset + i, rgbaAdded.length); 
     } 
    } 
    return buffer; 
} 

Приведенный выше код бросает исключение на второй итерации для-петли (так я = 16) в

triBuffer.get(rgba1, i, rgba1.length), 

Некоторые соответствующие значения отладки на второй итерации, как раз перед тем исключением является брошенный:

offset = 0 
i = 16 
rgba1 = {byte[16]@xxx} 
rgba2 = {byte[16]@xxx} 
triBuffer = {[email protected]}"java.nio.HeapByteBuffer[pos=16 lim=64 cap=64]" 
buffer = {[email protected]}"java.nio.HeapByteBuffer[pos=32 lim=64 cap=64]" 

ответ

0

Я считаю, что эта строка неверна.

Поскольку ByteBuffer является буфером, он использует свой собственный индекс, чтобы отслеживать, где он был, поэтому, когда вы читаете 16 байт, в следующий раз, когда вы читаете, вы будете читать следующие 16 байт (вы не вернетесь к началу).

В вашей строке параметр i фактически обозначает позицию целевого массива, в которую нужно вставить.

Так что я считаю, что правильная линия должна быть: triBuffer.get(rgba1, 0, rgba1.length)

Может быть, вы должны сделать то же самое для другой ByteBuffer, я не уверен.

+0

Это действительно была проблема, мне также пришлось перемотать «буфер» 16 байт после каждой операции получения, чтобы учесть, что позиция буфера перемещается после чтения из нее. – user1870238

Смежные вопросы