He creado un objeto NSImage, e idealmente me gustaría determinar cuántos de cada píxeles de color contiene. es posible?Obtener píxeles y colores de NSImage
Respuesta
que sugieren la creación de su propia bitmap context, envolviéndolo en una graphics context y establecer que a medida que el contexto actual, telling the image to draw itself, y luego acceder a los datos de píxeles detrás del marco de mapa de bits directamente.
Esto será más código, pero le ahorrará un viaje a través de una representación TIFF y la creación de miles o millones de objetos NSColor. Si está trabajando con imágenes de cualquier tamaño apreciable, estos gastos se acumularán rápidamente.
Obtenga NSBitmapImageRep
de su NSImage
. Luego puede obtener acceso a los píxeles.
NSImage* img = ...;
NSBitmapImageRep* raw_img = [NSBitmapImageRep imageRepWithData:[img TIFFRepresentation]];
NSColor* color = [raw_img colorAtX:0 y:0];
Busque "histograma" en la documentación de Core Image.
Este código hace que la NSImage
en 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);
}
Dado un contexto de mapa de bits, se puede acceder a los datos de imágenes en bruto directamente, y calcular los histogramas para cada canal de color:
- (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
Publiqué un proyecto completo, una aplicación de muestra Cocoa, que incluye lo anterior.
Usando colorAtX
con NSBitmapImageRep
no siempre conduce al color correcto.
me las arreglé para obtener el color correcto con este simple código:
[yourImage lockFocus]; // yourImage is just your NSImage variable
NSColor *pixelColor = NSReadPixel(NSMakePoint(1, 1)); // Or another point
[yourImage unlockFocus];
- 1. CVPixelBufferRef a NSImage
- 2. ¿Cómo dibujar un polígono en colores de píxeles específicos solamente?
- 3. Obtener los límites de un NSImage dentro de un NSImageView
- 4. Obteniendo NSImage de CGImageRef
- 5. Java: Fuentes y Píxeles
- 6. NSImage a cv :: Mat y viceversa
- 7. NSImage y la retina confusión pantalla
- 8. obtener píxeles del mapa de bits
- 9. NSURL → → NSImage NSImageView
- 10. NSImage a Base64
- 11. NSImage no escala
- 12. Cuál es la relación entre píxeles y píxeles escalados
- 13. Flip NSImage en ambos ejes
- 14. android rápido acceso y manipulación de píxeles
- 15. NSImage vs. CIImage vs. CGImage?
- 16. Cómo obtener los colores del sistema Android
- 17. Cómo obtener los colores predeterminados en Android
- 18. Obtener la lista de valores de píxeles de PIL
- 19. ¿Cuál es la diferencia entre el NSImage y el UIImage?
- 20. ¿Por qué los colores de los píxeles no son correctos en OpenGL ES 2.0 en Android?
- 21. Obtener 256 colores en Emacs * shell *
- 22. píxeles en Direct2D
- 23. Obteniendo un NSImage de un NSProgressIndicator
- 24. Obtener el color de píxeles de Base64 PNG utilizando javascript?
- 25. Texto principal - Obtener coordenadas de píxeles de NSRange
- 26. Formatos de píxeles, CVPixelBufferRefs y glReadPixels
- 27. ¿Cómo obtener el ancho de una cadena en píxeles?
- 28. ¿Cómo obtener información de píxeles dentro de un sombreador de fragmentos?
- 29. Cómo leer imágenes PNG en NSImage
- 30. Convirtiendo un NSImage * en un CGImageRef?
Este es un enfoque muy caro, ya que 'colorAtX: y:' implicará la creación de una instancia de 'NSColor' para cada píxel, como Peter Notas de Hosey. Es mucho más eficiente obtener el buffer de datos en bruto y caminar usando punteros para calcular el histograma. – gavinb
Hola gavinb, ¿tienes alguna dirección (obtén el búfer de datos brutos y recorres el uso de punteros) en este caso? ¡Gracias! – RickON
@clearlight Bueno, no me di cuenta de que mantenía a nadie en suspenso. Escribí una aplicación de muestra que hace exactamente lo que se describe arriba, y agregué el código en una respuesta a esta pregunta. Lo publiqué en github también. ¡Disfrutar! – gavinb