[Unity] 截圖、縮放、Bytes轉換
最近寫到了一個存檔系統,而存檔系統的預覽圖需要當前畫面的截圖,
在實作這個功能時考慮到了以下幾點:
程式碼其實還可以寫得再簡潔一點,
不過考量到功能的泛用性還是決定個別封裝起來。
[效果展示]
在實作這個功能時考慮到了以下幾點:
- 螢幕截圖的圖像尺寸會很大,預覽圖並不需要這麼大張的圖檔造成記憶體空間的浪費,所以想要對截圖影像作尺寸的縮放調整。
- 因為存檔資料的範圍都集中在一個 Class 集中管理,並不想額外儲存圖像檔,可以的話希望能轉成別的格式跟著這個 Class一併轉成 Json 檔。
最後找到了解決方案,順手在此紀錄一下。
byte[] screenshotData; // 儲存紀錄,在此執行螢幕擷取 protected IEnumerator SaveGameData() { // 在當前禎的結尾進行截圖 yield return new WaitForEndOfFrame(); // 螢幕截圖的實作,並且指派到 tex 變數 (Texture2D) var tex = new Texture2D(Screen.width, Screen.height); tex.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); // 縮放尺寸 tex = ScaleTexture(tex, 192, 108); tex.Apply(); screenshotData = tex.EncodeToPNG()); } // 代入圖像並且指定縮放的尺寸 Texture2D ScaleTexture(Texture2D source, int targetWidth, int targetHeight) { // 依據代入的尺寸實例化一個 Texture2D 物件 var result = new Texture2D(targetWidth, targetHeight, source.format, false); // 圖像尺寸縮放 for(int i = 0; i < result.height; ++i) { for(int j = 0; j < result.width; ++j) { var col = source.GetPixelBilinear( (float)j / result.width, (float)i / result.height ); result.SetPixel(j, i, col); } } result.Apply(); return result; } // 將儲存的 byte[] 轉換為圖像 Texture2D GetTextureWithBytes() { var tex = new Texture2D(192, 108); tex.LoadImage(screenshotData); return tex; }
程式碼其實還可以寫得再簡潔一點,
不過考量到功能的泛用性還是決定個別封裝起來。
[效果展示]
留言
張貼留言