[RESOLU] prendre une texture 2D depuis une caméra spécifique et faire une image depuis un élément UI sur la dite caméra.

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Répondre
Petitmoineau
Messages : 6
Inscription : 24 Mars 2017 16:21

[RESOLU] prendre une texture 2D depuis une caméra spécifique et faire une image depuis un élément UI sur la dite caméra.

Message par Petitmoineau » 24 Mars 2017 17:00

Bonjour à vous,

Nous voulons utiliser une caméra (en plus de la première) disposant d’un élément UI à l’intérieur d’un canvas. Nous voulons sauvegarder la vue de la camera dans une fichier png/jpg. Ceci étant, nous avons un doute sur la méthode à employer.

Nous essayons d’utiliser une fonctionnalité du render texture, mais il enregistre l’élément UI dans une résolution de mauvaise qualité or je voudrais garder les dimensions originel en hauteur et en largeur.

Merci d'avance pour le temps que vous accorderez à ce sujet.

Parti de code problématique.

Code : Tout sélectionner

#region "Ienumerator that takes screenshot"
	public IEnumerator takeScreenShot()
	{
		yield return new WaitForEndOfFrame (); 
		Vector2 temp = contentCorner.transform.position;
		width = System.Convert.ToInt32(content.rect.width); 
		height = System.Convert.ToInt32(content.rect.height);
		float Xp = temp.x - width/2;
		float Yp = temp.y - height/2;

		Texture2D tex = new Texture2D (width,height, TextureFormat.RGB24, false);
		tex.ReadPixels (new Rect(Xp, Yp, width, height), 0, 0);
		tex.Apply ();

		//---------------------------
		var bytes = tex.EncodeToPNG();
		Destroy(tex);

		if (imageName == "Screenshot_") {
			File.WriteAllBytes(customPath + "/" + imageName + index + "."+ format, bytes);

		} else {
			File.WriteAllBytes (customPath + "/" + imageName + "."+ format, bytes);

		}
		index++;
	}
	#endregion
 ! Message de : boubouk50
Les balises

Code : Tout sélectionner

 pour encapsuler le code svp![/mod]
Dernière édition par Petitmoineau le 24 Avr 2017 23:49, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Comment prendre une texture 2D depuis une caméra spécifique et faire une image depuis un élément UI sur la dite camé

Message par boubouk50 » 24 Mars 2017 17:04

Code : Tout sélectionner

width = System.Convert.ToInt32(content.rect.width); 
height = System.Convert.ToInt32(content.rect.height);
Que te retournent ces valeurs?
Si tu fais un screenshot sur toute ta fenêtre, tu peux utiliser Screen.width et Screen.height à la place. Sinon, il faut récupérer la taille du RectTransform de ton élément d'UI.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Petitmoineau
Messages : 6
Inscription : 24 Mars 2017 16:21

Re: Comment prendre une texture 2D depuis une caméra spécifique et faire une image depuis un élément UI sur la dite camé

Message par Petitmoineau » 25 Mars 2017 11:47

Merci pour ta réponse Boubouk.
Une chose importante c'est que cette manip vise à faire une capture d'un éléments ayant une taille supérieur à celle de l'écran.
Les valeurs servent à déclarer une nouvelle texture ayant les dimensions de l'image finale.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Comment prendre une texture 2D depuis une caméra spécifique et faire une image depuis un élément UI sur la dite camé

Message par boubouk50 » 27 Mars 2017 10:03

Petitmoineau a écrit :Les valeurs servent à déclarer une nouvelle texture ayant les dimensions de l'image finale.
C'est justement pour cela que je te demande leur valeur, par rapport à ton problème:
mais il enregistre l’élément UI dans une résolution de mauvaise qualité or je voudrais garder les dimensions originel en hauteur et en largeur.
Alors, j'ai mal compris. Tes dimensions sont bonnes mais la qualité est pourrie? Il faudrait donc regarder du côté du format TextureFormat.RGB24 de la texture créée ou bien du sprite utilisé pour l'UI.
Peux-tu nous faire une capture d'écran stp? Je suis pas sur de bien comprendre. Merci.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Petitmoineau
Messages : 6
Inscription : 24 Mars 2017 16:21

Re: Comment prendre une texture 2D depuis une caméra spécifique et faire une image depuis un élément UI sur la dite camé

Message par Petitmoineau » 29 Mars 2017 16:25

Bonjour,
Alors effectivement la taille est la bonne par contre lorsqu'on enregistre l'image reste grise (dans le cas d'une image plus grande que l'écran).

L'idée étant de combiner dans une image (enregistrée en .jpeg ou png) des traits contenus dans un canvas et une image affichée en dessous des traits.Image

Exemple de hierarchy :
Image
Tout est contenu dans un canvas. Dans "Background" on affiche l'image, ici un singe (tous les éléments sont des UI). Lorsque nous créons une ligne cela génère un enfant de "Background". Cet enfant contient les éléments des flèches (point, traits).



Lorsque l'image tient sur l'écran ça fonctionne correctement. Par contre quand celle-ci est plus grande la solution que nous avons testé reste insatisfaisante (image grise).

Merci d'avance
Dernière édition par Petitmoineau le 29 Mars 2017 16:44, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Comment prendre une texture 2D depuis une caméra spécifique et faire une image depuis un élément UI sur la dite camé

Message par boubouk50 » 29 Mars 2017 16:38

Je ne comprends pas: l'image plus grande que l'écran.
Le ReadPixels lit les pixels à l'écran et les mets dans une texture, tu ne peux donc pas lire des pixels qui ne sont pas affichés. Si ton image est hors cadre alors ce n'est pas possible de la capturer de cette manière.
La solution serait, lors de la capture, de placer la caméra de façon à ce qu'elle englobe toute l'image, avant de la remettre à sa place.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Petitmoineau
Messages : 6
Inscription : 24 Mars 2017 16:21

Re: Comment prendre une texture 2D depuis une caméra spécifique et faire une image depuis un élément UI sur la dite camé

Message par Petitmoineau » 01 Avr 2017 15:15

Encore merci pour ta réponse.
En fait avec la solution que tu proposes nous avons peur d'une perte de résolution. Qu'en penses-tu ?

De fait en y repensant nous nous sommes dit qu'une solution satisfaisante serait de mettre les UI dans un sprite et de prendre plusieurs screen shot de l'image. Nous aurions ainsi l'image divisée en plusieurs morceaux mais avec une définition satisfaisante.
Cependant nous buttons sur le procédè à employer pour réunir les différentes captures en une seule image.
Image

qu'en penses tu et aurais-tu une solution ?

Merci d'avance et bonne journée.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Comment prendre une texture 2D depuis une caméra spécifique et faire une image depuis un élément UI sur la dite camé

Message par boubouk50 » 03 Avr 2017 09:32

As-tu essayé de passer par la fonction CaptureScreenshot ()?
Elle a un paramètre supersize qui te permet d'augmenter la résolution de capture.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Petitmoineau
Messages : 6
Inscription : 24 Mars 2017 16:21

Re: Comment prendre une texture 2D depuis une caméra spécifique et faire une image depuis un élément UI sur la dite camé

Message par Petitmoineau » 03 Avr 2017 10:15

Ha non pas du tout .
Cela semble très prometteur. Merci pour le conseil.
Nous allons tester !


Répondre

Revenir vers « Scripting »