Unity - 遊戲中擷取畫面(Screenshot)

  最簡單的方法就是使用Unity提供的API來擷取遊戲畫面,例如:Application.CaptureScreenshot("filename.png")
就會直接把畫面存成PNG檔案。


  另外一種使用ReadPixels來貯存畫面資料,因為使用第一種方法會先把檔案存下來,要使用的話還必須Load檔案才行,不過若只要單純的擷取圖片使用這個即可。如果想要操弄擷取的畫面又或者是不需要存檔的話,建議可以使用ReadPixels,這個也只要再加上檔案寫入的方法,也同樣可以把圖片存下來。


Code:
public Camera myCamera;
IEnumerator Screenshot() {
     //在擷取畫面之前請等到所有的Camera都Render完
     yield return new WaitForEndOfFrame();
  
     Texture2D texture = new Texture2D((int)myCamera.pixelWidth, (int)myCamera.pixelHeight);
     //擷取全部畫面的資訊
     texture.ReadPixels(new Rect(0, 0, (int)myCamera.pixelWidth, (int)myCamera.pixelHeight),0,0, false);
     texture.Apply();

     //自己處理畫面資料的方法
     //...
}

如果要把讀取的資料存成圖片檔也很簡單,用File I/O把Texture2D的資料寫入檔案即可
void SaveTextureToFile(Texture2D texture, string fileName) {
     byte[] bytes = texture.EncodeToPNG();
     string filePath = Application.dataPath + "/" + fileName + ".png";
     using (FileStream fs = File.Open(filePath, FileMode.Create)) {
          BinaryWriter binary = new BinaryWriter(fs);
          binary.Write(bytes);
     }
}

5 comments:

Unknown said...

你好~想請問一下void SaveTextureToFile(Texture2D texture, string fileName)
這邊的texture跟filename要怎麼給呢?
我想設一個按鈕來執行這個功能,但呼叫時跑出error,所以想請問一下使用方法~~
謝謝您哦!

IVerv said...

不知道你的錯誤訊息是什麼呢? 如果你的texture是來自unity專案裡面的物件, 比較有可能的狀況就是該texture沒有設定readable.

Unknown said...

您好,我目前的寫法是一開始宣告public Texture2D texture;
然後有一個按鈕的功能是
public void okClick()
{
StartCoroutine (Screenshot ());
SaveTextureToFile (texture, "anwser");
}
得到錯誤訊息是UnassignedReferenceException表示texture沒有被assign...
不過好像在UI物件內沒有texture2D的選項 有嘗試過給它image物件但也不能用
所以不太知道assign什麼給它?

IVerv said...

如果你在外面宣告了Texture2D,那你應該會在那個component的inspector看到那個欄位,沒有放東西當然就會出問題, 但我想你應該不是要這麼做, 既然你呼叫了Screenshot(), 那就在我最後的註解(//自己處理畫面資料的方法), 這邊如果還要再對擷取的圖做加工也可以, 沒有的話就直接呼叫SaveTextureToFile(), 把剛剛擷取的texture丟入.

Unknown said...

原來是這樣~謝謝

Post a Comment