Unity で CaptureScreenshotAsTexture を使って後加工しやすいスクリーンショットをするメモ

Unity で CaptureScreenshotAsTexture を使って後加工しやすいスクリーンショットをするメモです。
背景
ScreenCapture-CaptureScreenshot - Unity スクリプトリファレンス
CaptureScreenshot を使うのも便利でサンプルを結構見かけるのですが、これですと一度ファイルが保存された後に、もう一度読み込む必要があって、ひと手間がかかります。もともと保存する用途ならいいのですがスクリーンショットを撮影したあとに、すぐサーバーに画像データを送りたいときに冗長だなと思っていました。
ScreenCapture-CaptureScreenshotAsTexture - Unity スクリプトリファレンス
その点、CaptureScreenshotAsTexture は Texture2D オブジェクトで取得できファイル保存処理はありません。あとは Texture2D オブジェクトから画像を切り取ったり、画像データを Texture2D.EncodeToJPG すれば JPEG に変換できますし、画質も設定できます。もちろん Texture2D.EncodeToPNG なら PNG に変換できて取り回しがしやすいのでまとめておきます。
Unity に Cube を準備
Unity に Cube を準備します。
Cube に CubeEvent.cs を割り当て
Cube に CubeEvent.cs を割り当てます。コードは以下の通りです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeEvent : MonoBehaviour
{
// キャプチャされた画像データ
byte[] dataImage;
void Start()
{
StartCoroutine(DoScreenShot());
}
IEnumerator DoScreenShot()
{
Debug.Log($"DoScreenShot");
// レンダリング後に処理を開始
yield return new WaitForEndOfFrame();
// Texture2D でスクリーンショットを取得
Texture2D textureScreenCapture = ScreenCapture.CaptureScreenshotAsTexture();
// EncodeToJPG で JPEG に変換する。EncodeToPNG なら PNG に変換できる
dataImage = textureScreenCapture.EncodeToJPG();
Debug.Log($"撮影完了");
Debug.Log($"{dataImage}");
// textureScreenCapture を削除
UnityEngine.Object.Destroy(textureScreenCapture);
}
}
動かしてみる
実際に Play で再生してみると、以下のように撮影が成功し dataImage の中に Texture2D.EncodeToJPG で JPEG に変換したデータが入っています。今回は、何かしらに投影したり、保存したりはしませんが JPEG データが入っています。
これをうまく取りまわせばサーバーに画像を送るデータとして使えたり、画像を切り取ったり、ファイル保存をすることができます。