首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-02-04 
图像处理高手的进来,有个棘手的问题Smooth(longsx,longsy,intwidth,COLORREFColor){intwwidth*2//变量初

图像处理高手的进来,有个棘手的问题
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);


热点排行