2011-10-04 80 views
0

我试图抓住一组mipmaplevels并保存到本地缓存文件,以避免每次重建它们(并且预先生成它们是不现实的......)android bytebuffer as intbuffer - asarray总是给予不支持的操作

我已经将mipmaplevels集成到一组位图中,现在想将它们写入到我的缓存文件中,但是无论使用何种缓冲区(直接或不是,设置字节序或不),hasArray总是返回false在intbuffer上。我必须在这里做一些愚蠢的事情,但我再也看不到树木了。

没有使用Java进行长时间,所以这是prolly一个小白错误;)

代码如下所示:

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

使用bitmap.copypixels有点帮助,但仍然是更好的驱动IO不复制....... – pootle

+0

仍在使用copypixels。有一天必须更加努力地寻求更好的答案! – pootle

回答

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

在我的测试中,使用ByteBuffer.asIntBuffer()ByteBuffer更改为IntBuffer会导致您丢失支持数组。

如果您改用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