首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BufferOverFlowException at .put()

BufferOverFlowException at .put()
EN

Stack Overflow用户
提问于 2015-01-27 02:14:00
回答 1查看 145关注 0票数 1

由于以前没有翻转缓冲区,所以我遇到了问题,但现在无法让缓冲区添加.put()或.putInt() --它在第一次尝试时就不断抛出BufferOverflowException:

代码语言:javascript
复制
buffer.put((byte) c.getRed());

有关守则如下:

代码语言:javascript
复制
BufferedImage image = loadImage(".\\res\\" + fileName);
int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());

ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4);
buffer.flip();
Color c;

for (int y = 0; y < image.getHeight(); y++) {
    for (int x = 0; x < image.getWidth(); x++) {
        c = new Color(image.getRGB(x, y));
        buffer.put((byte) c.getRed());     // Red component
        buffer.put((byte) c.getGreen());      // Green component
        buffer.put((byte) c.getBlue());               // Blue component
        buffer.put((byte) c.getAlpha());    // Alpha component. Only for RGBA
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-27 07:35:42

你打给buffer.flip()的电话打错地方了。来自文档

翻转这个缓冲器。限制设置为当前位置,然后将位置设置为零。

限制的定义为:

缓冲区的限制是不应该读取或写入的第一个元素的索引。缓冲区的限制永远不会是负的,并且永远不会超过它的容量。

由于在分配缓冲区(当前位置为0 )之后立即调用flip(),因此flip()调用将限制设置为0。这意味着没有任何东西可以写在索引0,或者后面。这反过来意味着什么都写不出来。

要解决这个问题,您需要在使用buffer.flip()填充缓冲区的循环之后移动调用buffer.put()

原始代码丢失的要点是,在将数据写入缓冲区后,需要将缓冲区位置设置为0。否则,以后的操作将在当前位置开始读取,即在完成所有buffer.put()操作后缓冲区的结束。

在用数据填充缓冲区后,有多种方法将位置重置为0。这些人中的任何一个都应该做好以下工作:

代码语言:javascript
复制
buffer.flip();
buffer.position(0);
buffer.rewind();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28162133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档