2016-06-23 3 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)의 셈어로 사용되어 저장하려고 할 때만 비트 맵을 생성합니다.

하나의 이미지 저장은 정상적으로 작동합니다.

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); 

효과

세대.

내가 뭘 잘못하고있어?

편집 나는 마지막 문제를 해결 : 나는 당신이 릴리스당신이 모든 시간을 사용하는 모든 효과 개체()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)); 

희망!