4

バッファがピクセルに対して十分な大きさではないというエラーが表示されます。推奨事項はありますか?Bitmap b は、ピクセルを配置しようとしている gSaveBitmap と同じサイズである必要があります。

if(gBuffer == null)
        {
            Bitmap b = Bitmap.createScaledBitmap(gBitmap, mWidth, mHeight, false);
            //gBuffer = ByteBuffer.allocateDirect(b.getRowBytes()*b.getHeight()*4);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            b.compress(Bitmap.CompressFormat.PNG,  100,  stream);
            gBuffer = ByteBuffer.wrap(stream.toByteArray());
            b.recycle();
        }
        gSaveBitmap.copyPixelsFromBuffer(gBuffer);

更新: 以下のコードでは、圧縮を行わなくてもまったく同じエラーが発生します。

if(gBuffer == null)
        {
            Bitmap b = Bitmap.createScaledBitmap(gBitmap, mWidth, mHeight, false);

            int bytes = b.getWidth()*b.getHeight()*4;
            gBuffer = ByteBuffer.allocate(bytes);
            b.copyPixelsToBuffer(gBuffer);              
            b.recycle();
        }
        gSaveBitmap.copyPixelsFromBuffer(gBuffer);

更新: gBuffer のサイズを 2 倍にすることで問題を解決しました。おそらく、これが正しいサイズである理由を誰かが教えてくれるでしょう。また...画像の回転が間違っているため、90度回転する必要があります。gBuffer でデータを再配置する必要がある方法はありますか?

gBuffer = ByteBuffer.allocate(b.getRowBytes()*b.getHeight()*2);
4

2 に答える 2

3

私はこれを解決したかもしれないと思います-Bitmap ::copyPixelsFromBuffer()のソース(バージョン2.3.4_r1、4.4より前のGrepcodeでBitmapが最後に更新されたとき)を見てください

public void copyPixelsFromBuffer(Buffer src) {

     checkRecycled("copyPixelsFromBuffer called on recycled bitmap");

     int elements = src.remaining();
     int shift;
     if (src instanceof ByteBuffer) {

         shift = 0;

     } else if (src instanceof ShortBuffer) {
         shift = 1;

     } else if (src instanceof IntBuffer) {
         shift = 2;

     } else {

         throw new RuntimeException("unsupported Buffer subclass");

     }

     long bufferBytes = (long)elements << shift;
     long bitmapBytes = (long)getRowBytes() * getHeight();

     if (bufferBytes < bitmapBytes) {

         throw new RuntimeException("Buffer not large enough for pixels");

     }

     nativeCopyPixelsFromBuffer(mNativeBitmap, src);

 }

エラーの文言は少し不明確ですが、コードは明確にしています。これは、ビットマップのピクセルを埋めるのに十分なデータがないとバッファが計算されていることを意味します。これは、バッファのremaining()メソッドを使用してバッファの容量を計算するためです。これは、その位置属性の現在の値を考慮に入れています。copyPixelsFromBuffer() を呼び出す前にバッファで rewind() を呼び出すと、実行時例外が消えるはずです。

于 2014-05-20T20:44:49.093 に答える
0

この問題の答えを見つけました:

buffer size > bit map size異なる Android バージョンのビットマップは常に変更されているため、常に を設定する必要があります。

以下のコードをログに記録して確認できますbuffer size & bitmap size(次のログを使用するには、Android API が >= 12 である必要があります)。

Log.i("", "Bitmap size = " + mBitmap.getByteCount());
        Log.i("", "Buffer size = " + mBuffer.capacity());

それは働くべきです。

ありがとう、

于 2014-07-12T09:54:11.680 に答える