Java 缓冲区下溢?

Java 缓冲区下溢?,java,android,bufferunderflowexception,Java,Android,Bufferunderflowexception,我有以下代码片段。标记的行导致BufferUnderflowException。我阅读了关于异常的文档,但仍然不理解它到底是什么。我使用了.rewind()方法,我觉得这种方法可以缓解这个问题 有谁能告诉我这个话题或我的错误原因吗 Bitmap cameraBaseSized = BitmapFactory.decodeFile(cameraPath, opts); Bitmap canvasBlendSized = BitmapFactory.d

我有以下代码片段。标记的行导致BufferUnderflowException。我阅读了关于异常的文档,但仍然不理解它到底是什么。我使用了
.rewind()
方法,我觉得这种方法可以缓解这个问题

有谁能告诉我这个话题或我的错误原因吗

            Bitmap cameraBaseSized = BitmapFactory.decodeFile(cameraPath, opts);
            Bitmap canvasBlendSized = BitmapFactory.decodeFile(canvasPath, options);
            Bitmap result = cameraBaseSized.copy(Config.ARGB_8888, true);
            IntBuffer buffBase = IntBuffer.allocate(cameraBaseSized.getWidth()
                    * cameraBaseSized.getHeight());
            cameraBaseSized.copyPixelsToBuffer(buffBase);
            buffBase.rewind();
            IntBuffer buffBlend = IntBuffer.allocate(canvasBlendSized.getWidth()
                    * canvasBlendSized.getHeight());
            canvasBlendSized.copyPixelsToBuffer(buffBlend);
            buffBlend.rewind();
            IntBuffer buffOut = IntBuffer.allocate(cameraBaseSized.getWidth()
                    * cameraBaseSized.getHeight());
            buffOut.rewind();
            while (buffOut.position() < buffOut.limit()) {
                int filterInt = buffBlend.get(); //BUFFERUNDERFLOW EXCEPTION
                int srcInt = buffBase.get();
                int redValueFilter = Color.red(filterInt);
                int greenValueFilter = Color.green(filterInt);
                int blueValueFilter = Color.blue(filterInt);
                int redValueSrc = Color.red(srcInt);
                int greenValueSrc = Color.green(srcInt);
                int blueValueSrc = Color.blue(srcInt);
                int redValueFinal = multiply(redValueFilter, redValueSrc);
                int greenValueFinal = multiply(greenValueFilter, greenValueSrc);
                int blueValueFinal = multiply(blueValueFilter, blueValueSrc);
                int pixel = Color.argb(255, redValueFinal, greenValueFinal, blueValueFinal);
                buffOut.put(pixel);
            }
            buffOut.rewind();
            result.copyPixelsFromBuffer(buffOut);

我还想补充一点,这种情况只发生在特定的设备上,特别是三星

也许这个测试会有帮助:

    ByteBuffer b = ByteBuffer.allocate(1);
    b.get();
    b.get();
分配后,缓冲区中有1个字节,第一个get()读取该字节,缓冲区达到其限制,第二个get()非法,没有任何内容可读取,因此您得到BufferUnderflowException

此代码不会失败:

    ByteBuffer b = ByteBuffer.allocate(1);
    b.get();
               b.rewind();
    b.get();

您已读取字节,但它仍在缓冲区中,因此您可以将其倒带并再次读取字节

此测试可能会有所帮助:

    ByteBuffer b = ByteBuffer.allocate(1);
    b.get();
    b.get();
分配后,缓冲区中有1个字节,第一个get()读取该字节,缓冲区达到其限制,第二个get()非法,没有任何内容可读取,因此您得到BufferUnderflowException

此代码不会失败:

    ByteBuffer b = ByteBuffer.allocate(1);
    b.get();
               b.rewind();
    b.get();

您可以读取字节,但它仍在缓冲区中,因此您可以将其倒带,然后再次读取字节

由于它发生在某些设备上,因此可能无法获得预期的像素格式

此外,如果
buffBlend
出于任何原因比
buffOut
短(这可能是由于位图的格式不同造成的),则在尝试将
get()
结束后,将出现此异常

编辑:

您可以更改
int filterInt=buffBlend.get()

int filterInt = 0;
if (buffBlend.position() < buffBlend.limit())
    filterInt = buffBlend.get();
int filterInt=0;
if(buffBlend.position()

如果对两个缓冲区都这样做,则应该可以防止出现异常,并在一个图像比另一个图像大时与黑色混合。

由于这种情况发生在某些设备上,因此可能无法获得预期的像素格式

此外,如果
buffBlend
出于任何原因比
buffOut
短(这可能是由于位图的格式不同造成的),则在尝试将
get()
结束后,将出现此异常

编辑:

您可以更改
int filterInt=buffBlend.get()

int filterInt = 0;
if (buffBlend.position() < buffBlend.limit())
    filterInt = buffBlend.get();
int filterInt=0;
if(buffBlend.position()

如果您对两个缓冲区都这样做,那么应该可以防止出现异常,并在一个图像比另一个图像大时与黑色混合。

这听起来像是对问题的准确描述。有可能在某个try-catch块中只在缓冲区的末尾添加黑色像素吗?你不知道我用这个在桌子上敲脑袋已经多久了。非常感谢。这听起来像是对问题的准确描述。有可能在某个try-catch块中只在缓冲区的末尾添加黑色像素吗?你不知道我用这个在桌子上敲脑袋已经多久了。非常感谢。