es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Convirtiendo espacios de color en Objective-C

¿Cómo puedo convertir del espacio de color del dispositivo al espacio RGB calibrado? Por favor, intente hacer cambios en el siguiente código:

    NSColor *MyColorAtScreenCoordinate(CGDirectDisplayID displayID, NSInteger x, NSInteger y) {
        CGImageRef image = CGDisplayCreateImageForRect(displayID, CGRectMake(x, y, 1, 1));
        NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:image];
        CGImageRelease(image);
        NSColor *color = [bitmap colorAtX:0 y:0];
        [bitmap release];
        return color;
    }

Obtuve el código de esta publicación: aquí.
Encontré una respuesta para Swift aquí, soy bastante nuevo en Swift y ni siquiera la documentación me ha ayudado.

Actualización

Logré llegar con el siguiente código:

// 'color' es el color de la función
// 'bitmapRep' apunta a un NSBitmapImageRep

CGFloat* components = malloc(color.numberOfComponents * sizeof(CGFloat));
[color getComponents:components];
NSColor* correctedcolor = [NSColor colorWithColorSpace:[self.bitmapRep colorspace]
                              components:components count:colorbmp.numberOfComponents];

free(components);
[correctedcolor colorUsingColorSpace:[NSColorSpace sRGBColorSpace]];
return correctedcolor;

Incluso al intentar este fragmento de código, no obtenía el color de píxel correcto. Intenté usar un selector de color de Appstore, que mostraba un valor diferente al que se leía en mi aplicación.

Ejemplo al seleccionar un color rojo puro:

Selector de color comercial: 0xFF0000
Mi selector de color: 0xFF0404

¿Cómo puedo obtener el valor calibrado correcto del píxel seleccionado?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para convertir del espacio de color del dispositivo al espacio RGB calibrado, puedes modificar el código existente de la siguiente manera:

    NSColor *MyColorAtScreenCoordinate(CGDirectDisplayID displayID, NSInteger x, NSInteger y) {
        CGImageRef image = CGDisplayCreateImageForRect(displayID, CGRectMake(x, y, 1, 1));
        NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:image];
        CGImageRelease(image);
    
        // Convertir espacio de color del bitmap a RGB del dispositivo
        NSColorSpace *deviceRGB = [NSColorSpace deviceRGBColorSpace];
        NSBitmapImageRep *deviceBitmap = [bitmap bitmapImageRepByConvertingToColorSpace:deviceRGB renderingIntent:NSColorRenderingIntentDefault];
    
        // Obtener el color en (0,0) en RGB del dispositivo
        NSColor *color = [deviceBitmap colorAtX:0 y:0];
    
        // Convertir al espacio de color RGB calibrado
        NSColorSpace *calibratedRGB = [NSColorSpace sRGBColorSpace];
        color = [color colorUsingColorSpace:calibratedRGB];
    
        [bitmap release];
        return color;
    }
    

    Este código convierte el espacio de color de la representación de imagen del bitmap desde el espacio de color predeterminado (probablemente dependiente del dispositivo) al espacio de color RGB del dispositivo estándar. Luego, recupera el color en el píxel deseado y lo convierte al espacio de color RGB calibrado utilizando el método colorUsingColorSpace:.

    Sin embargo, el color calculado puede no coincidir con el color esperado debido a variaciones en la gestión del color entre diferentes aplicaciones y sistemas operativos. La discrepancia entre el selector de color comercial y el código personalizado podría ser debido a diferencias en la configuración de gestión del color o a los propios algoritmos del selector de color para obtener los valores de color. Puede ser necesaria más pruebas y calibración para obtener valores de color precisos.

Comments are closed.