Jump to content
Unity Insider Forum

Screenshot speichert nur ein schwarzes Bild


minuschki

Recommended Posts

Hallo zusammen

Ich habe das folgende Script mit einem Button verknüpft. Sobald dieser gedrückt wird, soll ein Screenshot von einem rechteckigen Bereich (280, 0, 400, 400) meiner MainCamera gemacht werden und im angegebenen Ordner gespeichert werden.

Problem: Es wird zwar ein PNG-Bild in der Grösse 400 x 400 im gewünschten Ordner abgelegt, aber dieses ist einfach nur komplett schwarz.

Mit dem Befehl ScreenCapture hat das noch ganz gut geklappt, aber ich möchte eben nur einen bestimmten Bereich als Bild speichern und nicht den ganzen Screen.

Vielleicht kann jemand von euch Profis den Code so ändern, dass er funktioniert. Danke für eure Hilfe!

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class screenshot : MonoBehaviour {

	string a_Path;


	public void shot () {

		var tex = new Texture2D(400, 400, TextureFormat.RGB24, false);

		tex.ReadPixels(new Rect(280, 0, 400, 400), 0, 0);

		tex.Apply();

		var bytes = tex.EncodeToPNG();

		Destroy(tex);

		a_Path = System.IO.Directory.GetCurrentDirectory() + "/Screenshots/";
		var nameScreenshot = "Screenshot " + System.DateTime.Now.ToString("dd-MM-yyyy HH-mm-ss") + ".png";

		System.IO.File.WriteAllBytes(a_Path + nameScreenshot, bytes);

	}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo devandart

Danke für deine Hilfe!

Ich habe dein vorgeschlagenes Script durch meines ersetzt, erhalte aber Fehlermeldungen (camera.targetTexture und camera.Render werden nicht akzeptiert).

Da ich Anfänger bin und gerade erst C# erlerne, habe ich leider keine Ahnung, wie man das beheben kann!

Ich wäre dir sehr dankbar, wenn du entweder den oben geposteten Code funktionstüchtig ändern könntest oder die Fehlemeldungen im unteren Script beheben könntest!

Sorry für die Umstände!

 

MonoDevelop-UnitySchnappschuss001.png.8ea4c42eb05197007ef15ef69dfbcba1.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das passiert, weil Du keine Variable vom Typ Camera in deiner Klasse hast. Du musst also entweder die Main Camera nehmen, oder die Kamera im Inspector der Komponente zuweisen.

//im Inspector zuweisen
[SerializeField]
private Camera screenshotCamera;

//und unten dann
screenshotCamera.Render(); //usw...

//Main Camera nutzen
z.B. camera.Render() ersetzen durch Camera.main.Render();

Du kannst übrigens Code mit dem Code-Tag in deinen Post einbetten, dann kann man den auch direkt kopieren und korrigiert posten. :)

Ich hoffe, das hilft dir.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 weeks later...

Hallo devandart

Besten Dank für deine Hilfe!

Und es hat auch endlich geklappt. Im untenstehenden Code musste ich lediglich "byte[] bytes" durch "var bytes" ersetzen.

Das Gute ist auch, dass auf dem Screenshot die UI Menuelemente gar nicht sichtbar sind.

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class screenshot : MonoBehaviour {

	string a_Path;


	public void shot () {

		Debug.Log ("Bild wurde gesichert!");

		a_Path = System.IO.Directory.GetCurrentDirectory() + "/Screenshots/";
		RenderTexture tex = new RenderTexture(1600, 1600, 24);
		Camera.main.targetTexture = tex;
		Texture2D screenShot = new Texture2D(1600, 1600, TextureFormat.RGB24, false);
		Camera.main.Render();
		RenderTexture.active = tex;
		screenShot.ReadPixels(new Rect(0, 0, 1600, 1600), 0, 0);
		Camera.main.targetTexture = null;
		RenderTexture.active = null;
		Destroy(tex);
		var bytes = screenShot.EncodeToJPG(100);

		var nameScreenshot = "Screenshot " + System.DateTime.Now.ToString("dd-MM-yyyy HH-mm-ss") + ".jpg";
		System.IO.File.WriteAllBytes(a_Path + nameScreenshot, bytes);

	}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...