Pixel clic écran

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Pixel clic écran

Message par EmileF » 05 Avr 2023 18:37

Bonjour,

Après plusieurs mois d'absence, me revoilà.

je cherche le moyen de récupérer la couleur du pixel à l'endroit où le clique à l'écran.

Par exemple, quand on veux définir une couleur avec la popup couleur, il y a possibilité de copier une couleur d'un pixel de l'écran quand on choisi la pipette. Je voudrais trouver le moyen d'obtenir ce résultat.

Y a t'il quelqu'un qui pourrait me mettre sur la voie ?
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: Pixel clic écran

Message par jmhoubre » 05 Avr 2023 21:15

Question posée à chatGPT : "avec Unity et du code C#, je voudrais récupérer la couleur d'un pixel à l'endroit où je clique"
Réponse :
Pour récupérer la couleur d'un pixel à l'endroit où vous cliquez dans Unity avec du code C#, vous pouvez suivre les étapes suivantes:
  • Ajoutez un composant "Camera" à votre scène Unity si vous n'en avez pas déjà un.
  • Attachez un script C# à la caméra en cliquant sur l'icône de script dans l'inspecteur de la caméra.
  • Dans le script C#, utilisez la fonction "Input.GetMouseButtonDown(0)" pour détecter quand l'utilisateur clique sur le bouton gauche de la souris.
  • Si l'utilisateur a cliqué, utilisez la fonction "Camera.ScreenToWorldPoint()" pour convertir la position de la souris en un point dans le monde Unity.
  • Ensuite, utilisez la fonction "Camera.WorldToScreenPoint()" pour convertir ce point en un point de l'écran.
  • Enfin, utilisez la fonction "Texture2D.GetPixel()" pour obtenir la couleur du pixel à cet endroit.
Et le code fourni (non testé) :

Code : Tout sélectionner

using UnityEngine;

public class PixelColorPicker : MonoBehaviour
{
    public Texture2D texture;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // Convert mouse position to world point
            Vector3 mousePos = Input.mousePosition;
            mousePos.z = Camera.main.nearClipPlane;
            Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);

            // Convert world point back to screen point
            Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);

            // Get pixel color
            int x = Mathf.RoundToInt(screenPos.x);
            int y = Mathf.RoundToInt(screenPos.y);
            Color color = texture.GetPixel(x, y);

            // Do something with the color
            Debug.Log("Clicked color: " + color);
        }
    }
}
Notez que ce script suppose que vous avez une texture assignée à la variable "texture" dans l'inspecteur de l'objet qui détient ce script. Vous pouvez modifier cela en utilisant une autre méthode pour obtenir la texture que vous souhaitez utiliser pour récupérer la couleur des pixels.

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: Pixel clic écran

Message par EmileF » 06 Avr 2023 08:27

Merci beaucoup pour cette réponse.

Mais j'aurai dû préciser un détail, et pas des moindre, je voudrai récupérer la couleur du pixel en dehors de l'écran de jeu, par exemple sur un deuxième écran. Ceci pour faciliter l'édition de mon jeu.

En fait, mon jeu comporte un éditeur de niveau. Sur un deuxième écran, j'ai le modèle du niveau que je veux créer. Je voudrai pouvoir cliquer sur ce deuxième écran pour récupérer la couleur de certains éléments pour me permettre de créer dans mon jeu les objets correspondants.

Le script proposé me permet seulement de récupérer la couleur d'un pixel de la texture affichée, si j'ai bien compris.

Merci quand même
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: Pixel clic écran

Message par boubouk50 » 06 Avr 2023 09:39

ChatGPT, c'est sympa, mais il ne régurgite pas encore du code valide ou complet.
La texture, je suppose qu'il s'agisse de la rendertexture de la caméra, donc cette caméra ne rend pas à l'écran mais en texture, il faudrait donc la dupliquer.
Il existe aussi la possibilité de récupérer ce que rend la caméra directement sans rendertexture avec OnPostRender.

Tout ce qui est rendu, est rendu par une caméra, donc vous pouvez récupérer ce qu'elle a rendu durant une frame, et lire la couleur du pixel associé. Ca devra donner ça à quelques ajustements près:

Code : Tout sélectionner

// la camera qui rend sur votre 2e ecran
public Camera myCam;

    private Texture2D destinationTexture;
    private Vector2 screenPosition = Vector2.zero;
    private Color pColor = Color.black;
    
