Mac OS Cacao: Dessiner un simple pixel sur une toile
J'aurais aimé trouver une réponse à cela. J'ai cherché et cherché et je ne pouvais pas la bonne réponse. Voici ma situation:
Dans un Mac OS Application Cocoa, je veux dessiner un pixel (en fait un peu de pixels) sur un espace dédié sur ma fenêtre de l'application. J'ai compris, il serait plus agréable d'avoir une NSImageView
placé là (je l'ai fait avec de l'IB et connecté à la prise à mon délégué d'application) et de dessiner, au lieu de mon NSWindow
.
Comment dans le monde pouvez-je le faire? Mac OS semble offrir NSBezierPath
comme la plupart de base de l'outil de dessin — est-ce vrai? C'est complètement choquant pour moi. Je viens d'une longue histoire de la programmation sous Windows et le dessin d'un pixel sur une toile est le plus simple, en général.
Je ne veux pas utiliser OpenGL et je ne suis pas sûr à quel point le Quartz est impliqué dans cette.
Tout ce que je veux est un peu d'aide sur comment je peux tirer de cette pseudo-code dans la vraie Objective-C/Cocoa:
imageObj.drawPixel(10,10,blackColor);
J'aimerais entendre vos réponses, et je suis sûr que cela va aider beaucoup de gens à commencer avec le Cacao.
Merci!
OriginalL'auteur Roman | 2010-12-04
Vous devez vous connecter pour publier un commentaire.
NSBezierPath est le seul outil disponible dans le Cacao pour le dessin, la plupart des formes primitives, et pour beaucoup de formes complexes.
Description de détail vous pouvez trouver ici:
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/Paths/Paths.html%23//apple_ref/doc/uid/TP40003290-CH206-BBCHFJJG
http://en.wikibooks.org/wiki/Programming_Mac_OS_X_with_Cocoa_for_Beginners/Graphics_-_Drawing_with_Quartz
OriginalL'auteur Sergio
Ce que vous demandez est l'une de ces deux méthodes:
NSBitmapRep setColor:atX:y: Modifications de la couleur du pixel aux coordonnées spécifiées.
NSBitmapRep setPixel:atX:y: Le récepteur du pixel aux coordonnées spécifiées à l'premières valeurs de pixel.
Noter que ce ne sont pas disponible sur iOS. Sur iOS, il semble que la façon de le faire est de créer une crue de la mémoire tampon de données de pixels pour une palette (probablement RVB), de la remplir avec les données de couleur (écrire un peu de méthode setPixel pour ce faire) et ensuite appeler CGImageCreate() comme ceci:
Enfin, vous pourriez être désireux de manipuler des pixels dans une image que vous avez déjà chargé dans un CGImage. Il y a des exemples de code pour le faire que dans une Pomme Technique Q&Un intitulé QA1509 Obtenir les données de pixel d'un objet CGImage.
OriginalL'auteur Logachu
De cacao du faible niveau de l'API de dessin est Graphiques de Base (Quartz). Vous obtenez un contexte de dessin et d'émettre des commandes pour dessiner sur ce contexte. L'API est conçue pour être indépendante de l'appareil (vous utilisez les mêmes commandes pour dessiner sur l'écran comme vous le feriez pour dessiner sur du papier, lors de l'impression). Par conséquent, il n'y a pas de commandes pour remplir les pixels individuels, car il n'y a pas une telle chose comme un pixel sur le papier. Même sur l'écran, votre point de vue peut avoir été transformé d'une manière de sorte qu'un seul point de ne pas correspondre à un seul appareil pixel.
Si vous voulez dessiner un pixel unique, vous devez spécifier un rectangle de la taille d'un pixel, puis le remplir. Pour le pixel (x,y), vous souhaitez un rectangle à l'origine de (x-0.5,y-0.5) et une taille de (1,1).
Vous pouvez le faire avec NSBezierPath, ou vous pouvez obtenir un Noyau contexte Graphique (CGContextRef) à partir de
[[NSGraphicsContext currentContext] graphicsPort]
et utiliser des fonctions commeCGContextFillRect()
.De toute évidence, cela ne sera pas très rapide si vous dessinez beaucoup de pixels, ce n'est pas ce que l'API est conçue pour. Si c'est ce que vous devez faire, envisager la création d'un tampon avec
malloc
et l'écriture de vos données de pixels pour que, ensuite, à l'aide de Graphiques de Base pour le convertir en un CGImageRef, qui peut être dessiné à l'écran.OriginalL'auteur benzado
Pour dessiner des pixels comme vous le décrivez, il n'y a pas besoin de créer un chemin d'accès ou de recourir à la Quartz 2D ou OpenGL API.
Voir
NSRectFill()
et les fonctions connexes commeNSRectFillList()
etNSRectFillUsingOperation()
.Si vous êtes le dessin a beaucoup de pixels individuels,
NSRectFillList()
est à peu près aussi vite que vous pouvez le faire sans avoir recours à rouler votre propre image de tampons.OriginalL'auteur NSResponder
Je suis peut-être pas compris la question, mais le Quartz a la capacité à remplir les rectangles:
OriginalL'auteur Pete Rossi
Voici un moyen rapide pour dessiner des pixels sur OS X:
OriginalL'auteur Mike Hays
J'ai trouvé votre question ici un peu de retard, car j'ai le même problème. Peut-être les Pommes de documentation développeur peut vous aider ici. Je ne l'ai pas testé moi-même, mais jetez un oeil à ce document:
http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CocoaDrawingGuide/Images/Images.html
À peu près au centre du document, vous trouverez la section "Création d'un Bitmap". Il vous indique différentes façons de créer des données de pixel.
OriginalL'auteur draetsch
OriginalL'auteur johndpope