目的
スクショを撮ったときに指定した範囲だけ切り出してから保存したい。
画面全体では1136 * 640だが、画面中央付近の500*500の画像を撮りたい場合がある。
方法
Texture2Dの機能を使うとできた。
protected virtual IEnumerator CaptureCoroutine(int width, int height)
{
// カメラのレンダリング待ち
yield return new WaitForEndOfFrame();
Texture2D tex = ScreenCapture.CaptureScreenshotAsTexture();
// 切り取る画像の左下位置を求める
int x = (tex.width - width) / 2;
int y = (tex.height - height) / 2;
Color[] colors = tex.GetPixels(x, y, width, height);
Texture2D saveTex = new Texture2D(width, height, TextureFormat.ARGB32, false);
saveTex.SetPixels(colors);
File.WriteAllBytes("ss.png", saveTex.EncodeToPNG());
}
上のCoroutineに500,500を引数に渡して呼び出すと、Unity Projectのrootディレクトリ直下に"ss.png"という名前で次の画像が作られる。
やっていること
- ScreenCapture.CaptureScreenshotAsTextureでスクショをTexture2Dで扱う
- Texture2DのGetPixelsメソッドを使い指定した範囲を切り抜いた部分をColorの配列にする
- 保存用Texture2Dに作ったColorの配列を入れ、EncodeToPNGメソッドを使ってPNGとして保存させる。
Coroutine化してWaitForEndOfFrameまで待つのは、今回使ったScreenCapture.CaptureScreenshotAsTextureで得られる画像がおかしくなるため。ドキュメントにも注意が書かれている。多分カメラのレンダリング以降に呼び出さないとだめなのかな。
試しにWaitForEndOfFrameせずに撮影した場合は次の画像になり期待したものにはならなかった。
スクショを保存する機能のScreenCapture.CaptureScreenshotはいつ呼び出しても使えそうだが、CaptureScreenshotAsTextureはそうではないので気をつけたい。
まとめ
- ScreenCapture.CaptureScreenshotAsTextureとTexture2Dの機能を使えば画面の指定した範囲を切り抜いたスクショをつくることができる。
- ScreenCapture.CaptureScreenshotAsTextureは呼び出すタイミングに気をつける。