2013-09-20 5 views
0

(Oracle Java 1.7, Eclipse Kepler, Ubuntu 12,04 64 бит)Создать DataBufferUShort из ByteBuffer

Мне нужно создать DataBufferUShort из ByteBuffer, но все мои попытки потерпели неудачу во время выполнения ..

Как это делается, por favor?

Вот одна неудача: (java.lang.UnsupportedOperationException)

 ShortBuffer sBuf = imageData.asShortBuffer(); // ByteBuffer 
    DataBufferUShort dataBufferUShort = new DataBufferUShort(sBuf.array(), 
      nPixels); 

Вот трассировки стека. Строка 156 - вторая строка в фрагменте кода выше.

Exception in thread "main" java.lang.UnsupportedOperationException 
at java.nio.ShortBuffer.array(ShortBuffer.java:959) 
at psw.iu.CreateImage.createGrayscaleImage(CreateImage.java:156) 
at psw.iu.TestCreateImage.<init>(TestCreateImage.java:48) 
at psw.iu.TestCreateImage.main(TestCreateImage.java:16) 

Вот метод, который создает ByteBuffer

public static ByteBuffer createScaledData(WorkingByteBuffer rawWBB, 
     ByteBuffer scaledByteBuffer) { 

    rawWBB.byteBuffer.rewind(); // byteBuffer is a ByteBuffer 
    scaledByteBuffer.rewind(); 
    ShortBuffer inBuf = rawWBB.byteBuffer.asShortBuffer(); 
    ShortBuffer outBuf = scaledByteBuffer.asShortBuffer(); 
    inBuf.rewind(); 
    outBuf.rewind(); 
    int maxDN = MAX_USHORT; 
    double scaleFactor = (double) maxDN/(double) range; 

    while (inBuf.hasRemaining()) { 
     int value = 0xffff & inBuf.get(); 
     int scaledValue = (int) ((double) (value - min) * scaleFactor + 0.5); 
     if (scaledValue < 0) 
      scaledValue = 0; 
     if (scaledValue > maxDN) 
      scaledValue = maxDN; 
     outBuf.put((short) scaledValue); 
    } 

    return scaledByteBuffer; 

} 

Редактировать Это не дает никаких ошибок, но это не решение, которое я искал.

 imageData.rewind(); 
    ShortBuffer shortBuffer = imageData.asShortBuffer(); 
    shortBuffer.rewind(); 
    DataBufferUShort dataBufferUShort = new DataBufferUShort(nLines * nPixPerLine); 
    int index = 0; 
    while(shortBuffer.hasRemaining()){ 
     dataBufferUShort.setElem(index++, 0xffff & shortBuffer.get()); 
    } 
+2

Ум, включая репрезентативные примеры кода с ошибкой, который вы пробовали до сих пор? –

+0

@MattBall Неверный пример? –

+1

Нет. Поместите трассировку стека. – EJP

ответ

1

ShortBuffer вы создаете только вид на ByteBuffer и просматривать буферы не поддерживают массив(). Вам нужно создать «настоящий» ShortBuffer с ShortBuffer.allocate() и скопировать данные в него через sbuff.get() из ByteBuffer (сначала перевернув последний).

0

ShortBuffer.array() метод будет возвращать только массив, если исходный ShortBuffer был создан с short[]. в вашем случае ваш ShortBuffer фактически построен поверх byte[] (удерживается ByteBuffer), поэтому это не сработает.

Если вам действительно нужен короткий [], вам необходимо скопировать содержимое ShortBuffer на короткий []. что-то вроде:

short[] shorts = new short[sBuf.remaining()]; 
sBuff.get(shorts); 
+0

У меня такая же ошибка. –

+0

@NateLockwood - вы не можете получить «ту же ошибку». вы больше не должны вызывать метод 'array()', а вместо этого передаете массив 'shorts', который вы только что создали. – jtahlborn

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