문제
나는 하나와 같은 기본 도구를 개발하고 싶습니다 여기에 등장했습니다. 나는 여러 웹 페이지의 스크린 샷을 찍을 것이며 거기서부터 가장 인기있는 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) 구성 요소는 얼마나 밝거나 어두운지에 관계없이 사용되는 색상을 더 잘 표시 할 수 있습니다.