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

johny12

Membre actif
10 Mars 2008
150
3
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

Membre actif
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.
 
A

Anonyme

Invité
Bonjour,

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
Bloc de 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
Bloc de code:
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

Membre actif
10 Mars 2008
150
3
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
 

Astronight

Membre confirmé
12 Décembre 2010
66
1
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
 
A

Anonyme

Invité
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
Bloc de code:
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

Membre confirmé
12 Décembre 2010
66
1
Ok C'est toujours bon à savoir!
En tout cas merci pour vos 2 réponses ;)
 

Astronight

Membre confirmé
12 Décembre 2010
66
1
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

Membre confirmé
12 Décembre 2010
66
1
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

Membre enregistré
6 Août 2011
1
0
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 !
 
Dernière édition:

Astronight

Membre confirmé
12 Décembre 2010
66
1
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).