J'ai créé un objet Nsimage et je voudrais idéalement déterminer le nombre de la couleur de chaque pixels qu'il contient. Est-ce possible? P>
6 Réponses :
Obtenez un Nsbitmapimagerepe code> à partir de votre nsimage code>. Ensuite, vous pouvez avoir accès aux pixels. NSImage* img = ...;
NSBitmapImageRep* raw_img = [NSBitmapImageRep imageRepWithData:[img TIFFRepresentation]];
NSColor* color = [raw_img colorAtX:0 y:0];
Ceci est une approche très coûteuse, comme coloratx: y: code> impliquera la création d'une instance nscolor code> pour chaque pixel, note Peter Hosey. Il est beaucoup plus efficace d'obtenir le tampon de données brutes et de traverser l'utilisation des pointeurs pour calculer l'histogramme.
Salut Gavinb, avez-vous des directions (obtenez le tampon de données brutes et traversez-la à l'aide de pointeurs) sur celui-ci? Merci!
@Clearlight Eh bien, je n'ai pas réalisé que je gardais quelqu'un en suspens. J'ai écrit une application d'exemple qui fait exactement ce qui est décrit ci-dessus et ajouté le code dans une réponse à cette question. Je l'ai aussi publié sur GitHub. Prendre plaisir!
@clearlighllight Voir ma nouvelle réponse ci-dessous Stackoverflow.com/a/43232455/172642 - cela implémente essentiellement ce que @Peter Hosey décrit dans sa réponse. Utilisation du NSCOLOR COLORATX: Y CODE> n'est définitivement pas comment cela devrait être fait.
Je suggère de créer votre propre contexte bitmap , emballage il dans un contexte graphique et définit cela Comme le contexte actuel, Dit l'image de se dessiner , puis d'accéder aux données de pixels derrière le contexte bitmap directement. P>
Ce sera plus de code, mais vous fera économiser un voyage à travers une représentation TIFF et la création de milliers ou de millions d'objets NSColor. Si vous travaillez avec des images de toute taille appréciable, ces dépenses s'ajoutent rapidement. P>
Pour les nouveaux lecteurs paresseux: cette solution est implémentée b> in @ gavinb's Réponse .
La documentation que vous avez liée est 404. Ce n'est plus une réponse exécutive.
Rechercher "Histogramme" dans la documentation de l'image principale. P>
Ce code rend le donné un contexte bitmap, nous pouvons accéder directement aux données d'image brute directement. et calculez les histogrammes pour chaque canal de couleur: p> J'ai publié un projet complet, une application d'échantillon de cacao, qui inclut ci-dessus. p> nsimage code> dans un cgbitmapcontext code>:
Utilisation J'ai réussi à obtenir la couleur correcte avec ce code simple: p> coloratx code> avec nsbitmapimagerepe code> ne conduit pas toujours à la couleur exacte correcte.
Ceci peut-être une approche plus rationalisée pour certains et réduire la complexité de l'abandon de la gestion de la mémoire.
https://github.com/koher/easyimagy p>
code échantillon
https://github.com/koher/easyimagycamerasample p>