Android捕捉映像後在SurfaceView上變形顯示問題的處理

來源:互聯網
上載者:User

標籤:android   style   blog   ar   io   color   使用   sp   for   

我們在Android中經常會使用SurfaceView編寫自訂的網路攝影機,可是有的時候會經常會出現映像的變形,我們就會很鬱悶的問這到底是為什麼呢?其實這個最根本的原因是SurfaceView和PreViewSize的尺寸不是同一個比率。

所謂PreViewSize就是在預覽的時候幀資料的尺寸,SurfaceView是用來預覽Camera的視圖,它的尺寸也就是Screen全屏時候的大小。還有一個重要尺寸的是PictureSize,這個是拍照後圖片的尺寸,就是所儲存的結果圖片的大小。

 

所以解決剛剛問題就是調用Camera的takePicture方法之前設定一下Camera的PictureSize和PreviewSize兩個參數,分別調用的方法是setPictureSize和setPreviewSize。

然後實際的PictureSize和PreviewSize可通過如下步驟得到的:

 

首先是得到該手機可以適配的一系列尺寸

List<Size> previewSizes = params.getSupportedPreviewSizes();List<Size> pictureSizes = params.getSupportedPictureSizes();  

 

然後得到自己的螢幕的尺寸

public static float getScreenRate(Context context){       Point P = getScreenMetrics(context);       float H = P.y;       float W = P.x;       return (W/H);  } 


最後根據自己的尺寸大小,從適配的尺寸當中取一些屬於自己規格的尺寸

public  Size getPropPreviewSize(List<Camera.Size> list, float th, int minWidth){      Collections.sort(list, sizeComparator);       int i = 0;      for(Size s:list){          if((s.width >= minWidth) && equalRate(s, th)){              Log.i(TAG, "PreviewSize:w = " + s.width + ",h = " + s.height);              break;          }          i++;      }      if(i == list.size()){          i = 0;//如果沒找到,就選最小的size      }      return list.get(i);  }  


得到PreViewSize後,同理得到PictureSize

public Size getPropPictureSize(List<Camera.Size> list, float th, int minWidth){      Collections.sort(list, sizeComparator);      int i = 0;      for(Size s:list){         if((s.width >= minWidth) && equalRate(s, th)){              Log.i(TAG, "PictureSize : w = " + s.width + ",h = " + s.height);              break;          }          i++;      }      if(i == list.size()){          i = 0;//如果沒找到,就選最小的size      }      return list.get(i);  }  


設定尺寸

mParams = mCamera.getParameters();//設定PictureSize  Size pictureSize = getPropPictureSize(mParams.getSupportedPictureSizes(),previewRate, 1280); mParams.setPictureSize(pictureSize.width, pictureSize.height); //設定PreviewSizeSize previewSize = getPropPreviewSize(mParams.getSupportedPreviewSizes(), previewRate, 1280);  mParams.setPreviewSize(previewSize.width, previewSize.height); 


這樣子關於在Android上調用Camera捕捉映像後在SurfaceView上變形顯示的問題基本上就解決了!

 

Android捕捉映像後在SurfaceView上變形顯示問題的處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.