1

次のコードスニペットがあります。マークされた行が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);

そして例外スニペット

11-29 14:41:57.347: E/AndroidRuntime(2166): Caused by: java.nio.BufferUnderflowException
11-29 14:41:57.347: E/AndroidRuntime(2166):     at java.nio.IntArrayBuffer.get(IntArrayBuffer.java:55)

また、これは特定のデバイス、特にサムスンフレーバーでのみ発生していることを付け加えたいと思います。

4

2 に答える 2

4

多分このテストは役立つでしょう:

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

割り当て後、バッファに1バイトがあり、最初のget()がこのバイトを読み取り、バッファが制限に達し、2番目のget()が不正であり、読み取るものがないため、BufferUnderflowExceptionが発生します。

このコードは失敗しません:

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

バイトを読み取りましたが、まだバッファー内にあるため、巻き戻してバイトを再度読み取ることができます

于 2012-11-29T20:03:50.773 に答える
1

特定のデバイスで発生しているため、期待するピクセル形式が得られない可能性があります。

また、buffBlendが何らかの理由でより短い場合buffOut(ビットマップが異なる形式であることが原因である可能性があります)、最後を超えようとすると、この例外が発生しますget()

編集:

あなたはに変更int filterInt = buffBlend.get();することができます

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

両方のバッファに対してこれを行うと、例外から保護され、一方の画像がもう一方の画像よりも大きい場合は黒とブレンドされます。

于 2012-11-29T20:04:29.203 に答える