fullScreen Camera Preview без искажений / растяжений - PullRequest
7 голосов
/ 29 марта 2012

У меня есть класс cameraPreview (см. Ниже), который запускает полноэкранный режим и альбомную ориентацию ... но изображение растягивается / искажается ... есть ли способ, чтобы этот предварительный просмотр оставался полноэкранным, но не искажал?

camLayer:

public class CamLayer extends SurfaceView implements SurfaceHolder.Callback {
       Camera camera;
       SurfaceHolder previewHolder;
       String camID;
       private static final String TAG = "Cam Preview";


       public CamLayer(Context context, String facing)
       {
               super(context);
               camID = facing;
               previewHolder = this.getHolder();
               previewHolder.addCallback(this);
               previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


       }
       public void surfaceCreated(SurfaceHolder holder) {
           startCamera();
       }

       @Override
       public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
       {
               Parameters params = camera.getParameters();
                   //params.setPreviewSize(width, height);
                   //params.setPictureFormat(PixelFormat.JPEG);
                   camera.setParameters(params);
                   camera.startPreview();


       }

       public void surfaceDestroyed(SurfaceHolder arg0)
       {

            stopCamera();
       }



       public void onResume() {

           startCamera();

       }

       public void onPause() {

           stopCamera();
       }


       public void stopCamera(){
            System.out.println("stopCamera method");
            if (camera != null){
                camera.stopPreview();
                camera.setPreviewCallback(null);
                camera.release();
                camera = null;
                previewHolder.removeCallback(this);
                previewHolder = null;
            }
        }

       private void startCamera(){
           if(camID.equals("front")){
               camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
           }else{
               camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
           }
           try {
                   camera.setPreviewDisplay(previewHolder);

                }
                   catch (Throwable e){ Log.w("TAG,", "failed create surface !?!?"); }
        }

       public void draw(Canvas canvas) {
           super.draw(canvas);
           Paint p = new Paint(Color.RED);
           Log.d(TAG, "draw");
           canvas.drawText("PREVIEW", canvas.getWidth() / 2,
                canvas.getHeight() / 2, p);
        }
}

Ответы [ 2 ]

1 голос
/ 09 марта 2013

Вам нужно запустить params.getSupportedPreviewSizes();

, и из этого найти лучший предварительный просмотрРазмер для вашего просмотра

Посмотрите на этот проект: https://github.com/commonsguy/cw-advandroid/blob/master/Camera/Picture/src/com/commonsware/android/picture/PictureDemo.java

  private Camera.Size getBestPreviewSize(int width, int height,
                                         Camera.Parameters parameters) {
    Camera.Size result=null;

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
      if (size.width <= width && size.height <= height) {
        if (result == null) {
          result=size;
        }
        else {
          int resultArea=result.width * result.height;
          int newArea=size.width * size.height;

          if (newArea > resultArea) {
            result=size;
          }
        }
      }
    }

    return(result);
  }
0 голосов
/ 09 марта 2013

В дополнение к тому, что Лена Бру говорит о поиске хорошего размера предварительного просмотра, если не существует точного точного соотношения сторон между вашими размерами CamLayer и выбранным размером предварительного просмотра камеры, единственная опция, которую следует избегать искажение, чтобы настроить макет вашего CamLayer.

Предварительный просмотр камеры просто растягивается, чтобы охватить весь вид, независимо от соотношения сторон, поэтому для неискаженного вида необходимо настроить макет представления в соответствии с выбранным соотношением сторон предварительного просмотра. См. Сайт разработчика Android документация по пользовательским компонентам ; особенно часть о onMeasure.

Возможно, вы захотите сообщить ширину и высоту на основе соотношения сторон предварительного просмотра, и вам может потребоваться запустить ретрансляцию вашего пользовательского интерфейса при настройке размера предварительного просмотра камеры для обновления размера просмотра.

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