private void Start ()
    {
        // Creer une texture qui accueillera le rendu de la camera
        destinationTexture = new Texture2D (1, 1, TextureFormat.RGB24, false);

        // Ajouter le callback onPostRender
        Camera.onPostRender += OnPostRenderCallback;
    }

    public Color GetPickingColor ()
    {
        return pColor;
    }

    private void OnPostRenderCallback (Camera cam)
    {
            // Lire seulement sur la camera souhaitee
            if (cam == myCam)
            {
            	// Recuperer la position de la souris a l ecran
                Vector2 screenPosition = Input.mousePosition;
                // ATTENTION : ICI JE NE SUIS PAS SUR
                // Les coordonnees Screen ont pour origine le coin bas gauche
                // Les coordonnees Texture ont pour origine le coin haut gauche
                // Il faudrait donc inverser la coordonnee Y - A supprimer si ce n est pas le cas
                screenPosition.y =  Screen.Height - screenPosition.y;
                // OU ALORS PARCE QUE DOUBLE ECRAN, FAUDRAIT IL PRENDRE LA HAUTEUR DE RENDU DE LA CAMERA
                screenPosition.y =  myCam.pixelHeight - screenPosition.y;
                
                // Creer le Rect qui lira dans la texture -> 1 seul pixel a lire
                Rect regionToReadFrom = new Rect (screenPosition.x, screenPosition.y, 1, 1);
                int xPosToWriteTo = 0;
                int yPosToWriteTo = 0;

                // Copier la partie definie par le Rect du rendu de la camera dans la texture 
                destinationTexture.ReadPixels (regionToReadFrom, xPosToWriteTo, yPosToWriteTo, false);
                // Lire le pixel ecrit
                pColor = destinationTexture.GetPixel (0, 0);
            }
    }

    // Remove the onPostRender callback
    void OnDestroy ()
    {
        Camera.onPostRender -= OnPostRenderCallback;
    }
"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

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: Pixel clic écran

Message par EmileF » 06 Avr 2023 17:29

Le petit soucis c'est que je n'ai pas de 2ème camera.

Mon deuxième écran est une vue sur internet, une image de Youtub par exemple.

S'il faut que je fasse une capture d'écran pour avoir une texture pour pouvoir récupérer les renseignements que je souhaite ça ne me convient pas, ça devient trop compliqué comme manipulation, je resterai donc sur la méthode manuelle que l'emploi actuellement.

Ou alors il y a quelque chose que je ne comprend pas.

En tout cas merci et je vais mettre ton script de coté, il pourra peut-être me servir
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: Pixel clic écran

Message par boubouk50 » 06 Avr 2023 17:54

Oula, tu souhaites récupérer des informations en dehors de l'application ??
Je n'ai jamais fait et je sais que même Photoshop n'en est pas capable.
Je pense même que pour des raisons évidentes de sécurité, ce n'est sûrement pas possible. Imagine, ton application serait capable de supplanter toutes les autres, même Windows ! Un moyen infaillible de bloquer un ordinateur...

Il faudrait plutôt trouver un moyen de faire une capture d'écran, de l'afficher et de lire dans cette capture au sein de l'application.
"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

Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: Pixel clic écran

Message par jmhoubre » 06 Avr 2023 22:48

Je l'ai déjà fait, mais avec Lazarus et l'utilisation de fonctions de Windows. Mon appli allait extraire des zones sur une seconde appli (navigateur web), affichée sur le 2ème écran, et je me suis arrêté là, car je n'arrivais pas à reconnaitre le texte dans l'image (peut-être qu'aujourd'hui il existe des librairies d'OCR, mais à l'époque, je n'en ai pas trouvées).
Je serais surpris qu'il n'y ait pas de moyen d'accéder à ces fonctions de Windows avec .Net.

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: Pixel clic écran

Message par EmileF » 07 Avr 2023 08:12

Bon, merci à tous les deux,

je vais continuer manuellement donc. Je ne vais pas m'ennuyer pendant plusieurs journées.

A savoir quand même que je n'avais aucune mauvaise intention.

Merci.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: Pixel clic écran

Message par boubouk50 » 07 Avr 2023 09:07

EmileF a écrit :
07 Avr 2023 08:12
A savoir quand même que je n'avais aucune mauvaise intention.
Nous n'en avons jamais douté ;-)
"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

Répondre

Revenir vers « Scripting »