读书人

图像处理高手的进来有个棘手的有关问

发布时间: 2012-02-04 15:43:09 作者: rapoo

图像处理高手的进来,有个棘手的问题
Smooth(long sx,long sy,int width,COLORREF Color)
{
int w=width * 2; //变量初始化
int bufsize = w * w;
COLORREF * buffer;       //创建buffer数组
buffer = new COLORREF[bufsize];
memset(buffer, 0, 4 * bufsize);
HDC m_maphDC;
HDC m_memhDC = CreateCompatibleDC(m_maphDC);


int x, y, i, j, r, g, b, w2=w/2;
x = sx - w2;
y = sy - w2;
for(i = 0; i < w; i++)
{
x= sx - w;
for(j = 0; j < w; j++)
{
buffer[i*w+j] = GetPixel(m_memhDC,x,y);  //从设备屏幕上获取每个点的颜色RGB.
x++;
}
y++;
}

x = sx - w2 + 1;
y = sy - w2 + 1;
for(i = 0; i < w-2; i++)
{
x = sx - w2 + 1;
for(j = 0; j < w-2; j++)
{

BYTE (r = (GetRValue(buffer[i*w+j])+GetRValue(buffer[i*w+j+1])+GetRValue(buffer[i*w+j+2])+GetRValue(buffer[(i+1)*w+j])+GetRValue(buffer[(i+1)*w+j+2])+GetRValue(buffer[(i+2)*w+j])+GetRValue(buffer[(i+2)*w+j+1])+GetRValue(buffer[(i+2)*w+j+2]))/8); //周围八个点的R分量平均值

BYTE (g = (GetGValue(buffer[i*w+j])+GetGValue(buffer[i*w+j+1])+GetGValue(buffer[i*w+j+2])+GetGValue(buffer[(i+1)*w+j])+GetGValue(buffer[(i+1)*w+j+2])+GetGValue(buffer[(i+2)*w+j])+GetGValue(buffer[(i+2)*w+j+1])+GetGValue(buffer[(i+2)*w+j+2]))/8);    //周围八个点的G分量平均值

BYTE (b = (GetBValue(buffer[i*w+j])+GetBValue(buffer[i*w+j+1])+GetBValue(buffer[i*w+j+2])+GetBValue(buffer[(i+1)*w+j])+GetBValue(buffer[(i+1)*w+j+2])+GetBValue(buffer[(i+2)*w+j])+GetBValue(buffer[(i+2)*w+j+1])+GetBValue(buffer[(i+2)*w+j+2]))/8);    //周围八个点的B分量平均值

DrawPixel(x, y, r, g, b); //把处理完的该点画到屏幕上,DrawPixel函数在下面
x++;
}
y++;
}
delete[] buffer;
DeleteDC(m_maphDC);
}

DrawPixel(long x, long y, BYTE r,BYTE g,BYTE b)
{
if (m_pBits != NULL && IsInside(x, y))
{
BYTE*p = m_pBits + x * m_cxPitch + y * m_cyPitch;
*p++ = b;
*p++ = g;
*p = r;
}
}

//////////////////////////////////
问题:画出来的点全都是白色的,这是怎么回事?




[解决办法]
HDC m_maphDC=GetDC(m_hWnd); //先要获取后才能创建memdc
HDC m_memhDC = CreateCompatibleDC(m_maphDC);
HBITMAP hMemBitmap=CreateCompatibleBitmap(m_maphDC, nWidth, nHeight); //需要创建内存兼容位置, 并选入memdc, 否则memdc中默认的只有一个单色单象素位图.
HBITMAP hOldBitmap;
hOldBitmap=(HBITMAP)SelectObject(m_memhDC, hMemBitmap);
BitBlt(m_memhDC, 0, 0, nWidth, nHeight, m_maphDC, 0, 0, SRCCOPY); //需将屏幕位图复制到memdc的内存位图中


ReleaseDC(m_maphDC);

...

SelectObject(m_memhDC, hOldBitmap);
DeleteObject(hMemBitmap);
DeleteDC(m_memhDC);


读书人网 >VC/MFC

热点推荐