2014-10-06 3 views
3

Я пытаюсь выполнить скриншот и сохранить его в файле в формате jpg. Я следую этому примеру.Unity C#, снимать снимок экрана и сохранять в файл как 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 на прошивке дает мне:

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

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

+0

Вы также пытались в [Game Dev] Обмен (http://gamedev.stackexchange.com/)? – MVCDS

+0

У меня нет. В ближайшее время я попытаюсь найти дубликат. Благодарю. –

+0

Вы отметили это с помощью «ios», поэтому я предполагаю, что вы работаете на карманном устройстве Apple с некоторым разнообразием. Попробовали ли вы одновременно нажать на кнопки питания и питания? ;) –

ответ

5

Я нашел this, что позволяет вам сохранить его как .jpg. Обычно я использую capture screen и сохраняю как .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"); 
    } 
} 

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

+0

Благодарим вас за ответ. Второй пример, который вы предоставили, - это то, что я использовал вначале. Затем стало важно сохранить захваченный файл как jpg. В первом примере вы заметите, что при преобразовании Texture2D в байт [], который мы вызываем EncodeToPNG(); К сожалению, этот блок кода сохраняет файл как png. Проблема, с которой я столкнулась, заключалась в том, что вызывающая функция Texture2d сестра EncodeToJPG() давала мне ошибку, которую я видел выше. Спасибо за ваш пост, хотя :) –

0

На самом деле мне в этом было нужно что-то подобное, но не спасение. 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^