Chinaunix首页 | 论坛 | 博客
  • 博客访问: 292671
  • 博文数量: 109
  • 博客积分: 2116
  • 博客等级: 大尉
  • 技术积分: 1062
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-22 15:38
文章分类

全部博文(109)

文章存档

2013年(2)

2011年(16)

2010年(90)

2009年(1)

我的朋友

分类:

2010-08-14 08:59:50

/*************************************************************************
  该函数用来镜像DIB图像。可以指定镜像的方式是水平还是垂直。
************************************************************************/
BOOL WINAPI MirrorDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BOOL bDirection)
{
 
 // 指向源图像的指针
 LPSTR lpSrc;
 
 // 指向要复制区域的指针
 LPSTR lpDst;
 
 // 指向复制图像的指针
 LPSTR lpBits;
 HLOCAL hBits;
 // 循环变量
 LONG i;
 LONG j;
 
 // 图像每行的字节数
 LONG lLineBytes;
 
 // 计算图像每行的字节数
 lLineBytes = WIDTHBYTES(lWidth * 8);
 
 // 暂时分配内存,以保存一行图像
 hBits = LocalAlloc(LHND, lLineBytes);
 if (hBits == NULL)
 {
  // 分配内存失败
  return FALSE;
 }
 
 // 锁定内存
 lpBits = (char * )LocalLock(hBits);
 
 // 判断镜像方式
 if (bDirection)
 {
  // 水平镜像
  
  // 针对图像每行进行操作
  for(i = 0; i < lHeight; i++)
  {
   // 针对每行图像左半部分进行操作
   for(j = 0; j < lWidth / 2; j++)
   {
    
    // 指向倒数第i行,第j个象素的指针
    lpSrc = (char *)lpDIBBits + lLineBytes * i + j;
    
    // 指向倒数第i行,倒数第j个象素的指针
    lpDst = (char *)lpDIBBits + lLineBytes * (i + 1) - j;
    
    // 备份一个象素
    *lpBits = *lpDst;
    
    // 将倒数第i行,第j个象素复制到倒数第i行,倒数第j个象素
    *lpDst = *lpSrc;
    
    // 将倒数第i行,倒数第j个象素复制到倒数第i行,第j个象素
    *lpSrc = *lpBits;
   }
   
  }
 }
 else
 {
  // 垂直镜像
  // 针对上半图像进行操作
  for(i = 0; i < lHeight / 2; i++)
  {
   
   // 指向倒数第i行象素起点的指针
   lpSrc = (char *)lpDIBBits + lLineBytes * i;
   
   // 指向第i行象素起点的指针
   lpDst = (char *)lpDIBBits + lLineBytes * (lHeight - i - 1);
   
   // 备份一行,宽度为lWidth
   memcpy(lpBits, lpDst, lLineBytes);
   
   // 将倒数第i行象素复制到第i行
   memcpy(lpDst, lpSrc, lLineBytes);
   
   // 将第i行象素复制到倒数第i行
   memcpy(lpSrc, lpBits, lLineBytes);
   
  }
 }
 
 // 释放内存
 LocalUnlock(hBits);
 LocalFree(hBits);
 
 // 返回
 return TRUE;
}
 
void CMyDIPView::OnMenuitem32778()
{
 // 水平镜像
 // 获取文档
 CMyDIPDoc* pDoc = GetDocument();
 
 // 指向DIB的指针
 LPSTR lpDIB;
 // 指向DIB象素指针
 LPSTR    lpDIBBits;
 
 // 锁定DIB
 lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
 
 // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
 if (::DIBNumColors(lpDIB) != 256)
 {
  // 提示用户
  MessageBox("目前只支持256色位图的水平镜像!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  // 解除锁定
  ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  
  // 返回
  return;
 }
 
 
 // 更改光标形状
 BeginWaitCursor();
 // 找到DIB图像象素起始位置
 lpDIBBits = ::FindDIBBits(lpDIB);
 
 // 调用MirrorDIB()函数水平镜像DIB
 if (MirrorDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), TRUE))
 {
  
  // 设置脏标记
  pDoc->SetModifiedFlag(TRUE);
  // 更新视图
  pDoc->UpdateAllViews(NULL);
 }
 else
 {
  // 提示用户
  MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
 }
 
 // 解除锁定
 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
 // 恢复光标
 EndWaitCursor();
 
}
void CMyDIPView::OnMenuitem32779()
{
 // 水平镜像
 // 获取文档
 CMyDIPDoc* pDoc = GetDocument();
 
 // 指向DIB的指针
 LPSTR lpDIB;
 // 指向DIB象素指针
 LPSTR    lpDIBBits;
 
 // 锁定DIB
 lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
 
 // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
 if (::DIBNumColors(lpDIB) != 256)
 {
  // 提示用户
  MessageBox("目前只支持256色位图的水平镜像!", "系统提示" , MB_ICONINFORMATION | MB_OK);
  // 解除锁定
  ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  
  // 返回
  return;
 }
 
 
 // 更改光标形状
 BeginWaitCursor();
 // 找到DIB图像象素起始位置
 lpDIBBits = ::FindDIBBits(lpDIB);
 
 // 调用MirrorDIB()函数水平镜像DIB
 if (MirrorDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), FALSE))
 {
  
  // 设置脏标记
  pDoc->SetModifiedFlag(TRUE);
  // 更新视图
  pDoc->UpdateAllViews(NULL);
 }
 else
 {
  // 提示用户
  MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
 }
 
 // 解除锁定
 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
 // 恢复光标
 EndWaitCursor();
 
}
阅读(672) | 评论(0) | 转发(0) |
0

上一篇:亮度增减

下一篇:图像细化

给主人留下些什么吧!~~