2012-02-09 10 views
5

Sto cercando di ottenere un'anteprima della fotocamera con un effetto di colore applicato ad esso, come ad esempio l'effetto NEGATIVO. Non ci sono errori e l'anteprima è visibile senza problemi, ma indipendentemente dall'impostazione ColorEffect I - l'anteprima della fotocamera rimane invariata. Ho provato se gli effetti che sto cercando di utilizzare sono disponibili sul mio telefono eseguendo params.getSupportedColorEffects() (anche questi effetti funzionano anche nell'app per foto incorporata).ColorEffect non visibile sull'anteprima della fotocamera

Non ho idea di cosa c'è di sbagliato nel codice - lo sto postando di seguito. Forse qualcuno qui ha un'idea di cosa potrebbe fare questo lavoro? Grazie in anticipo.

public class CustomCameraView extends SurfaceView{ 

Camera mCamera; 
SurfaceHolder mHolder; 

public CustomCameraView(Context context){ 
    super(context); 
    mHolder = this.getHolder(); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    mHolder.addCallback(mSurfaceHolderListener); 
} 

SurfaceHolder.Callback mSurfaceHolderListener = new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     mCamera=Camera.open(); 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
     } 
     catch (Exception e){ } 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) 
    { 
     Camera.Parameters params = mCamera.getParameters(); 
     params.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE); 
     mCamera.setParameters(params); 
     mCamera.startPreview(); 
    } 

    public void surfaceDestroyed(SurfaceHolder arg0) 
    { 
     mCamera.stopPreview(); 
     mCamera.release(); 
    } 
}; 
} 

Dopo alcune prove si è scoperto che il problema potrebbe essere legato al desiderio HTC stavo testando su (o forse la sua versione del sistema operativo). Il codice funziona correttamente su altri telefoni Samsung. Non ho capito quale potrebbe essere il problema su HTC.


UPDATE: sono riuscito a ottenere gli effetti di lavoro, ma veramente per caso, e io ancora non capisco perché. Ma darò la risposta qui - forse qualcuno lo troverà utile, o forse sarà in grado di spiegare perché succede in questo modo:

Ho aggiunto la seguente riga al metodo surfaceChanged perché stavo cercando di ridurre le dimensioni di l'anteprima:

previewHolder.setFixedSize(width, height-1); 

Questo ha avuto il risultato di rendere visibile l'effetto selezionato.

Quando ho cambiato questa linea:

previewHolder.setFixedSize(width, height); 

l'effetto non era più visibile ancora una volta. Così strano .... funziona per l'altezza impostata essere qualcosa di meno che il parametro di altezza ricevuta.

risposta

1

Sono stato alle prese anche con questo. Ho scoperto che l'HTC Desire ha bisogno di uno strano ordine di esecuzione dello setParameters, setPreviewDisplay e startPreview perché l'effetto del colore funzioni. L'ordine è:

Camera.Parameters parameters = camera.getParameters(); 

//set the parameters 

camera.setParameters(parameters); 
camera.startPreview(); 
camera.setParameters(parameters); 
camera.setPreviewDisplay(surfaceHolder); 

Calling startPreview prima setPreviewDisplay è documentato nel SDK di Android come un modo di inizializzazione della fotocamera e la SurfaceView in parallelo.

Per quanto riguarda l'aggiornamento su come far funzionare gli effetti per caso, lo stesso è accaduto a me! Presumo per lo stesso motivo, alcuni dei miei codici sono stati richiamati due volte in rapida successione (nel mio caso a causa di un oggetto di database che cambia). Ciò ha portato il metodo a (ri) impostare i parametri e (ri) avviare l'anteprima da chiamare due volte producendo il risultato desiderato. Dopo aver realizzato questo e altri esperimenti, l'ordine di cui sopra sembrava funzionare sia sul mio HTC Desire che su Acer Iconia A500 e ne ero abbastanza soddisfatto.

Tuttavia, ho appena ricevuto un commento per la mia applicazione dicendo che produce immagini danneggiate su HTC Desire HD, quindi non raccomanderei di utilizzare questo ordine di inizializzazione della fotocamera come predefinito, ma piuttosto come una correzione per l'HTC Desire.

0

Dopo aver impostato i nuovi parametri sulla fotocamera e aver avviato l'anteprima, invalidate() chiama il numero SurfaceView. Ma è solo Invalidate the whole view. If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future. Quindi non ci sono garanzie che lo onDraw() sarà chiamato immediatamente. Ma onDraw() invoca sempre dopo aver chiamato onMeasure() con dimensioni diverse da quella corrente. Quindi può essere una ragione di questo strano comportamento.

0

risposte semplici utilizzano seguente tipo:

Camera camera = null; 
    camera = Camera.open(); 

    if (camera != null) { 
    try { 
     Camera.Parameters parameters = camera.getParameters(); 

     // Set all kind of stuffs here.. 
      parameters.setSceneMode(Camera.Parameters.FLASH_MODE_AUTO); 
      parameters.setColorEffect(Camera.Parameters.EFFECT_SEPIA); // whatever effect you want 
      camera.setParameters(parameters); 

      camera.setPreviewDisplay(surface_holder); 
      camera.startPreview(); 

    } catch (IOException exception) { 
    camera.release(); 
    camera = null; 
} 
} 
Problemi correlati