2012-02-09 2 views
5

Я пытаюсь получить предварительный просмотр камеры с примененным к нему цветовым эффектом, например, эффект НЕГАТИВНОГО. Ошибок нет, и просмотр просматривается без проблем, но независимо от установленного ColorEffect - предварительный просмотр камеры остается неизменным. Я тестировал, если эффекты, которые я пытаюсь использовать, доступны для моего телефона, запустив params.getSupportedColorEffects() (также эти эффекты также работают во встроенном приложении для фотографий).ColorEffect не отображается на предварительном просмотре камеры

Я понятия не имею, что не так с кодом - я размещаю его ниже. Возможно, у кого-то есть идея, что может сделать эту работу? Заранее спасибо.

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

После некоторого тестирования выяснилось, проблема может быть связана с HTC Desire я тестирование на (или, возможно, его версия ОС). Код работает правильно на некоторых других телефонах Samsung. Я не понял, что может быть проблемой для HTC.


UPDATE: мне удалось получить эффект работает, но действительно случайно, и я до сих пор не понимаю, почему. Но я дам здесь ответ - возможно, кто-то найдет это полезным или, может быть, сможет объяснить, почему так происходит:

Я добавил следующую строку в метод surfaceChanged, потому что я пытался уменьшить размер Предварительный просмотр:

previewHolder.setFixedSize(width, height-1); 

Это привело к тому, что выбранный эффект стал видимым.

Когда я изменил эту строку:

previewHolder.setFixedSize(width, height); 

эффект не было видно больше раз. Так странно .... он работает для высоты набора, что-то меньшее, чем принятый параметр высоты.

ответ

1

Я тоже борется с этим. Я узнал, что HTC Desire его камера нуждается в странном порядке выполнения setParameters, setPreviewDisplay и startPreview для цветового эффекта. Заказ:

Camera.Parameters parameters = camera.getParameters(); 

//set the parameters 

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

Вызов startPreview перед setPreviewDisplay документирована в Android SDK, как способ инициализации камеры и SurfaceView параллельно.

Что касается вашего обновления о воздействии на работу случайно, то это случилось со мной! По той же причине я предполагаю, что некоторые из моих кодов дважды вызывались в быстром завершении (в моем случае из-за меняющегося объекта базы данных). Это заставило метод (re) установить параметры и (повторно) запустить предварительный просмотр, который вызывается дважды, с получением желаемого результата. Поняв, что это и еще несколько экспериментов, описанный выше порядок, похоже, работал как на моем HTC Desire, так и на Acer Iconia A500, и я был очень доволен этим.

Однако я только что получил комментарий для своего приложения, в котором говорится, что он создает поврежденные изображения на HTC Desire HD, поэтому я бы рекомендовал не использовать этот порядок инициализации камеры по умолчанию, а скорее как исправление для HTC Desire.

0

После установки новых параметров на камеру и предварительного просмотра invalidate() звоните на ваш номер SurfaceView. Но это только Invalidate the whole view. If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future. Так что нет гарантий, что onDraw() будет называться сразу. Но onDraw() всегда вызывают после звонка onMeasure() с размером, отличным от текущего. Так что это может быть причиной этого странного поведения.

0

Простые ответы использовать следующий тип:

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