Search code examples
unity-game-engineunity-web-player

Texture2D to base64 - Unity3d Web player


I'm using this code to create an Texture2D from the rendertexture of all cameras.

Code:

    var w = 256;
    var h = 256;
    var  cameras:Camera[] = Camera.allCameras;

    var renderTexture:RenderTexture = RenderTexture.GetTemporary(Screen.width, Screen.height, 24);
    RenderTexture.active = renderTexture;  

    for (var camera:Camera in cameras)
    {
        if (camera.enabled)
        {
            var fov:float = camera.fov;
            camera.targetTexture = renderTexture;
            camera.Render();
            camera.targetTexture = null;
            camera.fov = fov;
        }
    }

    var result:Texture2D = new Texture2D(w, h, TextureFormat.ARGB32, false);
    result.ReadPixels(Rect(0.0f, 0.0f, Screen.width, Screen.height), 0, 0, false);
    result.Apply();


    Application.ExternalCall("exportImage",System.Convert.ToBase64String(result.EncodeToPNG()));

It's working right on the webplayer, but when trying to convert this texture2d to base64 and sending to browser (by externalcall()) the result is a grey semitransparent image.

Any help would be greatly appreciated! Thanks.


Solution

  • I was able to post a screenshot to webplayer with:

    using UnityEngine;
    using System.Collections;
    
    public class ScreenshotTest : MonoBehaviour {
    
        void Update () {
            if(Input.GetKeyDown(KeyCode.Space))
                StartCoroutine(Run());
        }
    
    
        IEnumerator Run() {
            yield return new WaitForEndOfFrame();
    
            Texture2D tex = new Texture2D(Screen.width, Screen.height);
            tex.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
            tex.Apply();
    
            // to test the texture
            //  renderer.material.mainTexture = tex;
    
            // to save it as file, not available in webplayer
            //  System.IO.File.WriteAllBytes(Application.streamingAssetsPath+"/png.png", tex.EncodeToPNG());
    
            Application.ExternalCall("screenshot", System.Convert.ToBase64String(tex.EncodeToPNG()));
        }
    
    }
    

    and on the browser side:

    function screenshot(base64) {
        console.log(base64);
        var img=document.createElement("img");
        img.alt="screenshot";
        img.src="data:image/png;base64,"+base64;
        document.body.appendChild(img);
    }