当前位置: 首页 > 面试题库 >

RuntimeException:缓冲区不足以容纳像素

长孙景焕
2023-03-14
问题内容

我正在通过套接字在字节数组中接收到位图,并且读取了该位图,然后将其设置os.toByteArrayImageView应用程序中的位图。我使用的代码是:

try {
    //bmp = BitmapFactory.decodeByteArray(result, 0, result.length);
    bitmap_tmp = Bitmap.createBitmap(540, 719, Bitmap.Config.ARGB_8888);
    ByteBuffer buffer = ByteBuffer.wrap(os.toByteArray());

    bitmap_tmp.copyPixelsFromBuffer(buffer);
    Log.d("Server",result+"Length:"+result.length);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            imageView.setImageBitmap(bitmap_tmp);
        }
    });
    return bmp;
} finally {
}

当我运行我的应用程序并开始接收Byte[]并期望ImageView更改时,事实并非如此。

LogCat 说:

java.lang.RuntimeException: Buffer not large enough for pixels at
android.graphics.Bitmap.copyPixelsFromBuffer

我搜索了类似的问题,但是找不到解决我问题的方法。


问题答案:

看看Bitmap ::
copyPixelsFromBuffer()
的源(版本2.3.4_r1,上一次在Grepcode上更新Bitmap的时间是在4.4之前)。

错误的措词尚不清楚,但是代码澄清了-
这意味着您的缓冲区被计算为没有足够的数据来填充位图的像素。这(可能)是因为它们使用缓冲区的剩余方法来计算缓冲区的容量,并考虑了其position属性的当前值。如果在调用copyFromPixels()之前在缓冲区上调用rewind(),则可能会看到运行时异常消失。我之所以说“可能”,是因为ByteBuffer
:: wrap()方法应该将位置属性值设置为零,从而消除了调用回绕的需要,但是从类似的问题以及我自己的经验明确地重置位置可以判断出这一点。

尝试

ByteBuffer buffer = ByteBuffer.wrap(os.toByteArray());
buffer.rewind();
bitmap_tmp.copyPixelsFromBuffer(buffer);


 类似资料:
  • 纯JavaScript是Unicode友好的,但二进制数据却不是这样。 在处理TCP流或文件系统时,必须处理八位字节流。 Node提供了Buffer类,它提供了存储类似于整数数组的原始数据的实例,但对应于V8堆外部的原始内存分配。 Buffer类是一个全局类,可以在应用程序中访问而无需导入缓冲区模块。 创建缓冲区 节点缓冲区可以以多种方式构建。 Method 1 以下是创建10个八位字节的无启动缓

  • 问题内容: 我试图在我的react- native应用程序中使用节点模块,并且在这里采用ReactNativify方法。 我现在已经全部设置好了,我可以很好地加载加密包了。但是,当我添加eth- lightwallet时, 事情变得很奇怪。 自从我在其中添加该软件包以来,npm一直没有安装任何依赖项。意味着我必须手动添加它们。每次我安装某种与eth- lightwallet相关的依赖项时,都会卸载

  • 主要内容:1 Buffer的基本使用,2 Buffer的容量、位置、限制,3 Buffer的类型,4 Buffer的分配,5 将数据写入Buffer,6 从Buffer读取数据与NIO通道进行交互时,将使用Java NIO缓冲区。如您所知,数据从通道读取到缓冲区,然后从缓冲区写入通道。 缓冲区本质上是一个内存块,您可以在其中写入数据,然后可以在以后再次读取。该内存块包装在NIO Buffer对象中,该对象提供了一组方法,可以更轻松地使用该内存块。 1 Buffer的基本使用 使用Buffer来读

  • Java NIO Buffers用于和NIO Channel交互。正如你已经知道的,我们从channel中读取数据到buffers里,从buffer把数据写入到channels. buffer本质上就是一块内存区,可以用来写入数据,并在稍后读取出来。这块内存被NIO Buffer包裹起来,对外提供一系列的读写方便开发的接口。 Buffer基本用法(Basic Buffer Usage) 利用Buf

  • 环型缓冲区是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。 构造环型缓冲区 var ringBuffer = new RingBufferStream(); 函数原型 RingBufferStream(int capacity = 8192, bool exposable = true); 参数 描述 capacity 环状缓冲区的最大容量,为2的次方。如:传入12,则

  • 环形缓冲区接口 结构体 struct   rt_ringbuffer   环形缓冲区控制块 更多...   枚举 函数 void  rt_ringbuffer_init (struct rt_ringbuffer *rb, rt_uint8_t *pool, rt_int16_t size)   初始化环形缓冲区   void  rt_ringbuffer_reset (struct rt_rin