ColorEffect在相机预览中不可见

时间:2012-02-09 19:49:08

标签: android android-camera

我正在尝试使用应用了颜色效果的相机预览,例如NEGATIVE效果。没有错误,预览可见而没有问题,但独立于我设置的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(或者可能是它的操作系统版本)有关。该代码在其他一些三星手机上正常工作。我还没弄清楚HTC会出现什么问题。


更新: 我设法让效果起作用,但真的是偶然的,我仍然不明白为什么。但我会在这里给出答案 - 也许有人会觉得它很有用,或者也许能解释为什么会这样:

我在surfaceChanged方法中添加了以下行,因为我试图减小预览的大小:

previewHolder.setFixedSize(width, height-1); 

这样可以使所选效果可见。

当我将此行更改为:

previewHolder.setFixedSize(width, height); 

效果再也看不到了。很奇怪....它适用于设置高度小于接收高度参数的任何东西。

3 个答案:

答案 0 :(得分:1)

我一直在努力解决这个问题。我发现HTC Desire它的相机需要执行setParameterssetPreviewDisplaystartPreview的奇怪顺序才能使颜色效果起作用。订单是:

Camera.Parameters parameters = camera.getParameters();

//set the parameters

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

在Android SDK中记录startPreview之前调用setPreviewDisplay,作为初始化相机和SurfaceView的方法。

关于让您的效果意外发挥作用的更新,同样的事情发生在我身上!我假设出于同样的原因,我的一些代码在快速连续中被调用了两次(在我的情况下由于数据库对象的变化)。这导致该方法(重新)设置参数并且(重新)开始预览以被调用两次以产生期望的结果。在意识到这一点之后,我的HTC Desire和Acer Iconia A500的上述顺序似乎都有用,我很满意。

然而,我刚收到一条评论,说我的应用程序说它会在HTC Desire HD上产生损坏的图像,所以我建议不要使用这个相机初始化顺序作为默认值,而是作为HTC Desire的修复。

答案 1 :(得分: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()后调用。所以这可能是这种奇怪行为的原因。

答案 2 :(得分: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;  
 }
}