10
votes

Obtenir des pixels et des couleurs de Nsimage

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?


0 commentaires

6 Réponses :


7
votes

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];


4 commentaires

Ceci est une approche très coûteuse, comme coloratx: y: impliquera la création d'une instance nscolor 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 n'est définitivement pas comment cela devrait être fait.



9
votes

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.

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.


2 commentaires

Pour les nouveaux lecteurs paresseux: cette solution est implémentée in @ gavinb's Réponse .


La documentation que vous avez liée est 404. Ce n'est plus une réponse exécutive.



2
votes

Rechercher "Histogramme" dans la documentation de l'image principale.


0 commentaires

11
votes

Ce code rend le nsimage dans un cgbitmapcontext : xxx

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: xxx

J'ai publié un projet complet, une application d'échantillon de cacao, qui inclut ci-dessus.


0 commentaires

1
votes

Utilisation coloratx avec nsbitmapimagerepe ne conduit pas toujours à la couleur exacte correcte.

J'ai réussi à obtenir la couleur correcte avec ce code simple: xxx


0 commentaires

1
votes

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

code échantillon https://github.com/koher/easyimagycamerasample xxx


0 commentaires