簡體   English   中英

如何在Android中設置相機方向?

[英]How to set camera orientation in Android?

我已經看過其他人問過的其他問題,但是我不確定解決此問題的最佳方法是什么。 閱讀完Android指南以實現相機后,我擁有的相機預覽被鎖定為橫向。 我想知道如何調整相機的方向以反映手機的方向。

我試過了

camera.setDisplayOrientation(90);

並將相機鎖定為縱向模式,因此我需要另一種解決方案(最好是適用於大多數設備的解決方案)。

另外,如何使保存的圖像顯示與預覽相同的方式? 現在,如果我使用上面的代碼行使預覽變為縱向,則保存的圖像仍將旋轉為橫向。

 Camera.Parameters params= mCamera.getParameters();
 params.set("rotation", 90); 
 mCamera.setParameters(params);

確定要選擇的預覽大小時,需要考慮方向。 例如, CameraPreview的CameraPreview中的getOptimalPreviewSize()忽略了方向,這僅僅是因為其應用程序的版本已將方向鎖定為橫向。 如果要讓方向浮動,則需要反轉目標縱橫比以匹配。 因此,在getOptimalPreviewSize()具有此位置的地方

double targetRatio=(double)width / height;

if (displayOrientation == 90 || displayOrientation == 270) {
  targetRatio=(double)height / width;
}

其中displayOrientation是一個介於0到360之間的值,該值是我從大約100行嚴重丑陋的代碼中確定的,這就是為什么我將所有這些都包裝在我不久將要發布的可重用組件中的原因。

其次,在控制所使用的SurfaceView / TextureView的縱橫比時,需要考慮該顯示方向。 CameraPreview從活動ApiDemos都有自己的預覽ViewGroup處理該寬高比,在那里你需要扭轉在肖像使用長寬比:

if (displayOrientation == 90
        || displayOrientation == 270) {
      previewWidth=mPreviewSize.height;
      previewHeight=mPreviewSize.width;
    }
    else {
      previewWidth=mPreviewSize.width;
      previewHeight=mPreviewSize.height;
    }

其中displayOrientation是相同的值(90和270分別是縱向和反向肖像,請注意,我沒有嘗試使反向肖像或反向風景正常工作,因此可能需要進行更多調整)。

三-你必須在調用之前啟動預覽setPictureSize()Camera.Parameters 否則,就好像將圖片的縱橫比應用於預覽幀一樣,搞砸了。

Camera.Parameters parameters=camera.getParameters();
Camera.Size pictureSize=getHost().getPictureSize(parameters);

parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);

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

parameters=camera.getParameters();
parameters.setPictureSize(pictureSize.width, pictureSize.height);
parameters.setPictureFormat(ImageFormat.JPEG);
camera.setParameters(parameters);

我使用Google的相機應用程序修復了此問題。 它通過使用傳感器獲取手機的方向,然后適當設置EXIF標簽。 相機發出的JPEG不會自動定位。

另外,相機預覽僅在橫向模式下才能正常工作。 如果您需要將活動布局定向為縱向,則必須使用方向傳感器中的值手動進行。

我建議檢查照片的exif數據,並特別尋找

ExifInterface exif = new ExifInterface(SourceFileName);   //API Level 5
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION);

發表評論,讓我知道這是否對您有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM