J'ai créé un objet NSImage et, idéalement, je voudrais déterminer le nombre de pixels de chaque couleur qu'il contient. Est-ce possible?Obtenir des pixels et des couleurs de NSImage
Répondre
Je propose de créer votre propre bitmap context, l'enveloppant dans un graphics context et du paramètre que le contexte actuel, telling the image to draw itself, puis accéder aux données de pixels derrière le contexte bitmap directement.
Ce sera plus de code, mais vous permettra d'économiser à la fois 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 taille appréciable, ces dépenses s'additionneront rapidement.
Obtenez un NSBitmapImageRep
à partir de votre NSImage
. 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];
Recherchez "histogramme" dans la documentation Core Image.
Ce code rend le NSImage
dans un CGBitmapContext
:
- (void)updateImageData {
if (!_image)
return;
// Dimensions - source image determines context size
NSSize imageSize = _image.size;
NSRect imageRect = NSMakeRect(0, 0, imageSize.width, imageSize.height);
// Create a context to hold the image data
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGContextRef ctx = CGBitmapContextCreate(NULL,
imageSize.width,
imageSize.height,
8,
0,
colorSpace,
kCGImageAlphaPremultipliedLast);
// Wrap graphics context
NSGraphicsContext* gctx = [NSGraphicsContext graphicsContextWithCGContext:ctx flipped:NO];
// Make our bitmap context current and render the NSImage into it
[NSGraphicsContext setCurrentContext:gctx];
[_image drawInRect:imageRect];
// Calculate the histogram
[self computeHistogramFromBitmap:ctx];
// Clean up
[NSGraphicsContext setCurrentContext:nil];
CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
}
Compte tenu d'un contexte bitmap, nous pouvons accéder aux données d'images brutes directement, et calculer les histogrammes pour chaque canal de couleur:
- (void)computeHistogramFromBitmap:(CGContextRef)bitmap {
// NB: Assumes RGBA 8bpp
size_t width = CGBitmapContextGetWidth(bitmap);
size_t height = CGBitmapContextGetHeight(bitmap);
uint32_t* pixel = (uint32_t*)CGBitmapContextGetData(bitmap);
for (unsigned y = 0; y < height; y++)
{
for (unsigned x = 0; x < width; x++)
{
uint32_t rgba = *pixel;
// Extract colour components
uint8_t red = (rgba & 0x000000ff) >> 0;
uint8_t green = (rgba & 0x0000ff00) >> 8;
uint8_t blue = (rgba & 0x00ff0000) >> 16;
// Accumulate each colour
_histogram[kRedChannel][red]++;
_histogram[kGreenChannel][green]++;
_histogram[kBlueChannel][blue]++;
// Next pixel!
pixel++;
}
}
}
@end
J'ai publié un projet complet, un exemple d'application Cocoa, qui inclut ce qui précède.
En utilisant colorAtX
avec NSBitmapImageRep
ne conduit pas toujours à la bonne couleur exacte.
j'ai réussi à obtenir la couleur correcte avec ce code simple:
[yourImage lockFocus]; // yourImage is just your NSImage variable
NSColor *pixelColor = NSReadPixel(NSMakePoint(1, 1)); // Or another point
[yourImage unlockFocus];
- 1. Dessiner des carreaux NSImage
- 2. C++, comment charger des images et compter les pixels de certaines couleurs
- 3. Comportement des pixels de FillRectangle et DrawRectangle
- 4. NSImage initWithContentsOfFile: Affichage des progrès
- 5. Lecture et modification des pixels d'une image sur l'iPhone
- 6. trouver "distance" entre les couleurs de deux pixels
- 7. Calcul des pixels correspondants
- 8. UIImage Rotation des pixels
- 9. Algorithmes de traitement des pixels
- 10. Générer des couleurs uniques
- 11. Mise en page CSS avec des pixels et des pourcentages
- 12. mouseListeners et JLabels utilisant des images avec des pixels transparents
- 13. emacs C++ indentation et coloration des couleurs
- 14. Compatibilité des couleurs SSRS et Excel
- 15. Transition des couleurs UINavigationBar?
- 16. Basculement des couleurs de ligne
- 17. obtenir un bon échantillon de pixels à partir d'une image
- 18. Affichage des couleurs unies
- 19. L'étrangeté des couleurs opéra
- 20. Taille des pixels od NSBitmapImageRep
- 21. Configuration des couleurs d'Eclipse
- 22. Trouver la couleur des pixels
- 23. Comment puis-je obtenir et définir des données de pixels dans XNA?
- 24. make emacs dans un terminal utilise des couleurs sombres et des couleurs de verrouillage de police pas claires
- 25. Liste des articles avec des couleurs alternées
- 26. Résolution des pixels de l'écran en mm
- 27. Comment effectuer des transformations de couleurs avec des profils ICC sur un ensemble de valeurs de pixels arbitraires (et non sur une structure de données d'image)?
- 28. java tamponnées Image: Détection des pixels noirs
- 29. Personnalisation des couleurs ListView ContextMenu
- 30. Personnalisation des couleurs ListView Android?
Ceci est une approche très coûteuse, comme 'colorAtX: y:' impliquera la création d'une instance 'NSColor' pour chaque pixel, comme Peter Notes de Hosey. Il est beaucoup plus efficace d'obtenir le tampon de données brutes et de passer à travers des pointeurs pour calculer l'histogramme. – gavinb
Salut gavinb, avez-vous des instructions (obtenir le tampon de données brutes et marcher à travers des pointeurs) sur celui-ci? Je vous remercie! – RickON
@clearlight Eh bien, je n'avais pas réalisé que je gardais quelqu'un en suspens. J'ai écrit un exemple d'application 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! – gavinb