2012-02-09 39 views
5

Tôi đang cố gắng xem trước máy ảnh với hiệu ứng màu được áp dụng cho nó, chẳng hạn như hiệu ứng NEGATIVE. Không có lỗi và bản xem trước hiển thị mà không có sự cố, nhưng độc lập với thiết lập ColorEffect I - xem trước máy ảnh không thay đổi. Tôi đã thử nghiệm nếu các hiệu ứng tôi đang cố gắng sử dụng có sẵn cho điện thoại của tôi bằng cách chạy params.getSupportedColorEffects() (cũng có những hiệu ứng này cũng hoạt động trong ứng dụng ảnh tích hợp sẵn).ColorEffect không hiển thị trên xem trước máy ảnh

Tôi không biết có gì sai với mã - Tôi đăng nó bên dưới. Có lẽ ai đó ở đây có ý tưởng gì có thể làm cho công việc này? Cảm ơn trước.

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

Sau khi một số thử nghiệm, vấn đề có thể liên quan đến HTC Desire I đang thử nghiệm (hoặc có thể là phiên bản hệ điều hành). Mã hoạt động chính xác trên một số điện thoại Samsung khác. Tôi đã không tìm ra những gì có thể là vấn đề trên HTC.


CẬP NHẬT: Tôi đã quản lý để có được hiệu quả hoạt động, nhưng thật sự là ngẫu nhiên và tôi vẫn không hiểu tại sao. Nhưng tôi sẽ đưa ra câu trả lời ở đây - có lẽ ai đó sẽ thấy nó hữu ích, hoặc có thể sẽ giải thích tại sao nó lại xảy ra theo cách này:

Tôi thêm dòng sau vào phương pháp surfaceChanged vì tôi đang cố gắng giảm kích thước bản xem trước:

previewHolder.setFixedSize(width, height-1); 

Điều này làm cho hiệu ứng được chọn hiển thị.

Khi tôi thay đổi dòng này để:

previewHolder.setFixedSize(width, height); 

hiệu quả là không thể nhìn thấy bất kỳ một lần nữa một lần nữa. Vì vậy, kỳ lạ .... nó hoạt động cho chiều cao thiết lập được bất cứ điều gì ít hơn tham số chiều cao nhận được.

Trả lời

1

Tôi cũng đang phải vật lộn với điều này. Tôi phát hiện ra rằng máy ảnh của HTC Desire cần một thứ tự lạ để thực hiện các hiệu ứng màu setParameters, setPreviewDisplaystartPreview để hiệu ứng màu sắc hoạt động. Thứ tự là:

Camera.Parameters parameters = camera.getParameters(); 

//set the parameters 

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

Calling startPreview trước setPreviewDisplay được diễn tả trong Android SDK như một cách để khởi tạo các máy ảnh và surfaceView song song.

Về bản cập nhật của bạn về việc nhận các hiệu ứng để làm việc một cách tình cờ, điều đó cũng giống như tôi! Tôi giả sử cho cùng một lý do, một số mã của tôi đã được gọi hai lần trong sự thành công nhanh chóng (trong trường hợp của tôi do một đối tượng cơ sở dữ liệu thay đổi). Điều này gây ra phương pháp (lại) thiết lập các tham số và (lại) bắt đầu xem trước được gọi là hai lần tạo ra kết quả mong muốn. Sau khi nhận ra điều này và một số chi tiết thử nghiệm các đơn đặt hàng trên dường như làm việc trên cả HTC Desire của tôi và Acer Iconia A500 và tôi đã khá hài lòng với nó.

Tuy nhiên tôi vừa nhận được một nhận xét cho ứng dụng của tôi nói rằng nó tạo ra hình ảnh bị hỏng trên HTC Desire HD nên tôi khuyên bạn không nên sử dụng thứ tự khởi tạo máy ảnh này làm mặc định mà là sửa chữa cho HTC Desire.

0

Sau khi đặt thông số mới cho máy ảnh và bắt đầu xem trước invalidate() đang gọi số SurfaceView của bạn. Nhưng nó chỉ Invalidate the whole view. If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future. Vì vậy, không có đảm bảo rằng onDraw() sẽ được gọi ngay lập tức. Nhưng onDraw() luôn gọi sau khi gọi onMeasure() với kích thước khác với hiện tại. Vì vậy, nó có thể là một lý do của hành vi kỳ quặc này.

0

Câu trả lời đơn giản sử dụng loại sau:

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; 
} 
} 
Các vấn đề liên quan