19,471
社区成员




// "bmp"
void CBmpColorsDlg::OnButton1()
{
CWaitCursor wait;
CRect rect;
//
GetClientRect(&rect);
CDC *pDc = GetDC();
CDC dcMem;
dcMem.CreateCompatibleDC(pDc);
dcMem.SelectObject(&m_img);//
pDc->BitBlt(0,0,m_bmWidth,m_bmHeight,&dcMem,0,0,SRCCOPY);
//get all colors
std::vector<COLORREF> colorIndex;
for (int y = 0; y < m_bmHeight; y++)
{
for (int x = 0; x < m_bmWidth; x++)
{
COLORREF rgb = dcMem.GetPixel(x, y);
colorIndex.push_back(rgb);
}
}
//统计各种颜色数量
int Total = colorIndex.size();// m_bmHeight * m_bmWidth=253,760;
// afxDump << Total << " Total\n";
std::vector<ListData> list;
ListData temp(colorIndex[0], 0);// start from 0
list.push_back(temp);//[0]=0xFEFEFE;len=4069
// 颜色数据分析统计
int N = 1;
for (int i = 0; i < Total; i++) // if i=1;len=4068 wrong !
{// 取出每个 colorIndex[i],看是不是与 N 个 list[j].color 的一个相等
for (int j = 0; j < N; j++)
{
if (colorIndex[i] == list[j].color) // when i=0, ==
{
list[j].num++;
break;// next i
}
if (j == N - 1)
{// 如果 不相等 ,而且是 colorIndex 最后一个,则这个 colorIndex 加入到 list中
ListData temp(colorIndex[i], 1);// start from 1
list.push_back(temp);
N++ ; // 下次 for i < Total 时,多一个 list[j].color
break;// must ! otherwise ; Size != Total
}
}
}
//
CString num;
int numMax=0;
CString color;
int Size=0;
int colors=list.size();
m_ListBox.ResetContent();
for(int jj=0;jj<colors;jj++)
{
color.Format("0x%06X ",list[jj].color);
Size += list[jj].num;
if(numMax < list[jj].num ) numMax=list[jj].num;
num.Format("%d",list[jj].num);
m_ListBox.AddString(color+num);
}
color.Format("%d %d",colors-1,Size);
m_ListBox.AddString(color);
// 66843 - 66612=231
if(Size != Total ) AfxMessageBox ("Lost something ?");
TRACE1("%d",numMax);// 6215
// draw Histogram x color, y num
// double kY=200.0/numMax;
// x
//#define top 500
//#define lft 20
// pDc->MoveTo(lft,top);
// pDc->LineTo(lft+300,top);
// for(int kk=0; kk < colors ;kk++)
// {
// pDc->MoveTo(lft+kk,top);
// pDc->LineTo(lft+kk,top-(int)(list[kk].num*kY));
// }
ReleaseDC(pDc);
}