WebCamTextureを使ってカメラアプリを作成しています。
質問はカメラ自体はスクリーンいっぱいに表示して撮影する部分はサイズを指定して
中心からそのサイズに合わせて保存したい。
そこでスクリプトでWidthとHeightを750×750に設定して、試してみました。
しかし保存されるサイズは1280×720になってしまいます。
推測としてはデバイスのサイズで保存されているような気がします。
どうやってサイズを指定して保存することができるのでしょうか?
教えてください。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEditor; using System.IO; public class WebCamera : MonoBehaviour { [SerializeField]RawImage rawImage = null; List<WebCamTexture> webCamTextures; WebCamTexture active; Texture2D texture2D; public int Width = 750; public int Height = 750; public int FPS = 15; string fileName = "001"; public const string FILENAME = "a001.png"; string dataPath; // Start is called before the first frame update IEnumerator Start() { webCamTextures = new List<WebCamTexture>(); //camera利用をユーザーに確認 yield return Application.RequestUserAuthorization(UserAuthorization.WebCam); //許可されない場合はbreak if(!Application.HasUserAuthorization(UserAuthorization.WebCam)) { yield break; } //利用できるdeviceカメラがない場合はbreak if(WebCamTexture.devices.Length == 0) { yield break; } //利用できるデバイスカメラを生成する foreach(var d in WebCamTexture.devices) { WebCamTexture texture = new WebCamTexture( d.name, Screen.currentResolution.width, Screen.currentResolution.height, 60); webCamTextures.Add(texture); } //cameraを再生開始、RawImageにWebCamTextureを設定する const int index = 0; active = webCamTextures[index]; rawImage.texture = active; active.Play(); //情報が更新されるのを待つ while(active.width <= 16) { yield return null; } RectTransform rectTrans = rawImage.GetComponent<RectTransform>(); //向き調整 Vector3 angles = rectTrans.eulerAngles; angles.y = WebCamTexture.devices[index].isFrontFacing?0: 180; angles.z = -active.videoRotationAngle; rectTrans.eulerAngles = angles; //サイズ調整 float scale = Screen.width / (float)active.height; Vector2 size = rectTrans.sizeDelta; size.x = active.width * scale; size.y = active.height * scale; rectTrans.sizeDelta = size; } public void OnShot() { if( active == null ) { return; } if( !active.isPlaying ) { return; } texture2D = new Texture2D (active.width, active.height, TextureFormat.RGBA32, false); active.Pause(); } public void OnSave() { // dataPath = Application.dataPath + "/../a" + fileName + ".png"; dataPath = Application.persistentDataPath + "/" + FILENAME; //webCamTextureをtexture2Dに変換する texture2D.SetPixels(active.GetPixels()); texture2D.Apply(); //texture2Dをpngに変換する byte[] png = texture2D.EncodeToPNG(); //pngとtexture2Dの競合はWriteAllBytes時にメモリーリークになるのでtexture2Dを削除する Destroy(texture2D); //Application.persistentDataPath(data/data)に保存する。その際iCloud対象から外す UnityEngine.iOS.Device.SetNoBackupFlag(dataPath); File.WriteAllBytes(dataPath, png); //Photo(写真)に保存する // NativeGallery.SaveImageToGallery(texture2D, "houses", fileName); // SaveToPNGFile( active.GetPixels(), Application.dataPath + "/../SavedScreen.png" ); active.Stop(); } void SaveToPNGFile( Color[] texData , string filename ) { Texture2D takenPhoto = new Texture2D(Width, Height, TextureFormat.ARGB32, false); takenPhoto.SetPixels(texData); takenPhoto.Apply(); byte[] png = takenPhoto.EncodeToPNG(); Destroy(takenPhoto); // テストで、プロジェクトフォルダー内のファイルにも書き込みます File.WriteAllBytes(filename, png); } }
環境)
PC: mac
Unity2019.4.0f1
言語:C#
回答2件
あなたの回答
tips
プレビュー