ColorEffect не видно при предварительном просмотре камеры - PullRequest
5 голосов
/ 09 февраля 2012

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

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

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

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

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

Я тоже с этим боролся. Я обнаружил, что 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.

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

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

0 голосов
/ 18 сентября 2014

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

  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;  
 }
}
0 голосов
/ 06 марта 2012

После установки новых параметров для камеры и запуска предварительного просмотра 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() с размером, отличным от текущего.Так что это может быть причиной такого странного поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...