Unity c #, снимок экрана и сохранение в файл как jpg

Я пытаюсь взять screencapture и сохранить его в файл в формате jpg. Я следую этому примеру.

http://docs.unity3d.com/ScriptReference/Texture2D.EncodeToPNG.html

Это то, что у меня есть до сих пор:

string jpgFile = Application.persistentDataPath + "/scrn-1.jpg"; Texture2D tex = new Texture2D (Screen.width, Screen.height); tex.ReadPixels (new Rect(0, 0, Screen.width, Screen.height), 0, 0); tex.Apply (); var bytes = tex.EncodeToJPG(); Destroy (tex); System.IO.File.WriteAllBytes(jpgFile, bytes); 

Я обнаружил, что запуск этого в Unity на iOS дает мне:

Несоответствие структуры параметров JPEG: библиотека думает, что размер равен 372, абонент ожидает 360

Однако, если я изменю преобразование в tex.EncodeToPNG (); И измените имя файла на .png, все работает нормально. Я не уверен, как можно получить какую-либо помощь. Благодарю.

Я нашел это , что позволяет сохранить его как .jpg. Обычно я использую экран захвата и сохраняю его как .png.

Ну вот:

 using UnityEngine; using System.Collections; public class HiResScreenShots : MonoBehaviour { public int resWidth = 2550; public int resHeight = 3300; private bool takeHiResShot = false; public static string ScreenShotName(int width, int height) { return string.Format("{0}/screenshots/screen_{1}x{2}_{3}.png", Application.dataPath, width, height, System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")); } public void TakeHiResShot() { takeHiResShot = true; } void LateUpdate() { takeHiResShot |= Input.GetKeyDown("k"); if (takeHiResShot) { RenderTexture rt = new RenderTexture(resWidth, resHeight, 24); camera.targetTexture = rt; Texture2D screenShot = new Texture2D(resWidth, resHeight, TextureFormat.RGB24, false); camera.Render(); RenderTexture.active = rt; screenShot.ReadPixels(new Rect(0, 0, resWidth, resHeight), 0, 0); camera.targetTexture = null; RenderTexture.active = null; // JC: added to avoid errors Destroy(rt); byte[] bytes = screenShot.EncodeToPNG(); string filename = ScreenShotName(resWidth, resHeight); System.IO.File.WriteAllBytes(filename, bytes); Debug.Log(string.Format("Took screenshot to: {0}", filename)); takeHiResShot = false; } } } 

Если вы просто хотите какой-либо картинки, я настоятельно рекомендую это:

 using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void OnMouseDown() { Application.CaptureScreenshot("Screenshot.png"); } } 

Простой и эффективный.

На самом деле мне в этом требовалось нечто подобное, но не спасение. Unity не предоставляет нам метод по умолчанию для немедленного возврата изображения в виде байта, так я решил свою проблему.

 internal class ScreenCapture : MonoBehaviour { internal byte[] Image = null; internal void SaveScreenshot() { StartCoroutine(SaveScreenshot_ReadPixelsAsynch()); } private IEnumerator SaveScreenshot_ReadPixelsAsynch() { //Wait for graphics to render yield return new WaitForEndOfFrame(); //Create a texture to pass to encoding Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false); //Put buffer into texture texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); //Split the process up--ReadPixels() and the GetPixels() call inside of the encoder are both pretty heavy yield return 0; byte[] bytes = texture.EncodeToPNG(); Image = bytes; //Tell unity to delete the texture, by default it seems to keep hold of it and memory crashes will occur after too many screenshots. DestroyObject(texture); } } 

Применение:

 internal static ScreenCapture Capture; if (Capture == null) { Capture = Camera.main.gameObject.AddComponent<ScreenCapture>(); } Capture.SaveScreenshot(); // if you wish to save: System.IO.File.WriteAllBytes("filename.png", Capture.Image); 
Intereting Posts