# Obtenir la couleur d'un pixel à l'écran ( applescript )



## johny12 (24 Août 2010)

Bonjour,

Mon but est de récupérer les couleurs de pixels affichés sur l'écran, puis de les récupérer dans un applescript.

Pour cela j'ai déjà trouvé un code carbon :

Code
#include <Carbon/Carbon.h>

int main (int argc, const char * argv[]) {
    if(argc!=3) {
        printf("Syntax : schTrouvePixel <x> <y>\n");
        exit(1);
    }
    unsigned char *addr = (unsigned char*)CGDisplayAddressForPosition(CGMainDisplayID(),atoi(argv[1]),atoi(argv[2]));
    printf("%d %d %d\n",addr[2],addr[1],addr[4]);
    return 0;
}

compilé avec :
 gcc -O3 -W -Wall -o schTrouvePixel -framework Carbon -arch i386 schTrouvePixel.c

que je reprend dans mon script de cette manière : 

do shell script "chemin_vers_carbon" & x & " " & y
set rvb to the result

Vient maintenant le problème =) :

La "lenteur", en effet, après quelques tests, j'obtient la couleur de 35 pixels/secondes, pour une utilisation de 30-40% du processeur ( dualcore 2.26ghz ) pas assez rapide à mon gout :hein:

Auriez-vous une idée pour accélérer le processus ? ( nouveau code ou manière différente )

Pourriez-vous modifier le code carbon de manière à recevoir plusieurs arguments ? ( de manière à ce que mon applescript devienne  "
do shell script "chemin_vers_carbon" & v & " "& w & " " & x & " " & y & " " & z "
Ainsi que de la rendre executable/compiller par la même occasion 
( je suis une taupe en carbon )

Merci à vous

Johny

Edit : veuillez m'excuser mais je n'ai pas trouvé les balises code ...


----------



## Céroce (24 Août 2010)

johny12 a dit:


> La "lenteur", en effet, après quelques tests, j'obtient la couleur de 35 pixels/secondes, pour une utilisation de 30-40% du processeur ( dualcore 2.26ghz ) pas assez rapide à mon gout :hein:
> 
> Auriez-vous une idée pour accélérer le processus ? ( nouveau code ou manière différente )



Oui: changer de langage de programmation et de technique.
Ton code est forcément très très lent, puisque tu lances un processus pour chaque pixel.

La seule bonne méthode est d'utiliser un langage de plus bas niveau qu'AppleScript (comme le langage C), de récupérer l'adresse de la bitmap et de faire ton traitement.

P.S.: Rien qu'en récupérant la couleur de plusieurs pixels à chaque fois que tu exécutes le programme en C, tu vas beaucoup améliorer la vitesse.


----------



## Anonyme (24 Août 2010)

Bonjour,



johny12 a dit:


> Pourriez-vous modifier le code carbon de manière à recevoir plusieurs arguments ? ( de manière à ce que mon applescript devienne  "
> do shell script "chemin_vers_carbon" & v & " "& w & " " & x & " " & y & " " & z "


Voici le code

```
#include <Carbon/Carbon.h>

int main (int argc, const char * argv[]) {
if(argc < 3) {
   printf("Deux arguments ou plus, Syntax : schTrouvePixel <x> <y>\n");
exit(1);
}
int j = (argc - 1) / 2;
int i,n;
unsigned char *addr;

for(i=0; i < j; i++) {
   n = (i * 2) + 1;
   addr = (unsigned char*)CGDisplayAddressForPosition(CGMainDisplayID( ),atoi(argv[n]),atoi(argv[n + 1]));
   printf("%d %d %d\n",addr[2],addr[1],addr[4]);
}
return 0;
}
```
C'est le nombre de fois que tu appelles le shell qui prend  du temps et du CPU

En AppleScript, ceci retourne les valeurs RGB de deux mille pixels en moins d'une seconde

```
set x to 300
set y to 300
set l to ""
repeat 2000 times
	set x to x + 1
	set y to y + 1
	set l to l & " " & x & " " & y
end repeat
do shell script "/chemin_vers/schTrouvePixel " & l
```


----------



## johny12 (24 Août 2010)

Merci à vous deux =)

Vous serrait-il juste possible de le compiler/le mettre sous forme d'executable et de m'en envoyer une copie ? merci


----------



## tatouille (24 Août 2010)

fais un mini server bind


----------



## johny12 (24 Août 2010)

Ce qui signifie en clair ? ^_^

( omis l'applescript je suis une taupe )


----------



## Anonyme (24 Août 2010)

johny12 a dit:


> Vous serrait-il juste possible de le compiler/le mettre sous forme d'executablei



Le voici :


----------



## johny12 (24 Août 2010)

Je suis vraiment sidéré par le résultat, 2000-3000-6000 pixels, le tout en moins d'une seconde !

Merci beaucoup !


----------



## Astronight (21 Juin 2011)

Bonsoir! 
S'il vous plait, j'ai aussi besoin de l'exécutable de ce script ^^'
Est-il possible s'il vous plait de me le compiler? Je ne sais pas comment faire!
Merci


----------



## Anonyme (21 Juin 2011)

Astronight a dit:


> Bonsoir!
> S'il vous plait, j'ai aussi besoin de l'exécutable de ce script ^^'
> Est-il possible s'il vous plait de me le compiler? Je ne sais pas comment faire!
> Merci


Si tu as installé le paquet "*Xcode tools*" (il est sur le DVD d'installation), il faut faire dans le Terminal

```
cd /le chemin du dossier où se trouve le fichier schTrouvePixel.c; gcc -O3 -W -Wall -o schTrouvePixel -framework Carbon -arch i386 schTrouvePixel.c
```

On peut aussi le compiler dans l'application *Xcode*

Sinon voici l'exécutable


----------



## Astronight (21 Juin 2011)

Ok C'est toujours bon à savoir! 
En tout cas merci pour vos 2 réponses


----------



## Astronight (21 Juillet 2011)

Bonsoir, j'ai essayé ce soir, après avoir installé mac os x lion, ce script et avec stupeur, celui-ci ne marche plus.

Quand j'exécute ce script, j'obtiens ce message d'erreur.

error "La commande a été annulée à cause de la réception dun signal." number 1010.


Quel est le problème d'après vous?
Merci d'avance!


----------



## Astronight (22 Juillet 2011)

Personne?


----------



## Astronight (26 Juillet 2011)

Personne n'aurait une idée sur comment modifier le code de mac_jac pour le rendre compatible avec Lion?

Je vous remercie d'avance!


----------



## neez0 (6 Août 2011)

Astronight a dit:


> Personne n'aurait une idée sur comment modifier le code de mac_jac pour le rendre compatible avec Lion?
> 
> Je vous remercie d'avance!


 
Effectivement, CGDisplayAddressForPosition semble être déprécié sous Lion.

Je suis en train de construire un Ambilight DIY et je cherche aussi à obtenir le même résultat sous Lion.

Edit: Peut-être qu'il serait possible d'arriver à quelque chose avec CGDisplayCreateImageForRect.
Edit2: On en parle ici

Merci !


----------



## Astronight (6 Août 2011)

Merci pour votre réponse! Deja, il y'a donc de l'espoir pour modifier ce code.


Je vais essayer de me renseigner un peu à propos d'ambilight DIY,  NSReadPixel et CGDisplayCreateImageForRect et essayer de modifier le code. (Je dois le modifier grace à xCode c'est bien celà? Je suis encore novice dans ce domaine).


----------

