注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

千鸟

本blog所有日志均系原创 转载请注明出处

 
 
 

日志

 
 

vc 图像处理 课设的代码  

2008-03-07 15:26:10|  分类: c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

下面是一些截图.

vc 图像处理 课设的代码 - souljava - 千鸟

初始界面

vc 图像处理 课设的代码 - souljava - 千鸟

杂点

vc 图像处理 课设的代码 - souljava - 千鸟

用中值滤波去杂点

vc 图像处理 课设的代码 - souljava - 千鸟

油画滤镜

vc 图像处理 课设的代码 - souljava - 千鸟

几何变化,这个在java的里叫仿射变换

vc 图像处理 课设的代码 - souljava - 千鸟

波浪滤镜

vc 图像处理 课设的代码 - souljava - 千鸟

球面滤镜

vc 图像处理 课设的代码 - souljava - 千鸟

挤压

vc 图像处理 课设的代码 - souljava - 千鸟

再挤压

vc 图像处理 课设的代码 - souljava - 千鸟

右旋

vc 图像处理 课设的代码 - souljava - 千鸟

右旋再左旋,变回原图,有一点失真

vc 图像处理 课设的代码 - souljava - 千鸟

左旋

完全源代码下载地址:http://soulnew.googlepages.com/liuke.rar

很简单的一些东西,有些麻烦的是boss 的指令:在原来通用的从文本创建bmp

遇到一些问题:

1.从文本读出的图是歪的。搞了很久很久发现原因是bmp的规定,图像宽度必须是4的整数倍。

2. 自己构建的HDIB无法显示,原因是默认经典框架,需要的数据HDIB不包含 BITMAPFILEHEADER. 如果你想当然的把辛辛苦苦构建的完整bmp放入HDIB,哈哈不好意思,HDIB解析错误,所以画不出来。

感悟

工欲善其事必先厉其器。  c/c++的语法,vc的调试器使用,要搞清楚,要构建bmp就要把bmp的结构文档好好看看,事情做多了,但是时间却节省了下来。

 //BITMAPFILEHEADER *m_pBitmapFileHeader;  //BMP文件头
BITMAPINFOHEADER *m_pBitmapInfoHeader;       //BMP位图信息头
DWORD m_FileLength;                                           //文件长度
RGBQUAD *m_pRGBQuad;                                     //调色板数组
PBITMAPINFO m_pBitmapInfo;                              //指向BITMAPINFO结构的指针
// to add element
BYTE* lpBits;
BYTE *lpHead;
int Length;
int lWidth;
int lHeight;
int LineBits;

 

void ReadText(CString lpszPathName){
 BYTE v=0;
 BYTE*   DestArray;  
 
 long   FileLength;
 long   PixTotal;
 long   i,j;
 
 CString   result;
 CFile   file;
    CFileException   fe;  
 
 if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite,&fe))
 {
  return;
 }
 
 LiuKeHeader header;
 file.Read(&header,sizeof(LiuKeHeader));//get size info of lkbmp
 
 FileLength=file.GetLength();
 lWidth=header.xLength;
 lHeight=header.yLength;
 
    PixTotal=lWidth*lHeight; //@ 3-5
 
 DestArray=new BYTE[PixTotal];
 
 for(   i=0;i <lHeight;i++   )
 {
  for(   j=0;j <lWidth;j++   )
  {
   TRY
   {  
    file.Read(&DestArray[i*lWidth+j],sizeof(byte));
    
   }
   
   CATCH(CFileException,eLoad   )
   {
    file.Abort();
    return;
   }
   END_CATCH
  }
 }
 
 LineBits   =  WIDTHBYTES(lWidth*8);
 Length   =  LineBits*lHeight; //the length of bmp pixel,but not the useful pixel
 
 if(   lpBits   )
  delete   []   lpBits;
 lpBits=   new   BYTE   [Length];
 for(   i=0;i <Length;i++   )
 {
  lpBits[i]   = 125;
 }
 
 for(   i=0;i <lHeight;i++   )
 {
  for(   j=0;j <lWidth;j++   )
  {
   if(   i*lWidth+j   <   PixTotal   &&   DestArray[i*lWidth+j] <256   )
   {
    lpBits[ i*LineBits+j   ]  
     =   DestArray[   i*lWidth+j   ];
   }
  }
 }//需要注意存储的方式
 
 
}//end read text
//Length是图象数据数组的长度。
//lpBits指向图象数据的指针。
//第二步:创建bmp,申请内存,创建bmp文件头,根据图象数据数组写入bmp数据区,同时显示在屏幕上

void   CreatInfo()
{
 
 m_FileLength   =   1064   +   Length;
 LineBits   =   WIDTHBYTES(8*lWidth);
 m_pBitmapInfoHeader   =   (BITMAPINFOHEADER*)(lpHead);
 m_pRGBQuad   =   (RGBQUAD*)(   lpHead   + 40); //not include BITMAPFILEHEADER

 m_pBitmapInfoHeader-> biBitCount   =   8;
 m_pBitmapInfoHeader-> biClrImportant   =   0;
 m_pBitmapInfoHeader-> biClrUsed   =   0;
 m_pBitmapInfoHeader-> biCompression   =   BI_RGB;
 m_pBitmapInfoHeader-> biHeight   =   lHeight;
 m_pBitmapInfoHeader-> biWidth   =   lWidth;
 m_pBitmapInfoHeader-> biPlanes   =   1;
 m_pBitmapInfoHeader-> biSize     =   40;
 m_pBitmapInfoHeader-> biSizeImage   =   lHeight*LineBits;
 m_pBitmapInfoHeader-> biXPelsPerMeter   =   3799;
 m_pBitmapInfoHeader-> biYPelsPerMeter   =   3799;
 
 m_pBitmapInfo   =   (BITMAPINFO   *)   (m_pBitmapInfoHeader);
 m_pBitmapInfo-> bmiHeader   =   *m_pBitmapInfoHeader;
 
 for(   int   i=0;i <256;i++   )
 {
  m_pRGBQuad[i].rgbBlue=   i;
  m_pRGBQuad[i].rgbGreen   =   i;
  m_pRGBQuad[i].rgbRed   =i;
  m_pRGBQuad[i].rgbReserved   =   0;
 }
}

HDIB  CreatBMP()
{
 long   i;
 int headSize=sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD) ;
 lpHead   =   new   BYTE [headSize+Length]   ;
 CreatInfo();
 for( i=0;i <Length;i++)
 {
  
  *(lpHead+headSize+i) =lpBits[i];
 }
  
   return (HDIB)lpHead ;
} //end  CreatBMP

HDIB  OnFileOpen(CString fileName){
 
 ReadText(fileName);
 HDIB hdib=CreatBMP();
 return hdib;
 
}

 

  评论这张
 
阅读(1587)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017