2012-02-09 10 views
5

Estoy tratando de obtener una vista previa de la cámara con un efecto de color aplicado, como por ejemplo el efecto NEGATIVO. No hay errores, y la vista previa es visible sin problemas, pero independientemente de ColorEffect I set, la vista previa de la cámara permanece sin cambios. Probé si los efectos que estoy tratando de usar están disponibles para mi teléfono ejecutando params.getSupportedColorEffects() (también estos efectos también funcionan en la aplicación de fotos integrada).ColorEfecto no visible en la vista previa de la cámara

No tengo idea de lo que está mal con el código - Lo estoy posteando a continuación. Tal vez alguien aquí tiene una idea de lo que podría hacer que esto funcione? Gracias por adelantado.

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

Después de algunas pruebas resultó que el problema podría estar relacionado con el deseo de HTC que estaba probando en (o tal vez su versión del sistema operativo). El código funciona correctamente en algunos otros teléfonos Samsung. No he descubierto cuál podría ser el problema en el HTC.


ACTUALIZACIÓN: He conseguido que los efectos de trabajo, pero realmente por accidente, y sigo sin entender por qué. Pero voy a dar la respuesta aquí - quizás alguien lo encuentre útil, o tal vez pueda explicar por qué sucede de esta manera:

Agregué la siguiente línea al método surfaceChanged porque estaba tratando de disminuir el tamaño de la vista previa:

previewHolder.setFixedSize(width, height-1); 

Esto tiene el resultado de hacer visible el efecto seleccionado.

Cuando cambié a esta línea:

previewHolder.setFixedSize(width, height); 

el efecto no era visible más una vez más. Es extraño ... funciona para que la altura establecida sea algo menor que el parámetro de altura recibido.

Respuesta

1

He estado luchando con esto también. Descubrí que el HTC Desire su cámara necesita un extraño orden de ejecución de setParameters, setPreviewDisplay y startPreview para que el efecto de color funcione. El orden es:

Camera.Parameters parameters = camera.getParameters(); 

//set the parameters 

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

Calling startPreview antes setPreviewDisplay se documenta en el SDK de Android como una forma de inicializar la cámara y el SurfaceView en paralelo.

En cuanto a su actualización sobre cómo hacer que los efectos funcionen por accidente, ¡me pasó lo mismo! Supongo que por la misma razón, parte de mi código fue llamado dos veces en sucesión rápida (en mi caso debido a un objeto de base de datos cambiante). Esto causó que el método (re) establezca los parámetros y (re) inicie la vista previa para que se llame dos veces produciendo el resultado deseado. Después de darme cuenta de esto y de experimentar un poco más, el orden anterior parecía funcionar tanto en mi HTC Desire como en Acer Iconia A500 y me sentí muy feliz con él.

Sin embargo, acabo de recibir un comentario de mi aplicación que dice que produce imágenes dañadas en el HTC Desire HD, así que recomendaría no usar este orden de inicialización de la cámara como predeterminado, sino como una solución para el HTC Desire.

0

Después de establecer nuevos parámetros en la cámara y comenzar la vista previa invalidate() están llamando a su SurfaceView. Pero solo es Invalidate the whole view. If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future. Por lo tanto, no existen garantías de que se llame inmediatamente al onDraw(). Pero onDraw() siempre están invocando después de llamar a onMeasure() con un tamaño diferente al actual. Entonces puede ser una razón de este extraño comportamiento.

0

respuestas simples usan siguiente 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; 
} 
} 
Cuestiones relacionadas