質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

3256閲覧

Unity)cameraでサイズを指定して保存

navesanta

総合スコア198

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/07/28 00:38

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#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/07/28 02:01

リサイズするのですか?トリミングするのですか?
navesanta

2020/07/28 04:46

トリミングです。 よろしくお願いします。
guest

回答2

0

そこでスクリプトでWidthとHeightを750×750に設定して、試してみました。
しかし保存されるサイズは1280×720になってしまいます。
推測としてはデバイスのサイズで保存されているような気がします。

OnSave() 関数を呼んで保存してるんですよね?(名前付けに違和感はありますが)
そこでメンバ変数 texture2D の内容をファイルに保存してますが、new する時に横縦のピクセル数に Screen.currentResolution.width と Screen.currentResolution.height を指定してるので画面解像度が指定されていると思いますよ。

投稿2020/07/28 07:14

bboydaisuke

総合スコア5308

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

トリミングしたいのであればWebCamTexture.GetPixelsにあるように引数にint x, int y, int blockWidth, int blockHeightとありますので指定してみてください。

投稿2020/07/28 04:48

YAmaGNZ

総合スコア10489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

navesanta

2020/07/30 04:22

実際に試したところ、こちらの見解がやりたいことの実現につながりました。 Color[]という概念がなかなか理解することができず、何度も繰り返してやっと理解しました。 ありがとうございました。他の見解していただいた方もありがとうございました。
YAmaGNZ

2020/07/30 04:48

bboydaisukeさんのご指摘のようにtexture2Dの大きさにも考慮が必要な気はしますが、 提示されたソースでもそのままTexture2D.SetPixelsの引数としていたので、そこに渡せばいいだけだと思ってましたが違いましたか?
navesanta

2020/08/01 09:01

>提示されたソースでもそのままTexture2D.SetPixelsの引数としていたので、 そこに渡せばいいだけだと思ってましたが違いましたか? それでよかったのですがTexture2DとWebCamTextureのサイズを同じにしてなかったため エラーになりその原因がColor[]の意味がよくわからなかったので判断できませんでした。 (今は分かりましたが) どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問