Tengo un programa que lee el valor en escala de grises (0 - 255) de un píxel y lo cambia a un color RGB (fórmula ver código).
Aquí está mi código:
Bitmap img = new Bitmap(@"somepath"); Bitmap new_img = new Bitmap(img.Width, img.Height); for (int i = 0; i < img.Width; i++) { for (int j = 0; j < img.Height; j++) { Color pixel = img.GetPixel(i, j); Color my = new Color(); int R_new = 0; if (pixel.R > 126) { R_new = (pixel.R -127) / 128 * 255; } int B_new = 0; if (pixel.B < 128) { B_new = (1 - pixel.R / 127) * 255; } int G_new = 0; if (pixel.G < 128) { G_new = pixel.R/127 * 255; } my = Color.FromArgb(R_new, G_new, B_new); new_img.SetPixel(i, j, my); } } new_img.Save(@"C:somepath"); En la siguiente imagen
puede ver que el valor verde del píxel anterior es 6 y el del nuevo píxel está configurado en 255, lo cual es incorrecto. De acuerdo con la fórmula, debe establecerse en 12.
Aquí está mi pregunta: ¿Por qué el valor del píxel está mal?
Tienes dos problemas.
#1: Está pasando el valor azul en lugar del valor verde. Compruebe el orden esperado de los argumentos :
Color.FromArgb(int red, int green , int blue) #2: B_new es 255 debido a cómo se maneja la división de enteros :
Para los operandos de tipo entero, el resultado del operador
/es de tipo entero y es igual al cociente de los dos operandos redondeado a cero:
(1 - 6 / 127) * 255 // becomes 255 Entonces, 6 / 127 es igual a 0.047244094488189 pero se redondea a cero... haciendo su fórmula:
(1 - 0) * 255 // becomes 255Haga que al menos uno de sus términos de división sea de tipo punto flotante y obtendrá un valor decimal:
(1 - pixel.R / 127.0 ) * 255 // becomes 242.9527559055118 ... que luego tendrá que convertir a un int para ajustarse a la firma del método de Color.FromArgb(int, int, int) .