2016-03-06 1 views
-1

У меня есть андроид Hello Effect образец передо мной. Я вижу, как он применяет различные эффекты для android.opengl.GLSurfaceView. Все сделано успешно. Интересно, как я могу получить выходное растровое изображение из GLSurfaceView? это код: `как получить выходное растровое изображение из GLSurfaceView в android «Приложение примера эффекта эффекта эффекта»?

private GLSurfaceView glSurfaceView; 
private int[] mTextures = new int[2]; 
private EffectContext mEffectContext; 
private Effect mEffect; 
private TextureRenderer mTexRenderer = new TextureRenderer(); 
private int mImageWidth; 
private int mImageHeight; 
private boolean mInitialized = false; 
int mCurrentEffect; 

public void setCurrentEffect(int effect) { 
    mCurrentEffect = effect; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    /** 
    * Initialize the renderer and tell it to only render when 
    * explicity requested with the RENDERMODE_WHEN_DIRTY option 
    */ 
    glSurfaceView = (GLSurfaceView) findViewById(R.id.effectsview); 
    glSurfaceView.setEGLContextClientVersion(2); 
    glSurfaceView.setRenderer(this); 
    glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
    mCurrentEffect = R.id.none; 

} 



private void loadTextures() { 
    // Generate textures 
    GLES20.glGenTextures(2, mTextures, 0); 

    // Load input bitmap 
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 
      R.drawable.puppy); 
    mImageWidth = bitmap.getWidth(); 
    mImageHeight = bitmap.getHeight(); 
    mTexRenderer.updateTextureSize(mImageWidth, mImageHeight); 

    // Upload to texture 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures[0]); 
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 
    // Set texture parameters 
    GLToolbox.initTexParams(); 
} 

private void initEffect() { 
    EffectFactory effectFactory = mEffectContext.getFactory(); 
    if (mEffect != null) { 
     mEffect.release(); 
    } 
    /** 
    * Initialize the correct effect based on the selected menu/action item 
    */ 
    switch (mCurrentEffect) { 

     case R.id.none: 
      break; 

     case R.id.autofix: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_AUTOFIX); 
      mEffect.setParameter("scale", 0.5f); 
      break; 

     case R.id.bw: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_BLACKWHITE); 
      mEffect.setParameter("black", .1f); 
      mEffect.setParameter("white", .7f); 
      break; 

     case R.id.brightness: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_BRIGHTNESS); 
      mEffect.setParameter("brightness", 2.0f); 
      break; 

     case R.id.contrast: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_CONTRAST); 
      mEffect.setParameter("contrast", 1.4f); 
      break; 

     case R.id.crossprocess: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_CROSSPROCESS); 
      break; 

     case R.id.documentary: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_DOCUMENTARY); 
      break; 

     case R.id.duotone: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_DUOTONE); 
      mEffect.setParameter("first_color", Color.YELLOW); 
      mEffect.setParameter("second_color", Color.DKGRAY); 
      break; 

     case R.id.filllight: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_FILLLIGHT); 
      mEffect.setParameter("strength", .8f); 
      break; 

     case R.id.fisheye: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_FISHEYE); 
      mEffect.setParameter("scale", .5f); 
      break; 

     case R.id.flipvert: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_FLIP); 
      mEffect.setParameter("vertical", true); 
      break; 

     case R.id.fliphor: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_FLIP); 
      mEffect.setParameter("horizontal", true); 
      break; 

     case R.id.grain: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_GRAIN); 
      mEffect.setParameter("strength", 1.0f); 
      break; 

     case R.id.grayscale: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_GRAYSCALE); 
      break; 

     case R.id.lomoish: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_LOMOISH); 
      break; 

     case R.id.negative: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_NEGATIVE); 
      break; 

     case R.id.posterize: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_POSTERIZE); 
      break; 

     case R.id.rotate: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_ROTATE); 
      mEffect.setParameter("angle", 180); 
      break; 

     case R.id.saturate: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_SATURATE); 
      mEffect.setParameter("scale", .5f); 
      break; 

     case R.id.sepia: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_SEPIA); 
      break; 

     case R.id.sharpen: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_SHARPEN); 
      break; 

     case R.id.temperature: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_TEMPERATURE); 
      mEffect.setParameter("scale", .9f); 
      break; 

     case R.id.tint: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_TINT); 
      mEffect.setParameter("tint", Color.MAGENTA); 
      break; 

     case R.id.vignette: 
      mEffect = effectFactory.createEffect(
        EffectFactory.EFFECT_VIGNETTE); 
      mEffect.setParameter("scale", .5f); 
      break; 

     default: 
      break; 

    } 

} 

private void applyEffect() { 
    mEffect.apply(mTextures[0], mImageWidth, mImageHeight, mTextures[1]); 
} 

private void renderResult() { 
    if (mCurrentEffect != R.id.none) { 
     // if no effect is chosen, just render the original bitmap 
     mTexRenderer.renderTexture(mTextures[1]); 
    } else { 
     // render the result of applyEffect() 
     mTexRenderer.renderTexture(mTextures[0]); 
    } 
} 

@Override 
public void onDrawFrame(GL10 gl) { 
    if (!mInitialized) { 
     //Only need to do this once 
     mEffectContext = EffectContext.createWithCurrentGlContext(); 
     mTexRenderer.init(); 
     loadTextures(); 
     mInitialized = true; 
    } 
    if (mCurrentEffect != R.id.none) { 
     //if an effect is chosen initialize it and apply it to the texture 
     initEffect(); 
     applyEffect(); 
    } 
    renderResult(); 
} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    if (mTexRenderer != null) { 
     mTexRenderer.updateViewSize(width, height); 

    } 
} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    setCurrentEffect(item.getItemId()); 
    glSurfaceView.requestRender(); 
    return true; 
} 

}`

ответ

0

Вы можете прочитать пиксели обратно с glReadPixels() после того как вы сделали рендеринга, но до eglSwapBuffers() называется. Вы используете GLSurfaceView, который выполняет обмен буфера для вас, когда возвращается onDrawFrame(), поэтому вам нужно будет сделать захват в конце onDrawFrame().

Вы можете найти пример, который сохраняет текущий фреймбуфер GLES в PNG в Grafika. См. Метод EglSurfaceBase#saveFrame() (вы можете игнорировать тест mEglCore вверху).