2013-12-16 5 views
5

Sto cercando di utilizzare Android GPUImage in questa pagina https://github.com/CyberAgent/android-gpuimage per eseguire alcuni lavori di filtraggio in tempo reale sul video e io uso glReadPixels() per ottenere i dati che sono stati elaborati dalla GPU e il filtro è stato aggiunto, quindi ho creato una bitmap utilizzando i dati restituiti e infine comprimendola in un'immagine jpeg. Il processo funziona bene ma il file jpeg non è uguale all'anteprima, mostra solo la parte inferiore dell'anteprima, tuttavia la sua dimensione è giusta, ho cercato questo a lungo ma non ne ho ancora avuto la minima idea, così puoi darmi qualche consiglio, ogni suggerimento sarà molto apprezzato.Quando si utilizza GLES20.glReadPixels su Android, i dati restituiti da esso non sono esattamente gli stessi con l'anteprima vivente

E il mio codice che utilizza glReadPixels è come questo:

public static Bitmap SavePixels(int x, int y, int w, int h){ 
    int b[]=new int[w*(y+h)]; 
    int bt[]=new int[w*h]; 
    IntBuffer ib = IntBuffer.wrap(b); 
    ib.position(0); 
    GLES20.glReadPixels(0, 0, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ib); 

     for(int i=0, k=0; i<h; i++, k++) 
     {//remember, that OpenGL bitmap is incompatible with Android bitmap 
     //and so, some correction need.   
      for(int j=0; j<w; j++) 
      { 
        int pix=b[i*w+j]; 
        int pb=(pix>>16)&0xff; 
        int pr=(pix<<16)&0x00ff0000; 
        int pix1=(pix&0xff00ff00) | pr | pb; 
        bt[(h-k-1)*w+j]=pix1; 
      } 
     } 

     Bitmap sb=Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888); 
     return sb; 
} 

Ho chiamato questa funzione appena dopo le GLES20.glDrawArrays (GLES20.GL_TRIANGLE_STRIP, 0, 4), che è nella funzione OnDraw.

+0

Perché non usi semplicemente uno Shader con GLSL, questo è il modo in cui supponi di fare il filtraggio, ecc. Con OpenGL. – Vallentin

+0

hi Vallentin, per il tuo commento, ma non ho molta familiarità con OPENGL, quindi devo usare questo progetto open core, il mio scopo di ottenere i dati sono stati elaborati e quindi codificarli in file .264. – geekShaw

+0

Capisco che il tuo nuovo, ma farlo sembra uno spreco enorme. Gli shader fanno parte di OpenGL e sono piuttosto semplici da imparare, usare e implementare. Quindi ti suggerisco di esaminarli e usarli invece. – Vallentin

risposta

3

Questo problema è stato risolto, è successo perché glReadPixels legge il buffer che è connesso con surfaceView su cui è visualizzata l'anteprima, e la dimensione di questo surfaceView è maggiore dei parametri di larghezza e altezza che ho impostato in glReadPixels, quindi ha appena visualizzato parte dell'anteprima (inizia dall'angolo in basso a sinistra dell'anteprima).

Problemi correlati