문제

나는 하나와 같은 기본 도구를 개발하고 싶습니다 여기에 등장했습니다. 나는 여러 웹 페이지의 스크린 샷을 찍을 것이며 거기서부터 가장 인기있는 5 가지 색상을 취하고 다른 곳에서 색상이 잘 일치하는지 여부를 결정합니다.

이 도구를 C#에 쓰고 싶고 약간의 연구 후에 잠금 장치를 발견했습니다. 나의 첫 번째 아이디어는 이미지를 찍고 각 픽셀의 색상을 얻는 것이었지만, 이것이 내가 원하는 결과와 가장 인기있는 색상의 6 가지 목록을 만드는 방법을 줄지 확실하지 않습니다.

여기에있는 사람이 위의 프로그램과 비슷한 일을하는 프로그램을 만드는 방법에 대한 조언을 제공 할 수 있습니까? 이미지를 취하고 이미지에 사용 된 상위 5 가지 색상을 선택할 것입니까?

도움이 되었습니까?

해결책

음 .. a 썸네일 이미지 (16x16, 32x32 등)와 같은 색상을 선택하십시오.

업데이트 된 코드 :

    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; }

대체 텍스트 http://lh3.ggpht.com/_1tpop7dzy1e/s0uz6ggd4oi/aaaaaaac5k/3psp1cocely/s800/colors.png

다른 팁

당신이 말했듯이 가장 쉬운 방법은 다음과 같습니다.

  • 각 픽셀에서 읽고 컬렉션에 보관하십시오.

  • 사용 된 상위 5 가지 색상은 가장 많이 발생하는 값입니다.

그것이 내가 처음에 이런 식으로 시도했던 방식입니다.

이 작업을 더욱 발전시키기 위해 색상 범위를 취할 수 있으므로 사용합니다. RGB 값 (Red, Green, Blue) 색상의 특정 근사치에 색상을 할당하십시오.

예를 들어, 동일한 이미지가 사용되었다고 말하면 밝은 파란색 값이 함께 저장되고 장면에서 가장 일반적인 (평균) 연한 파란색을 제공하기 위해 평균을 복용 할 수 있습니다.

다른 픽셀에 대해 반복하십시오.

스케일링의 경우 - 예제 웹 사이트는 둔한/밝은 값을 사용합니다. 간단한 스케일 값을 사용할 수 있습니다. RGB에서 중간 빨간색을 고려하십시오.

0.7, 0.0, 0.0

값을 추가/곱하여 이것을 확장 할 수 있습니다. 그러나 0에서 1의 한계 내에서 값을 유지하십시오. 스케일링 값이 무엇인지에 대해서는 실험적입니다. 높을수록 색상이 더 칙칙/밝게됩니다.

이것 이미지 처리 방법에 대한 세부 사항을 살펴볼 수있는 히스토그램 (또는 다른 단어로 주파수 테이블)을 만드는 방법의 예입니다.

그러나 내 주요 권장 사항은 RGB를 사용하는 것이 아니라 (원하는 웹 사이트에 대부분 일반 색상이없는 한) HSB를 대신 사용하는 것입니다. "H"(HUE) 구성 요소는 얼마나 밝거나 어두운지에 관계없이 사용되는 색상을 더 잘 표시 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top