Pergunta

Eu estou tentando criar um aplicativo que quando a cor de um pixel na tela muda para outra (que eu sei o que é) ele faz algo, realmente não importa para a pergunta o que ele faz.

De qualquer forma, estou usando o seguinte:

 CGImageRef window283x420 = CGWindowListCreateImage(NSMakeRect(284, 420, 1, 1), kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
 NSBitmapImageRep *cannonOne = [[NSBitmapImageRep alloc] initWithCGImage:window283x420];

Em seguida, a cor que eu estou esperando que ele mude para cá:

NSColor *color = [NSColor colorWithCalibratedRed:0.521569 green:0.380392 blue:0.231373 alpha:1];

E estou comparando as cores aqui:

while (![color isEqualToColor:[cannonOne colorAtX:0 y:0]]) {
 CGImageRef window283x420 = CGWindowListCreateImage(NSMakeRect(284, 420, 1, 1), kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);
 NSBitmapImageRep *cannonOne = [[NSBitmapImageRep alloc] initWithCGImage:window283x420];
 if ([color isEqualToColor:[cannonOne colorAtX:0 y:0]]) {

Eu sei que o tempo / que parte poderia ser feito melhor, mas deve funcionar muito bem e não se preocupar sobre como otimizar o aplicativo até que ele realmente funciona lol.

Agora, se por exemplo, a cor do pixel na verdade não mudam rápido (como as estadias de cores, como que por um pouco) ele funciona perfeitamente. Se ele é como um pixel com uma cor que se move em torno e alcances 283 * 420, mas não ficar lá por muito tempo (como 0.1s) (conforme descrito no exemplo acima) ele não funciona.

O tempo ele permanece lá não deve ser um problema, já que meu aplicativo está verificando o pixel muito rápido, como visto na depuração aqui:

2010-01-04 22:12:58.230 appname[2372:a0f] Checked
2010-01-04 22:12:58.231 appname[2372:a0f] Checked

Todas as idéias? :)

Foi útil?

Solução

Como gs pontos fora, isso não é trivial. Você gostaria de ter um olhar para o exemplo da Apple CIColorTracking que utiliza um filtro personalizado Núcleo de imagem para detectar os pixels em uma imagem em movimento:

http://developer.apple.com/mac/library/samplecode/ CIColorTracking /

Há um pouco mais informações sobre como é feito aqui:

http://parmanoir.com/How_Core_Image_Color_Tracking_works

Outras dicas

É possível que um objeto em movimento nunca chega a esse ponto . O monitor tem uma frequência de actualização de cerca de 50 hertz, se um único pixel está viajando mais rápido do que 50 pixels / seg ele não aparecerá na cada pixel!

Isso também é válido para o buffer de vídeo, porque todos os desenhos são double tamponada em Mac OS X, atualizada 50 vezes por segundo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top