Search code examples
androidscreenshotunity-game-engine

Screenshot image not showing on Unity UI


I've implemented that code in my app so the user can take screenshots and save/share it, when I press the camera button the screeshot function is working fine, but the load function is not, I can't see the screenshot taken on my Gameobject.

enter image description here

using UnityEngine;
using System.Collections;
using System.IO;
using UnityEngine.UI;

public class SnapshotShare : MonoBehaviour
{
    private AndroidUltimatePluginController androidUltimatePluginController;
    Camera mainCamera;
    RenderTexture renderTex;
    Texture2D screenshot;
    Texture2D LoadScreenshot;
    int width = Screen.width;   // for Taking Picture
    int height = Screen.height; // for Taking Picture
    string fileName;
    string screenShotName = "PictureShare.png";

    void Start ()
    {
        androidUltimatePluginController = AndroidUltimatePluginController.GetInstance ();

    }

    public void Snapshot ()
    {
        StartCoroutine (CaptureScreen ());
    }

    public IEnumerator CaptureScreen ()
    {
        yield return null; // Wait till the last possible moment before screen rendering to hide the UI

        GameObject.Find ("Canvas").GetComponent<Canvas> ().enabled = false;
        yield return new WaitForEndOfFrame (); // Wait for screen rendering to complete
        if (Screen.orientation == ScreenOrientation.Portrait || Screen.orientation == ScreenOrientation.PortraitUpsideDown) {
            mainCamera = Camera.main.GetComponent<Camera> (); // for Taking Picture
            renderTex = new RenderTexture (width, height, 24);
            mainCamera.targetTexture = renderTex;
            RenderTexture.active = renderTex;
            mainCamera.Render ();
            screenshot = new Texture2D (width, height, TextureFormat.RGB24, false);
            screenshot.ReadPixels (new Rect (0, 0, width, height), 0, 0);
            screenshot.Apply (); //false
            RenderTexture.active = null;
            mainCamera.targetTexture = null;


        }
        if (Screen.orientation == ScreenOrientation.LandscapeLeft || Screen.orientation == ScreenOrientation.LandscapeRight) {
            mainCamera = Camera.main.GetComponent<Camera> (); // for Taking Picture
            renderTex = new RenderTexture (height, width, 24);
            mainCamera.targetTexture = renderTex;
            RenderTexture.active = renderTex;
            mainCamera.Render ();
            screenshot = new Texture2D (height, width, TextureFormat.RGB24, false);
            screenshot.ReadPixels (new Rect (0, 0, height, width), 0, 0);
            screenshot.Apply (); //false
            RenderTexture.active = null;
            mainCamera.targetTexture = null;

        }
        // on Win7 - C:/Users/Username/AppData/LocalLow/CompanyName/GameName
        // on Android - /Data/Data/com.companyname.gamename/Files
        File.WriteAllBytes (Application.persistentDataPath + "/" + screenShotName, screenshot.EncodeToPNG ());  

        // on Win7 - it's in project files (Asset folder)
        //File.WriteAllBytes (Application.dataPath + "/" + screenShotName, screenshot.EncodeToPNG ());  
        //File.WriteAllBytes ("picture1.png", screenshot.EncodeToPNG ());
        //File.WriteAllBytes (Application.dataPath + "/../../picture3.png", screenshot.EncodeToPNG ());
        //Application.CaptureScreenshot ("picture2.png");
        GameObject.Find ("Canvas").GetComponent<Canvas> ().enabled = true; // Show UI after we're done
        LoadImage();

    }

    public void ShareImage ()
    {
        string path = Application.persistentDataPath + "/" + screenShotName;
        androidUltimatePluginController.ShareImage("subject","Teste de compartilhamento",path);

    }

    public void LoadImage ()
    {
        string path = Application.persistentDataPath + "/" + screenShotName;
        byte[] bytes;
        bytes = System.IO.File.ReadAllBytes(path);
        LoadScreenshot = new Texture2D(90,90);
        LoadScreenshot.LoadImage(bytes);
        GameObject.Find("Picture").GetComponent<Renderer> ().material.mainTexture = LoadScreenshot;
        Debug.Log("LOAD IMAGE");
    }

    public void close ()
    {
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
#else
         Application.Quit();
#endif
    }
}

The Solution as Gunther Fox said:

 public void LoadImage()
    {

        string path = Application.persistentDataPath + "/" + screenShotName;
        byte[] bytes;
        bytes = System.IO.File.ReadAllBytes(path);
        LoadScreenshot = new Texture2D(4, 4);
        LoadScreenshot.LoadImage(bytes);
        Sprite sprite = Sprite.Create(screenshot, new Rect(0, 0, width, height), new Vector2(0.5f, 0.0f), 1.0f);

        GameObject.Find("Picture").GetComponent<SpriteRenderer>().sprite = sprite;

        Debug.Log("LOAD IMAGE");

    }

Solution

  • The issue is that you're setting the Texture of a Material on a SpriteRenderer; you should be settings the sprite property. Check out this Unity doc on creating a Sprite and then you can apply that knowledge to your situation:

    Create a Sprite object after loading your texture and then use GetComponent<SpriteRenderer> to change the sprite property. You shouldn't have to change any Materials.