- Home /
Accessing the bytes[] from Application.CaptureScreenshot
I'm trying to access the bytes[] from a screenshot in order to upload it via WWW... What's the right way to do this?
Is it possible to directly access the bytes from Application.CaptureScreenshot, without having to load it into a Texture2D?
Answer by Josh707 · Oct 28, 2014 at 03:52 AM
It just writes the file to disk, the only way to get the bytes would be to read the resulting file into a byte array through a stream, like File.ReadAllBytes
.
You can also use Texture2D.ReadPixels
to copy from the screen, it'd probably be best to not write the file to disk at all if you don't need to. There was an example of using it and uploading the result via WWW in the script reference so maybe give that a go instead.
IEnumerator UploadPNG() {
yield return new WaitForEndOfFrame();
int width = Screen.width;
int height = Screen.height;
Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);
tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
tex.Apply();
byte[] bytes = tex.EncodeToPNG();
Destroy(tex);
WWWForm form = new WWWForm();
form.AddField("frameCount", Time.frameCount.ToString());
form.AddBinaryData("fileUpload", bytes);
WWW w = new WWW("http://localhost/cgi-bin/env.cgi?post", form);
yield return w;
if (w.error != null)
print(w.error);
else
print("Finished Uploading Screenshot");
}
http://docs.unity3d.com/ScriptReference/Texture2D.ReadPixels.html
The problem with ReadPixels is that it's not async... CaptureScreenshot works much faster.
Is there a way to read files without using System.IO - File.ReadAllBytes seems to require that
You can modify this code by making it a void method, and starting it on a separate thread. This way you don't block your main thread. If you do this each frame, you should consider using Pooling of threads.
@ina Saving a screenshot to the disk already requires System.IO under the hood, that is why it is slow. I do not recommend using it.