Problème troublant avec CoreGraphics
psychoh13
Mothership DeveloperMembre
Bonjour à tous,
Voilà un problème qui a été exposé sur les forums de discussion d'Apple dans la section développement.
Voici son problème : dans une application de type Standard Tool (donc un truc de base), il cherchait à l'aide de CoreGraphics à dessiner un carré coloré sur son écran. L'ennuie c'est qu'alors que son carré devait être de couleur rouge, il se retrouve de couleur cyan...
J'ai moi-même fait le test et j'ai les mêmes résultats, voici mon code (simplification de son code) :
Le while(1); c'est pour avoir le temps de regarder l'écran, pour fermer l'application un cmd + option + esc suffit.
Alors, quelques petits tests me donnent les résultats suivant :
Quelqu'un saurait-il pourquoi CG se comporte comme ça ? Et quelqu'un aurait-il la solution ?
Merci
PS : Si on utilise la méthode CGContextSetCMYKFillColor() donc avec les composantes Cyan, Magenta, Jaune, Noir et Alpha, on retrouve le même problème, le Bleu est toujours à fond...
Voilà un problème qui a été exposé sur les forums de discussion d'Apple dans la section développement.
Voici son problème : dans une application de type Standard Tool (donc un truc de base), il cherchait à l'aide de CoreGraphics à dessiner un carré coloré sur son écran. L'ennuie c'est qu'alors que son carré devait être de couleur rouge, il se retrouve de couleur cyan...
J'ai moi-même fait le test et j'ai les mêmes résultats, voici mon code (simplification de son code) :
/* main.c */<br />#import <ApplicationServices/ApplicationServices.h><br /><br />int main (int argc, const char * argv[])<br />{<br /> CGContextRef ctx;<br /> CGDirectDisplayID display = CGMainDisplayID();<br /> CGDisplayCapture(display);<br /> ctx = CGDisplayGetDrawingContext(display);<br /><br /> CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);<br /> CGContextFillRect(ctx, CGRectMake(200, 200, 500, 500));<br /> <br /> while(1);<br /> <br /> return 0;<br />}
Le while(1); c'est pour avoir le temps de regarder l'écran, pour fermer l'application un cmd + option + esc suffit.
Alors, quelques petits tests me donnent les résultats suivant :
- La composante alpha se comporte tout à fait normalement
- Le Bleu est toujours à fond quoiqu'il arrive : [0, 0, 0, 1] devrait donner Noir, ça donne Bleu
- Le Rouge se comporte comme du Vert : [1, 0, 1, 1] (ou [1, 0, 0, 1] ici puisque le Bleu est toujours à fond) devrait donner Magenta mais donne Cyan
- Le Vert se comporte comme du Rouge : [1, 0, 1, 1] (ou [1, 0, 0, 1] ici puisque le Bleu est toujours à fond) devrait donner Cyan mais donne Magenta
- Donc au final pour obtenir du blanc il suffit de mettre ces valeurs : [1, 1, 0, 1] ou bien encore [1, 1, 1, 1]
Quelqu'un saurait-il pourquoi CG se comporte comme ça ? Et quelqu'un aurait-il la solution ?
Merci
PS : Si on utilise la méthode CGContextSetCMYKFillColor() donc avec les composantes Cyan, Magenta, Jaune, Noir et Alpha, on retrouve le même problème, le Bleu est toujours à fond...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
http://developer.apple.com/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html
(ils dessinent du texte et font les tests d'erreur, mais en gros, c'est la même chose)
Et effectivement, si on essaie d'avoir du rouge, on obtient du cyan.
À mon avis, c'est du au "ColorSpace" de l'écran qui doit être spécial, et c'est assez chaud de dessiner directement sur l'écran.
Quand je veux faire du fullscreen, je fais ce qu'ils conseillent sur la note de cette page : une fenêtre borderless qui couvre tout l'écran, tout en capturant tous les displays ; ça fonctionne très bien et pas de problème de colorSpaceÂ
Ou alors... OpenGL
http://fr.wikipedia.org/wiki/Pixel#Taille_m.C3.A9moire_d.27un_point
Il n'y a pas d'alpha au niveau de l'écran... Les 8 derniers bits de chaque point ne sont pas utilisés !
L'ordre, c'est :
bits 1-8 -> bleu
bits 9-16 -> vert
bits 17-24 -> rouge
bits 25-32 -> inutilisé
Donc là , je dessine un carré rouge directement dans le buffer de l'écran :
(et avec CGContextSetRGBFillColor on ne peut rien faire parce qu'il gère le alpha)
Si vous voulez simuler un KP bleu