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라고을 다시 가질 것을 찾을 수 있습니다.