Não é possível detectar cor de um pixel em um pixel que muda de cor ...
-
18-09-2019 - |
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? :)
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:
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.