java - 从 ByteBuffer 创建 DataBufferUShort

标签 java awt nio

(Oracle Java 1.7、Eclipse Kepler、Ubuntu 12.04 64 位)

我需要从 ByteBuffer 创建一个 DataBufferUShort,但我的所有尝试在运行时都失败了。

这是怎么做到的,拜托

这是一个失败:( 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());
    }

最佳答案

您创建的 ShortBuffer 只是 ByteBuffer 的一个 View , View 缓冲区不支持 array()。您需要使用 ShortBuffer.allocate() 创建一个“真正的”ShortBuffer,并通过 sbuff.get() 从 ByteBuffer 将数据复制到其中(首先翻转后者)。

关于java - 从 ByteBuffer 创建 DataBufferUShort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18922906/

相关文章:

java - SimpleDateFormat解析异常和替代方法差异

java - 审计实体 JPA 中的更改

java - 在 Java7 的 FileWalking 树中解决访问被拒绝的问题

sockets - Netty并发和 "Connection reset by peer"

java - 如何制作包含DLL的Jar?

java - 每当选择相邻选项卡时都会调用选项卡的 onCreateView 吗?

java - 用 FXGraphics2D 替换 java 中的剪辑 (Java.awt)

java - jpanel 与其他组件重叠

java.awt.Frame.setBackground() 在 OS X 中不工作

java - SocketChannel 问题