1. 程式人生 > 其它 >Unity如何呼叫手機拍照縮放功能

Unity如何呼叫手機拍照縮放功能

呼叫手機相機拍照縮放功能,方便使用者自行搭配圖片。
第一個問題:如何獲取手機的攝像頭所拍攝的畫面。
unity中有一個類,WebCamTexture,繼承自Texture類。訪問它的靜態成員devices,即可獲得所有攝像頭。
後置攝像頭一般是第一個(?不確定,網上看了好幾個案例都是呼叫第一個)。
然後獲取相機的貼圖,將其傳輸到Canvas下的rawImage中。

 public string deviceName;
public WebCamTexture webCam;
public RawImage rawImage;
void Start()
{

StartCoroutine(Call());
}
public IEnumerator Call()
{

// 請求許可權
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
if (Application.HasUserAuthorization(UserAuthorization.WebCam))
{

// 獲取相機裝置
WebCamDevice[] devices = WebCamTexture.devices;
// 取第一個相機名稱
deviceName = devices[0].name;
// 建立相機貼圖
webCam = new WebCamTexture(deviceName, Screen.width, Screen.height, 60);
// 
rawImage.texture = webCam;
// 相機開啟
webCam.Play();
}
}

此時可以完成初步要求,但是有一個問題,發現相機旋轉的時候,圖片裡的內容在不是橫平豎直的情況下,有扭曲的情況出在這裡插入圖片描述現。

這是因為圖片適配性沒有做好。

rawImage是鋪滿整個螢幕,但是當手機斜向拍攝時,Screen的寬和高和螢幕的寬高就不是完全一樣,傳輸到rawImage的圖片可能出現拉伸的情況,造成圖片不適配,為了解決這個方法,可以給rawImage新增一個元件——Aspect Ratio Fitter。Aspect Mode選擇 Envelpoe Parent ,Aspect Ration為Screen.width/Screen.height。
補充相關程式碼

public AspectRatioFitter fit;
fit.aspectRatio = (float)webCam.width / (float)webCam.height;

這個元件的功能是適配寬高比,選擇圖片中較小的寬或者高,然後放大平鋪Canvas,多餘的部分不顯示。
當圖片豎著的時候這個效果。

當圖片寬比較大時是這個效果


至此,我們解決了獲得攝像機畫面問題。接下來解決放大縮小問題。
放大一般採用雙指縮放,記錄兩次觸控之間點的距離差,然後等比例放大即可。

 private float _minValue = 1;
private float _maxValue = 5;
private float _speed = 1;
private float _defaultSpeed = 800;
private float _lastDistance;
private float _twoTouchDistance;
private Vector3 _firstTouch;
private Vector3 _secondTouch;
private void Update()
{

if (Input.touchCount <= 1)
{

return;
}
_firstTouch = Input.touches[0].position;
_secondTouch = Input.touches[1].position;
_twoTouchDistance = Vector2.Distance(_firstTouch, _secondTouch);
if (Input.GetTouch(1).phase == TouchPhase.Began)
{

_lastDistance = _twoTouchDistance;
}
var scale = Mathf.Clamp(rawImage.GetComponent<RectTransform>().localScale.x + (_twoTouchDistance - _lastDistance) / _defaultSpeed * _speed, _minValue, _maxValue);
rawImage.GetComponent<RectTransform>().localScale = new Vector3(scale, scale, scale);
_lastDistance = _twoTouchDistance;
}

這裡用的方法比較簡單粗暴,直接放大rawImage,手機畫素不好的話放大可能導致圖片模糊情況的出現。解決方法是呼叫安卓原生態的攝像頭,或者使用NatCam外掛(百度到的,收費,沒用過不確定),至於後倆種方法有時間再做。
總結一下遇到的問題與解決方法。
1、如何獲取手機拍照的功能?
呼叫WebCamTexture類與相關的引數、功能。
2、手機旋轉時候,如何解決rawImage不適配的問題。
新增Aspect Ratio Fitter元件。
3、手機旋轉到一定角度視角會跟著動怎麼辦?
在playSetting裡修改 Default Orientation
選擇自己需要的模式。