Pregunta

Quiero desarrollar una herramienta básica como la que ofrecido aquí . Voy a tomar capturas de pantalla de una serie de páginas web y desde allí Deseo aprovechar las cinco mejores colores más populares y de allí de alguna manera decidir si los colores son un buen partido.

Quiero escribir esta herramienta en C # y después de un poco de investigación descubrí LockBits. Mi primera idea era tomar una imagen y luego obtener el color de cada píxel, pero estoy seguro de si esto me dará los resultados que deseo y cómo hacer seis listas de los colores más populares.

Puede alguien aquí proporcionar asesoramiento en cuanto a cómo iba a crear un programa para hacer algo similar al programa anterior, que se llevará en una imagen y seleccionará las cinco mejores colores utilizados en la imagen?

¿Fue útil?

Solución

Bueno .. Utilice un miniatura de la imagen (16x16, 32x32, etc.) y seleccione de que los colores como

código de actualización:

    private void button1_Click(object sender, EventArgs e)
    {
        int thumbSize = 32;
        Dictionary<Color, int> colors = new Dictionary<Color, int>();

        Bitmap thumbBmp = 
            new Bitmap(pictureBox1.BackgroundImage.GetThumbnailImage(
                thumbSize, thumbSize, ThumbnailCallback, IntPtr.Zero));

        //just for test
        pictureBox2.Image = thumbBmp;            

        for (int i = 0; i < thumbSize; i++)
        {
            for (int j = 0; j < thumbSize; j++)
            {
                Color col = thumbBmp.GetPixel(i, j);
                if (colors.ContainsKey(col))
                    colors[col]++;
                else
                    colors.Add(col, 1);
            }                
        }

        List<KeyValuePair<Color, int>> keyValueList = 
            new List<KeyValuePair<Color, int>>(colors);

        keyValueList.Sort(
            delegate(KeyValuePair<Color, int> firstPair,
            KeyValuePair<Color, int> nextPair)
            {
                return nextPair.Value.CompareTo(firstPair.Value);
            });

        string top10Colors = "";
        for (int i = 0; i < 10; i++)
        {
            top10Colors += string.Format("\n {0}. {1} > {2}",
                i, keyValueList[i].Key.ToString(), keyValueList[i].Value);
            flowLayoutPanel1.Controls[i].BackColor = keyValueList[i].Key;
        }
        MessageBox.Show("Top 10 Colors: " + top10Colors);
    }

    public bool ThumbnailCallback() { return false; }

alt text http://lh3.ggpht.com/_1TPOP7DzY1E/S0uZ6GGD4oI/AAAAAAAAC5k /3Psp1cOCELY/s800/colors.png

Otros consejos

La forma más fácil, como usted ha dicho es:

  • Leer en cada píxel y almacenarlos en una colección.

  • Las cinco principales colores utilizados sería los valores que más se producen.

Así es como hace que tendría en tratar primero algo como esto.

Para avanzar en esta labor, se puede tomar en gamas de color, por lo que el uso de valores RGB ( Red, Green, Blue) asignar un color a una cierta aproximación de color.

Por ejemplo, dicen que se utilizó misma imagen, los valores de color azul claro conseguirían almacenados juntos, entonces un promedio podría ser tomado de éstos para dar la (todavía promedio) de color azul claro más común en la escena.

Repetir para los otros píxeles.

En cuanto a la escala - el sitio web de ejemplo utiliza los valores apagados / brillantes. Un valor de escala simple podría ser utilizado. Considere un rojo medio en el RGB:

0.7, 0.0, 0.0

Se puede escalar esto añadiendo / multiplicando un valor. Mantener los valores dentro del límite de 0 a 1, sin embargo. En cuanto a cuál debe ser el valor de escala, experimant. Cuanto más alto es el más opaco / brillante sea el color se convertirá.

Este es un ejemplo de cómo crear un histograma (o una tabla de frecuencias en otras palabras) donde se puede echar un vistazo a los detalles sobre cómo ir sobre el procesamiento de la imagen.

Pero mi principal recomendación es no utilizar RGB (a menos que el sitio web que está mirando tiene sobre todo colores lisos), pero el uso de HSB en su lugar. El componente de "H" (matiz) le dará una mejor indicación de los colores utilizados no importa lo brillante u oscuro que son.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top