UnityでWebCamTextureを使って撮影した画像を保存するアプリを
作成したいのですが撮影時の向きが横になってしまうので
c#
1Vector3 angles = rectTrans.eulerAngles; 2angles.y = WebCamTexture.devices[index].isFrontFacing?180: 0; 3angles.z = -active.videoRotationAngle; 4rectTrans.eulerAngles = angles;
で向き調整をしてうまくいきました。
しかしactive.GetPixelsで書き出してEncodeToPNG()を使って保存した
データを見ると最初の横になった時点での保存になってしまいます。
この挙動はシュミレータでは横にならず問題なく
デバイステストの時のみ横になって保存されます。
解決方法わかる方お教えください。
環境)
PC: Windows10
Unity2019.4.0f1
言語:C#
c#
1public class WebCamera : MonoBehaviour 2{ 3 [SerializeField]RawImage rawImage = null; 4 [SerializeField]GameObject xButton; 5 [SerializeField]GameObject returnButton; 6 List<PhotoType> photoList; 7 List<WebCamTexture> webCamTextures; 8 WebCamTexture active; 9 Texture2D texture2D; 10 public int FPS = 15; 11 int fileNum; 12 string authId; 13 string fileName; 14 string dataPath; 15 bool isLoadFinished = false; 16 Vector3 angles; 17 18 void Start() 19 { 20 xButton.SetActive(true); 21 webCamTextures = new List<WebCamTexture>(); 22 photoList = new List<PhotoType>(); 23 photoList = PlayerPrefsUtility.LoadList<PhotoType>("photolist"); 24 fileNum = PlayerPrefs.GetInt("filenum", 0); 25 //利用できるデバイスカメラを生成する 26 foreach(var d in WebCamTexture.devices) 27 { 28 WebCamTexture texture = new WebCamTexture( 29 d.name, 30 Screen.currentResolution.width, 31 Screen.currentResolution.height, 32 FPS); 33 webCamTextures.Add(texture); 34 } 35 //cameraを再生開始、RawImageにWebCamTextureを設定する 36 const int index = 0; 37 active = webCamTextures[index]; 38 // active = webCamTextures[0]; 39 rawImage.texture = active; 40 active.Play(); 41 42 RectTransform rectTrans = rawImage.GetComponent<RectTransform>(); 43 //向き調整 44 Vector3 angles = rectTrans.eulerAngles; 45 angles.y = WebCamTexture.devices[index].isFrontFacing?180: 0; 46 angles.z = -active.videoRotationAngle; 47 rectTrans.eulerAngles = angles; 48 49 //サイズ調整 50 float scale = Screen.width / (float)active.height; 51 Vector2 size = rectTrans.sizeDelta; 52 size.x = active.width * scale; 53 size.y = active.height * scale; 54 rectTrans.sizeDelta = size; 55 } 56public void OnClickShot() 57{ 58 if( active == null ) 59 { 60 return; 61 } 62 63 if( !active.isPlaying ) 64 { 65 return; 66 } 67 // Debug.Log("0active.width/" + active.width + " active.height/" + active.height ); 68 active.Pause(); 69 xButton.SetActive(false); 70 returnButton.SetActive(true); 71} 72public void OnClickSave() 73{ 74 authId = PlayerPrefs.GetString("authid", ""); 75 Debug.Log("authid2" + authId); 76 //webCamTextureをtexture2Dに変換する 77 texture2D = new Texture2D (700, 700, TextureFormat.RGBA32, false); 78 Color[] pix = active.GetPixels(360, 0, 700, 700); 79 texture2D.SetPixels(pix); 80 texture2D.Apply(); 81 //texture2Dをpngに変換する 82 byte[] png = texture2D.EncodeToPNG(); 83 //pngとtexture2Dの競合はWriteAllBytes時にメモリーリークになるのでtexture2Dを削除する 84 Destroy(texture2D); 85 //Application.persistentDataPath(data/data)に保存する。その際iCloud対象から外す 86 dataPath = Application.persistentDataPath + "/" + fileName +".png"; 87 photoList.Add(new PhotoType(fileName, 0, "", GetDateTime(), 0)); 88 PlayerPrefsUtility.SaveList<PhotoType>("photolist", photoList); 89 90 fileNum++; 91 PlayerPrefs.SetInt("filenum", fileNum); //filenum連番管理 92 PlayerPrefs.SetString("filename", fileName); //editorの背景用画像セット 93 PlayerPrefs.Save(); 94 95 // UnityEngine.iOS.Device.SetNoBackupFlag(dataPath); //iosには必要 96 File.WriteAllBytes(dataPath, png); 97 active.Stop(); 98 } 99 int GetDateTime() 100 { 101 DateTime now = DateTime.Now; 102 return now.Year * 10000 + now.Month * 100 + now.Day; 103 } 104} 105
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。