2016-06-23 17 views
0

this projectは、GLSurfaceViewとエフェクトを使用して、画像に適用されたエフェクトの一部を含むViewPagerを表示します。Android GLSurfaceViewビットマップを保存すると例外が発生する

さらに、オーバーレイビットマップを作成しました。オーバーレイビットマップは、エフェクトが適用された後にすべての画像に適用されます。

この時点までに、アプリは正常に動作しています。しかし、ボタンを押すと、表示された画像をファイルに保存する必要があります。

だから私はこのコードを使用:

private Bitmap createBitmapFromGLSurface(int x, int y, int w, int h, GL10 gl) 
      throws OutOfMemoryError { 
     int bitmapBuffer[] = new int[w * h]; 
     int bitmapSource[] = new int[w * h]; 
     IntBuffer intBuffer = IntBuffer.wrap(bitmapBuffer); 
     intBuffer.position(0); 

     try { 
      gl.glReadPixels(x, y, w, h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, intBuffer); 
      int offset1, offset2; 
      for (int i = 0; i < h; i++) { 
       offset1 = i * w; 
       offset2 = (h - i - 1) * w; 
       for (int j = 0; j < w; j++) { 
        int texturePixel = bitmapBuffer[offset1 + j]; 
        int blue = (texturePixel >> 16) & 0xff; 
        int red = (texturePixel << 16) & 0x00ff0000; 
        int pixel = (texturePixel & 0xff00ff00) | red | blue; 
        bitmapSource[offset2 + j] = pixel; 
       } 
      } 
     } catch (GLException e) { 
      e.printStackTrace(); 
      return null; 
     } 

     return Bitmap.createBitmap(bitmapSource, w, h, Bitmap.Config.ARGB_8888); 
    } 

ビットマップを取得します。ボタンが押されたとき、私は、このメソッドを呼び出す:レンダリングを強制的に

protected void onClick() { 
     read = true; 
     mEffectView.requestRender(); 
} 

をので、私は、ビットマップを生成し、AsyncTaskを使用してファイルに保存します。 は、保存するときにビットマップのみを生成するために、onDrawFrame(GL10 gl)のセマフォとして使用されます。

イメージを1つ保存すると問題はありません。私は二番目を保存すると、その後、私はページを変更、このエラーがアップします:

A/Bitmap: Failed to acquire strong reference to pixels 
A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 20475 (GLThread 9540) 

もう一つの問題は、オーバーレイが、しかし表示され、画像に保存されていないことです。 この私がそれを適用する方法である:画像を保存する際にmEffectで

mEffect.apply(mTextures[0], mImageWidth, mImageHeight, mTextures[1]); 
overlayEffect.apply(mTextures[1], mImageWidth, mImageHeight, mTextures[2]); 

を適用

世代

EffectFactory effectFactory = mEffectContext.getFactory(); 
overlayEffect = effectFactory.createEffect(EffectFactory.EFFECT_BITMAPOVERLAY); 
overlayEffect.setParameter("bitmap", overlay); 

効果が目に見える効果のみです。

私は間違っていますか?

EDIT 私は最後の問題を解決:私はあなたがリリースにあなたはすべての時間を使用しているすべてのEffectオブジェクトは、()mEffectView.requestRenderと呼ばれるを再作成持っていることを知ります。

答えて

2

overlayEffect = effectFactory.createEffect(EffectFactory.EFFECT_BITMAPOVERLAY); 
overlayEffect.setParameter("bitmap", overlay); 

を使用した場合どうやら、渡されたビットマップは、リサイクルです!

は、だから私はそれのコピーを渡して、問題を解決:

overlayEffect = effectFactory.createEffect(EffectFactory.EFFECT_BITMAPOVERLAY); 
overlayEffect.setParameter("bitmap", overlay.copy(overlay.getConfig(), false)); 

希望、これは他の誰かを助けます!

関連する問題