Programe algo parecido hace poco para el trabajo, aunque lo hice recursivamente.
Si no quieres hacerlo recursivo se me ocurre la siguiente manera:
colorViejo; // Color a remplazar
colorNuevo; // Color por el cual reemplazar
listaAPintar; // Lista que contendrá todos los pixeles a pintar
listaAComprobar;// Lista que contendrá pixeles en los que hay que mirar sus adyacentes
posicionClic; // Punto sobre el que se vierte el bote de pintura
// Agregamos el pixel sobre el que se ha hecho clic a la lista a comprobar
listaAComprobar.Add( pixels[Clic.x, clic.y] );
// Vamos comprobando todos los pixeles pendientes
while( listaAComprobar.Lenght > 0 )
{
// Todos los pixels pendientes son del color a reemplazar, por lo que lo sacamos
// de la lista y lo ponemos a pintar
pixelActual = listaAComprobar[0];
listaAComprobar.Drop( pixelActual );
listaAPintar.Add( pixelActual );
// Comprobamos sus adyacentes
if( pixels[ pixelActual.x - 1, pixelActual.y ] )
pixelsAComprobar.Add( pixels[ pixelActual.x - 1, pixelActual.y ] )
else if( pixels[ pixelActual.x + 1, pixelActual.y ] )
pixelsAComprobar.Add( pixels[ pixelActual.x + 1, pixelActual.y ] )
else if( pixels[ pixelActual.x, pixelActual.y - 1 ] )
pixelsAComprobar.Add( pixels[ pixelActual.x, pixelActual.y - 1 ] )
else if( pixels[ pixelActual.x, pixelActual.y + 1 ] )
pixelsAComprobar.Add( pixels[ pixelActual.x, pixelActual.y + 1 ] )
}
// Pintamos los pixels
foreach pixel in listaAPintar
pixel.color = colorNuevo
Faltaría el control de índices para no salirte de la imagen y demás, pero creo que funcionaría. De todos modos lo acabo de hacer al vuelo en una especie de pseudoC# (
) ahora mismo directamente en el notepad, por lo que puede que no funcione o tenga errores. Por descontado, seguramente tampoco sea la forma más óptima.
EDIT: Me acabo de daro cuenta de que el algoritmo no terminaría, ya que no se está mirando que los pixels ya comprobados no se vuelvan a comprobar. Se arreglaría con una lista de comprobados y al insertar un pixel en listaAComprobar mirar si ya existe en esta lista o en la de ya comprobados.