greyBow
greyBow

Reputation: 1348

Saving a screen capture to server from web player

I'm building a web based app that takes a screenshot of a play area and then posts it to a web server to be called up in a image gallery for other to view. Currently, when running in the editor I can take the screenshot and save it locally but that won't work once it's deployed. I don't know how to take that screenshot and save it to a texture (rather than to disk) to then upload to my server. How do I do this? I'm new at this and especially new at Render Texture functionality. Can someone help me sort this out?

Upvotes: 0

Views: 445

Answers (1)

Umair M
Umair M

Reputation: 10720

I have found this Snippet on a forum here. But not tested by myself on WebPlayer.

using UnityEngine;
using System.Collections;

public class Main : MonoBehaviour
{
    private string _data = string.Empty;
    public Texture2D bg;

    void OnGUI()
    {
        if (GUI.Button(new Rect(Screen.width*0.5f-32,32,64,32),"Save"))
            StartCoroutine(ScreeAndSave());
    }

    IEnumerator ScreeAndSave()
    {
        yield return new WaitForEndOfFrame();
        var newTexture = ScreenShoot(Camera.main, bg.width, bg.height);
        LerpTexture(bg, ref newTexture);
        _data = System.Convert.ToBase64String(newTexture.EncodeToPNG());
        Application.ExternalEval("document.location.href='data:octet-stream;base64," + _data + "'");
    }

    private static Texture2D ScreenShoot(Camera srcCamera, int width, int height)
    {
        var renderTexture = new RenderTexture(width, height, 0);
        var targetTexture = new Texture2D(width, height, TextureFormat.RGB24, false);
        srcCamera.targetTexture = renderTexture;    
        srcCamera.Render();
        RenderTexture.active = renderTexture;
        targetTexture.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        targetTexture.Apply();
        srcCamera.targetTexture = null;
        RenderTexture.active = null;
        srcCamera.ResetAspect();
        return targetTexture;
    }

    private static void LerpTexture(Texture2D alphaTexture, ref Texture2D texture)
    {
        var bgColors = alphaTexture.GetPixels();
        var tarCols = texture.GetPixels();
        for (var i = 0; i < tarCols.Length; i++)
            tarCols[i] = bgColors[i].a > 0.99f ? bgColors[i] :  Color.Lerp(tarCols[i], bgColors[i], bgColors[i].a);
        texture.SetPixels(tarCols);
        texture.Apply();
    }
}

Reference Link

Upvotes: 1

Related Questions