#define U8_GRAY_LEVEL 256
INT32 CImageWindowDlg::ShowArrHist(UINT8 *pImgData, int nImgW, int nImgH, int nIdHist)
{
int pnHist[U8_GRAY_LEVEL] = { 0 };
getEqualHist(pImgData, nImgW*nImgH, pnHist);
int pArrTemp[U8_GRAY_LEVEL] = { 0 };
memcpy(pArrTemp, pnHist, U8_GRAY_LEVEL * sizeof(int));
int nTemp = 0;
for (int i = 0; i < U8_GRAY_LEVEL; ++i)
{
for (int j = U8_GRAY_LEVEL - 1; j > i; --j)
{
if (pArrTemp[j] > pArrTemp[j - 1])
{
nTemp = pArrTemp[j];
pArrTemp[j] = pArrTemp[j - 1];
pArrTemp[j - 1] = nTemp;
}
}
}
int nRef = 1;
if (pArrTemp[2] != 0)
{
nRef = pArrTemp[2];
}
else if (pArrTemp[1] != 0)
{
nRef = pArrTemp[1];
}
else if (pArrTemp[0] != 0)
{
nRef = pArrTemp[0];
}
else
{
return FALSE;
}
CPen *pPen = new CPen();
pPen->CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
CPen *pPen2 = new CPen();
pPen2->CreatePen(PS_SOLID, 1, RGB(60, 60, 255));
CRect rectHist, rect;
CString str_Temp;
GetDlgItem(nIdHist)->GetWindowRect(rectHist);
ScreenToClient(&rectHist);
int nLeftMargin = 2;
int nRightMargin = nLeftMargin;
int nTopMargin = 5;
int nButtomMargin = 20;
GetDlgItem(nIdHist)->MoveWindow(rectHist.left, rectHist.top, rectHist.Width(), rectHist.Height(), TRUE);
CWnd *pWnd = GetDlgItem(nIdHist);
pWnd->GetClientRect(&rect);
CDC *pDCHist = pWnd->GetDC();
CGdiObject *pPenOld = pDCHist->SelectObject(pPen);
int i = 0;
int nW = rectHist.Width();
int nH = rectHist.Height();
int nYmaxPx = nLeftMargin;
int nYmaxPy = nTopMargin;
int nXmaxPx = rectHist.Width() - nRightMargin;
int nXmaxPy = rectHist.Height() - nButtomMargin;
int pnXPx[10] = { 0 };
int pnXPx10[30] = { 0 };
int pnYPx[10] = { 0 };
int nSacle = 256 / 50 + 1;
int nSacle10 = 256 / 10 + 1;
int nSacleY = 4;
for (i = 0; i < nSacle; ++i)
{
pnXPx[i] = nLeftMargin + (rectHist.Width() - nRightMargin - nLeftMargin) * i * 50 / 255;
}
pnXPx[i] = rectHist.Width() - nRightMargin;
for (i = 0; i < nSacle10; ++i)
{
pnXPx10[i] = nLeftMargin + (rectHist.Width() - nRightMargin - nLeftMargin) * i * 10 / 255;
}
pnXPx10[i] = rectHist.Width() - nRightMargin;
for (i = 0; i <= nSacleY; ++i)
{
pnYPx[i] = nTopMargin + (rectHist.Height() - nButtomMargin - nTopMargin) * i / nSacleY;
}
pDCHist->Rectangle(0, 0, rectHist.Width() + 1, rectHist.Height());
pDCHist->MoveTo(nLeftMargin, rectHist.Height() - nButtomMargin);
pDCHist->LineTo(rectHist.Width() - nRightMargin, rectHist.Height() - nButtomMargin);
for (i = 1; i < nSacle - 1; i++)
{
str_Temp.Format(_T("%d"), i * 50);
pDCHist->TextOut(pnXPx[i] - 12, nXmaxPy + 2, str_Temp);
}
pDCHist->TextOut(pnXPx[0] + 1, nXmaxPy + 2, _T("0"));
pDCHist->TextOut(pnXPx[i] - 20, nXmaxPy + 2, _T("250"));
for (i = 1; i <= nSacle; i++)
{
pDCHist->MoveTo(pnXPx[i], nXmaxPy + 3);
pDCHist->LineTo(pnXPx[i], nXmaxPy - 3);
}
for (i = 1; i <= nSacle10; i++)
{
pDCHist->MoveTo(pnXPx10[i], nXmaxPy + 1);
pDCHist->LineTo(pnXPx10[i], nXmaxPy - 2);
}
pDCHist->MoveTo(nLeftMargin, nTopMargin);
pDCHist->LineTo(nLeftMargin, rectHist.Height() - nButtomMargin);
for (i = 0; i < nSacleY; i++)
{
pDCHist->MoveTo(nYmaxPx, pnYPx[i]);
pDCHist->LineTo(nYmaxPx + 3, pnYPx[i]);
}
str_Temp.Format(_T("%d"), nRef);
pDCHist->TextOut(pnYPx[0] + 1, nTopMargin - 4, str_Temp);
pDCHist->SelectObject(pPen2);
for (i = 0; i < U8_GRAY_LEVEL; i++)
{
int nPx = nLeftMargin + (rectHist.Width() - nRightMargin - nLeftMargin) * (i) / 255;
int nPy1 = rectHist.Height() - nButtomMargin;
int nPy2 = nPy1 - (nPy1 - nTopMargin) * pnHist[i] / nRef;
nPy2 = nPy2 > nTopMargin ? nPy2 : nTopMargin;
pDCHist->MoveTo(nPx, nPy1);
pDCHist->LineTo(nPx, nPy2);
}
pDCHist->SelectObject(pPenOld);
delete pPen;
delete pPen2;
ReleaseDC(pDCHist);
return TRUE;
}