我正在尝试获取一组mipmaplevels并保存到本地缓存文件,以避免每次都重建它们(预生成它们是不切实际的......)
我已经将mipmaplevels放入一组位图中了,现在想把它们写到我的缓存文件中,但是我使用的各种缓冲区(直接与否,设置字节顺序或不设置)hasArray总是返回false intbuffer。我必须在这里做些傻事,但我再也看不到树木了。
没有长时间使用java,所以这是一个noob错误;)
代码如下所示:
int tsize = 256;
ByteBuffer xbb = ByteBuffer.allocate(tsize*tsize*4);
// or any other variety of create like wrap etc. makes no diference
xbb.order(ByteOrder.nativeOrder()); // in or out - makes no difference
IntBuffer ib = xbb.asIntBuffer();
for (int i = 0; i < tbm.length; i++) {
//ib.array() throws exception, ib.hasArray() returns false;
tbm[i].getPixels(ib.array(), 0, tsize, 0, 0, tsize, tsize);
ou.write(xbb.array(), 0, tsize*tsize*4);
tsize = tsize / 2;
}
答案 0 :(得分:1)
见this link - 它谈到同样的问题。那里有答案;但最后得出结论:
In another post
http://forum.java.sun.com/thread.jsp?forum=4&thread=437539
it is suggested to implement a version of DataBuffer which is
backed by a (Mapped)ByteBuffer *gasp* ...
请注意,forum.java.sun.com已移至Oracle某处。 我希望这有帮助。无论如何,如果你找到更好的答案也让我知道: - )
答案 1 :(得分:1)
在我的测试中,使用ByteBuffer
将IntBuffer
更改为ByteBuffer.asIntBuffer()
会导致您丢失支持数组。
如果您使用IntBuffer.allocate(tsize*tsize)
,则应该能够获得支持数组。
ByteBuffer buf = ByteBuffer.allocate(10);
IntBuffer ib = buf.asIntBuffer();
System.out.printf("Buf %s, hasArray: %s, ib.hasArray %s\n", ib, buf.hasArray(), ib.hasArray());
buf = ByteBuffer.allocateDirect(10);
ib = IntBuffer.allocate(10);
System.out.printf("Buf %s, hasArray: %s, ib.hasArray %s\n", ib, buf.hasArray(), ib.hasArray());
产地:
Buf java.nio.ByteBufferAsIntBufferB[pos=0 lim=2 cap=2], buf.hasArray: true, ib.hasArray false
Buf java.nio.HeapIntBuffer[pos=0 lim=10 cap=10], buf.hasArray: false, ib.hasArray true