- Home /
Taking Non Power of Two Resolution Screen Shots
I'm trying to take custom resolution screen shots by first drawing the camera to a render texture, then creating a texture2d and reading the render texture pixels to it, then writing to a png.
The screen shots are coming out as power of two resolutions. For example, if I create a 1920x1080 render texture, the resultant image will be 2048x1024. The Texture2D has the correct 1920x1080 res shown in my debug message, so I believe the problem may be texture formats. I've tried setting the RenderTexure format to various formats such as ARGB32.
What am I missing?
using UnityEngine;
using System.Collections;
using System;
using System.IO;
public class ScreenCapture : MonoBehaviour
{
public Camera camera;
string filePath = "";
void Start() {
filePath = Path.Combine(Application.dataPath, "Resources/Notes");
}
void LateUpdate()
{
if (Input.GetKeyDown(KeyCode.L))
{
//Application.CaptureScreenshot(filePath);
StartCoroutine(TakeScreenShot());
}
}
/// <summary>
/// Takes a screen shot of the camera render texture
/// </summary>
/// <param name="_filePath">complete file path with name</param>
public void TakeScreenShot(string _filePath) {
filePath = _filePath;
StartCoroutine(TakeScreenShot());
}
public IEnumerator TakeScreenShot()
{
yield return new WaitForEndOfFrame();
RenderTexture rt = new RenderTexture(1920, 1080, 0);
camera.targetTexture = rt;
Texture2D screenShot = new Texture2D(1920, 1080, TextureFormat.RGB24, false);
camera.Render();
RenderTexture currentRT = RenderTexture.active; // remember the active RT
RenderTexture.active = rt;
Debug.Log(string.Format("Texture2D res, Width - {0} - Height {1}", screenShot.width, screenShot.height));
screenShot.ReadPixels(new Rect(0, 0, 1920, 1080), 0, 0);
camera.targetTexture = null;
RenderTexture.active = currentRT;
Destroy(rt);
byte[] bytes = screenShot.EncodeToPNG();
string fileName = System.Guid.NewGuid().ToString() + ".png";
string fullPath = Path.Combine(filePath, fileName);
System.IO.File.WriteAllBytes(fullPath, bytes);
Debug.Log(string.Format("Took screenshot to: {0}", fullPath));
}
}
Your answer
Follow this Question
Related Questions
RenderTexture to Texture2D 4 Answers
Call camera.Render() twice: RenderTexture contents differs from ReadPixels() 1 Answer
Texture2D saves as PNG correctly but doesn't display properly in RawImage 1 Answer
Use the canvas scaler to resize UI on a RenderTexture's resolution ? 0 Answers
How to render a camera image to png 1 Answer