Estoy creando un contexto de mapa de bits usando CGBitmapContextCreate
con la opción kCGImageAlphaPremultipliedFirst
.¿Cómo obtener los valores reales de color RGB o ARGB sin alpha premultiplicado?
Hice una imagen de prueba de 5 x 5 con algunos colores importantes (rojo puro, verde, azul, blanco, negro), algunos colores mezclados (es decir, púrpura) combinados con algunas variaciones alfa. Cada vez que el componente alfa no es 255, el valor del color es incorrecto.
me di cuenta que podía volver a calcular el color cuando hago algo como:
almostCorrectRed = wrongRed * (255/alphaValue);
almostCorrectGreen = wrongGreen * (255/alphaValue);
almostCorrectBlue = wrongBlue * (255/alphaValue);
Pero el problema es que mis cálculos son a veces fuera por 3 o incluso más. Entonces, por ejemplo, obtengo un valor de 242 en lugar de 245 para verde, y estoy 100% seguro de que debe ser exactamente 245. Alpha es 128.
Luego, para el mismo color exacto con diferente opacidad alfa en el Mapa de bits PNG, obtengo alfa = 255 y verde = 245 como debería ser.
Si alfa es 0, entonces rojo, verde y azul también son 0. Aquí todos los datos se pierden y no puedo determinar el color del píxel.
¿Cómo puedo evitar o deshacer esta premultiplicación alfa conjuntamente para poder modificar los píxeles en mi imagen en función de los verdaderos valores de píxel R G B tal como estaban cuando la imagen se creó en Photoshop? ¿Cómo puedo recuperar los valores originales para R, G, B y A?
información de fondo (probablemente no es necesario para esta pregunta):
Lo que estoy haciendo es la siguiente: Tomo un UIImage, dibuje a un contexto de mapa de bits con el fin de realizar alguna manipulación de imágenes simples algoritmos en él, cambiando el color de cada píxel según el color que tenía antes. Nada realmente especial. Pero mi código necesita los colores reales. Cuando un píxel es transparente (lo que significa que tiene un valor alfa inferior a 255) mi algoritmo no debería preocuparse por esto, solo debería modificar R, G, B según sea necesario, mientras que Alpha permanece en lo que sea. A veces, aunque también cambiará el alfa hacia arriba o hacia abajo. Pero los veo como dos cosas separadas. Alpha contorsiona la transparencia, mientras que R G B controla el color.
Tuve cierto éxito al redondear el resultado al usar cualquier valor por encima de 0.5 en el siguiente entero más alto y cualquier valor por debajo en el entero más bajo. Tendrá que asegurarse de que todas las piezas de la ecuación estén en CGFloat. – jjxtra