/******************* 
void CImgProcess::HorMirror(CImgProcess* pTo)
 功能: 图像的水平镜象
 注: 图像左右镜象
 参数: CImgProcess* pTo:处理后得到的图像的 CImgProcess 指针  
 返回值: 无 
*******************/
void CImgProcess::HorMirror(CImgProcess* pTo)
{
int nHeight = pTo->GetHeight();
int nWidth = pTo->GetWidthPixel(); int i, j;
    int u;
for(i=0;i<nWidth;i++)
{
u=nWidth-i-1;
for(j=0;j<nHeight;j++)
{
            
pTo->SetPixel(i,j,GetPixel(u,j));
}//for j
}//for i
}
/**************************************************
inline COLORREF CImg::GetPixel(int x, int y)功能:
返回指定坐标位置像素的颜色值参数:
int x, int y
指定像素位置的坐标
返回值:
COLERREF类型,返回用RGB形式表示的指定位置的颜色值
***************************************************/
inline COLORREF CImg::GetPixel(int x, int y)
{
if(m_pBMIH->biBitCount == 8) // 256色图
{
BYTE byte = m_lpData[m_pBMIH->biHeight - y - 1][x];
return RGB(byte, byte, byte);
}
else if(m_pBMIH->biBitCount == 1) // 单色图
{
BYTE ret = (1<<(7-x%8) & m_lpData[m_pBMIH->biHeight - y - 1][x/8]); // 令0代表黑
RGBQUAD *p = (RGBQUAD*)m_lpvColorTable;
if(p[0].rgbBlue != 0)
ret = !ret; if(ret)
return RGB(255, 255, 255); // 白色
else 
return RGB(0, 0, 0); // 黑色
}
else if(m_pBMIH->biBitCount == 24) // 真彩图
{
COLORREF color = RGB(m_lpData[m_pBMIH->biHeight - y - 1][x*3 + 2], 
m_lpData[m_pBMIH->biHeight - y - 1][x*3 + 1],
m_lpData[m_pBMIH->biHeight - y - 1][x*3]);
return color;
}
else
{
throw "not support now";
return 0;
}
}/**************************************************
void CImg::SetPixel(int x, int y, COLORREF color)功能:
设定指定坐标位置像素的颜色值限制:
无参数:
int x, int y
指定的像素横、纵坐标值
COLORREF
欲设定的指定位置的颜色值,RGB形式给出
返回值:

***************************************************/
void CImg::SetPixel(int x, int y, COLORREF color)
{
if(m_pBMIH->biBitCount == 8) // 256色图
{
m_lpData[m_pBMIH->biHeight - y - 1][x] = GetRValue(color);
}else if(m_pBMIH->biBitCount == 1) // 单色图
{
BYTE Color = GetRValue(color);
// 令0代表黑
RGBQUAD *p = (RGBQUAD*)m_lpvColorTable;
if(p[0].rgbBlue != 0)
Color = !Color; y = m_pBMIH->biHeight - y - 1;

// 黑色点
if (Color == 0)  // 设置对应位为0
{
if(x % 8==0)
{
m_lpData[y][x/8] &= 0x7F;  
}
else if(x % 8==1)
{
m_lpData[y][x/8] &= 0xBF;
}
else if(x % 8==2)
{
m_lpData[y][x/8] &= 0xDF;
}
else if(x % 8==3)
{
m_lpData[y][x/8] &= 0xEF;
}
else if(x % 8==4)
{
m_lpData[y][x/8] &= 0xF7;
}
else if(x % 8==5)
{
m_lpData[y][x/8] &= 0xFB;
}
else if(x % 8==6)
{
m_lpData[y][x/8] &= 0xFD;
}
else if(x % 8==7)
{
m_lpData[y][x/8] &= 0xFE;
}
}
else // 白色点
{
if(x % 8==0)
{
m_lpData[y][x/8] |= 0x80;
}
else if(x % 8==1)
{
m_lpData[y][x/8] |= 0x40;
}
else if(x % 8==2)
{
m_lpData[y][x/8] |= 0x20;
}
else if(x % 8==3)
{
m_lpData[y][x/8] |= 0x10;
}
else if(x % 8==4)
{
m_lpData[y][x/8] |= 0x08;
}
else if(x % 8==5)
{
m_lpData[y][x/8] |= 0x04;
}
else if(x % 8==6)
{
m_lpData[y][x/8] |= 0x02;
}
else if(x % 8==7)
{
m_lpData[y][x/8] |= 0x01;
}
}
}
else if(m_pBMIH->biBitCount == 24)
{
m_lpData[m_pBMIH->biHeight - y - 1][x*3] = GetBValue(color);
m_lpData[m_pBMIH->biHeight - y - 1][x*3 + 1] = GetGValue(color);
m_lpData[m_pBMIH->biHeight - y - 1][x*3 + 2] = GetRValue(color);
}
}

解决方案 »

  1.   

     pTo->SetPixel(i,j,GetPixel(u,j)); 
    这样一句就能,实现了,很是郁闷啊
    代码我上传上来了
    :http://download.csdn.net/detail/wangyaninglm/6343757
      

  2.   

    gdi+ 一句话就能反转整个图片
    image.RotateFlip()
    模式有很多,可以同时旋转和2个方向镜像反转
      

  3.   

    你 这个代码就用了两个dc,this是源,pTo是目标
      

  4.   

    你 这个代码就用了两个dc,this是源,pTo是目标

    你的意思这个是重新生成了新的图像?
      

  5.   

    应该是啊,难道你的 pTo和this是一样的?
      

  6.   


    你这个代码走弯路了,水平或垂直镜像,只需要使用Dibsection,将其宽或高设置为负值即可