1. 程式人生 > >Unity 截圖方法

Unity 截圖方法

設定 保存 設置 res ren hot tor false 分享圖片

  1. 調用Unity API

    ScreenCapture.CaptureScreenshot("screen.png", 0);

    1. 截圖的圖片僅能保存為png格式,且第一個形參必須加.png
    2. 第二個參數為設定分辨率,大於1的情況下會增加分辨率,如為4,則是默認分辨率的4倍
    3. 只能保存在Application.persistentDataPath目錄下
    4. 函數本身只能截全屏,如果實在要截部分屏幕,可以通過在截圖後,當作本地圖片讀取後,進行修改

    技術分享圖片

  2. 使用Texture2D.ReadPixels方法,該方法可以將當前RenderTexture(如沒有設置則是Screen)的數據讀到某Texture2D中
    1. 代碼

    private IEnumerator CaptureScreenshot2(Rect rect)

    {

    Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);

    yield return new WaitForEndOfFrame();

    screenShot.ReadPixels(rect, 0, 0);

    screenShot.Apply();

    byte[] bytes = screenShot.EncodeToPNG();

    string filename = Application.dataPath + "/Screenshot.png";

    System.IO.File.WriteAllBytes(filename, bytes);

    }

    1. 這裏必須使用Coroutine,並且在當前幀渲染後調用ReadPixels,因為這時候當前RenderTexture中才有圖像
    2. Rect的不同控制了截圖的範圍

      StartCoroutine(CaptureScreenshot2(new Rect(0, 0,

      Screen.width/2, Screen.height/2)));

      則從左下角截屏幕寬度和高度各一半的圖

      技術分享圖片

  3. 改良版方法2,方法2中ReadPixels默認讀取的是RenderTexture.active當沒有手動設置時,該值為屏幕圖像,這裏我們可以通過設置Rendertexture來只截某個攝像機看到的鏡像
    1. 前期準備,新增一個Camera,且該Camera僅渲染UI,為了不遮擋第一個攝像機渲染的物體,這裏ClearFlag設置為Don‘t Clear

      技術分享圖片

      此時場景中有兩個攝像機

      技術分享圖片

    2. 代碼

      思路為創建一個renderTexture,並通過camera渲染,然後裝填該RenderTexture後,通過ReadPixels讀取

      private void CaptureCamera(Camera camera, Rect rect)

      {

      RenderTexture _renderTex = new RenderTexture((int)rect.width, (int)rect.height, 0);

      camera.targetTexture = _renderTex;

      camera.Render();

      camera.targetTexture = null;

      RenderTexture.active = _renderTex;

      Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);

      screenShot.ReadPixels(rect, 0, 0);

      screenShot.Apply();

      RenderTexture.active = null;

      byte[] bytes = screenShot.EncodeToPNG();

      string filename = Application.dataPath + "/Screenshot.png";

      System.IO.File.WriteAllBytes(filename, bytes);

      }

    3. 調用該函數,並且傳遞的Camera參數為僅渲染UI的Camera,並且全屏截圖,這裏為了讓結果更明顯,我們將UI字體設為了紅色,結果如下

      技術分享圖片

參考

http://blog.csdn.net/anyuanlzh/article/details/17008909

Unity 截圖方法