正在载入。。。。。。
用户公告
正在载入。。。。。。
时间记忆
正在载入。。。。。。
登录
正在载入。。。。。。
最新日志
正在载入。。。。。。
最新回复
正在载入。。。。。。
最新留言
正在载入。。。。。。
加入群组
正在载入。。。。。。
我的好友
正在载入。。。。。。
我的相册
站点信息
正在载入。。。。。。
毕业前笔记整理-VC++图像处理(二) 
接着上面的,基于VC++的图像处理。。。。。。

1.        图像膨胀

for(i=1; i< height-1; i++)

for(j=1; j<width-1; j++){

   if(image[i][j] = 0xFF){

       image[i-1][j] |= 0x80;

       image[i+1][j] |= 0x80;

       image[i][j-1] |= 0x80;

       image[i][j+1] |= 0x80;}

for(i=0; i< height; i++)

for(j=0; j<width; j++){

      if(image[i][j])   image[i][j]= 0xFF;}

//图像腐蚀

for(i=1; i< height-1; i++)

for(j=1; j<width-1; j++){

   if(image[i][j] = 0x00){

       image[i-1][j] &= 0x80;

       image[i+1][j] &= 0x80;

       image[i][j-1] &|= 0x80;

       image[i][j+1] &= 0x80;}

for(i=0; i< height; i++)

for(j=0; j<width; j++){

      if(image[i][j] != 0xFF)   image[i][j]= 0x00;}

2.        写入BMP文件

BITMAPFILEHEADER  bmfh;

bmfh.bfType = 0x4d42; //设置文件头中文件类型为”BM”

int nSizeHdr = sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*m_nColorTableEntries;

bmfh.bfSize = sizeof(BITMAPFILEHEADER)+nSizeHdr+m_dwSizeImage;

bmfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+

sizeof(RGBQUAD)*m_nColorTableEntries;

try{

pFile -> write((LPVOID)&bmfh, sizeof(BITMAPFILEHEADER));

pFile -> write((LPVOID)m_lbmih, nSizeHdr); // m_lbmihDIB信息头指针

pFile -> write((LPVOID)m_lpImage, m_dwSizeImage); }

catch( CException* pe) {

        pe->Delete();

        AfxMessageBox(“write error”);

        return; }

 

3.        24BMP位图转化为灰度图

for(iH =0; iH<lHeight; iH++) {

lpSrcDIBBits_pixel = (char*)lpDIBBits+(SrcDIBBitSize-DIBLineBytes-iH*DIBLineBytes);

lpGrayDIBBits_pixel = (char*)lpGrayDIBBits+(GrayDIBBitSize-GrayDIBLineBytes

-iH*GrayDIBLineBytes);

for(iW=0; iW<WIDTHBYTES(lWidth*8); iW++) {

    RedV=(unsigned char)(*lpSrcDIBBits_pixel++);  //红色分量

    GreenV=(unsigned char)(*lpSrcDIBBits_pixel++); //绿色分量

    BlueV=(unsigned char)(*lpSrcDIBBits_pixel++); //蓝色分量

    YV=(float)((double)RedV*0.299 + (double)GreenV*0.58+ (double)BlueV*0.111+0.5);

    GrayV=(BYTE)YV;  //转化后的灰度像素值

*(lpGrayDIBBits_pixel++)=(unsigned char)GrayV; }  }
 

4.         //针对256色位图进行裁剪  //pSrcFile 源位图文件  //pDestFile 目标位图文件//rect 要拷贝的矩形区域

BOOL CropBitmap8(LPCTSTR pSrcFile,LPCTSTR pDestFile,LPRECT rect)

{

         CFile file;

         CFileException fe;

         BOOL ret=FALSE;

         if(!file.Open(pSrcFile,C:modeRead,&fe))//打开源位图文件

                   return ret;

         CFile f;

         CFileException e;

         if( !f.Open( pDestFile, C:modeCreate | C:modeWrite, &e ) )//要拷到的位图文件

                   return FALSE;

         DWORD retLen=0;

         DWORD dwBitsSize=file.GetLength();//文件长度

         HGLOBAL hImageBuf = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,dwBitsSize);

         if(!hImageBuf){ //分配失败则返回

                   file.Close();

                   return FALSE;  }

         LPSTR lpImage = (LPSTR)GlobalLock(hImageBuf);

         retLen=file.Read(lpImage,dwBitsSize); //将图像读入内存

         if(retLen<dwBitsSize){

                   if(hImageBuf!=NULL){

                            GlobalUnlock (hImageBuf);

                            GlobalFree (hImageBuf); }

                   file.Close();

                   return FALSE; }

         int len=sizeof(BITMAPFILEHEADER); //分析位图信息,

         LPBITMAPFILEHEADER lpFhdr=(LPBITMAPFILEHEADER)lpImage;//文件头信息

         LPBITMAPINFOHEADER lpbmpInfo = (LPBITMAPINFOHEADER)(lpImage+sizeof(BITMAPFILEHEADER));//位图头信息

int offbits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;

         int nLineBytes=0,nHeight=0,nWidth=0;

         nHeight = lpbmpInfo->biHeight;//源图像高

         nWidth = lpbmpInfo->biWidth; //源图像宽

         int rectWidth=rect->right-rect->left;

         int rectHeight=rect->bottom-rect->top; 

         //另外分配一块内存,存储大小为rectWidth*rectHeight的图像像素

         HGLOBAL hTmpBuf = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,rectWidth*rectHeight);

         LPSTR lpPic = (LPSTR)GlobalLock(hTmpBuf);

         //每行不足4的整数位则补足

         if((lpbmpInfo->biWidth)%4!=0){

                   nLineBytes=lpbmpInfo->biWidth+(lpbmpInfo->biWidth)%4;}

         else

                   nLineBytes=lpbmpInfo->biWidth;

                   int k=0,j=0;  // 拷贝原始图像到新分配的图像存储区

                   for(int y=0;y< nHeight;y++){

                            for(int x=0;x< nLineBytes;x++){

                                     if(x>=rect->left&&x<rect->right){

                                               if((y>=rect->top&&y<rect->bottom)){

                                                        //源图像像系指针(lpImage+lpFhdr->bfOffBits

                                                        //+每行的字节数(nLineBytes*y

                                                        //+现在每行的偏移量(x

                                                        *(lpPic+k*nLineBytes+j)=(unsigned char)*(lpImage+offbits+nLineBytes*y+x);

                                                        j++;

                                                        if (j>=nLineBytes){

                                                                 k++;

                                                                 j=0;}  }  }  }

                   int i;

                   RGBQUAD palette[256];

                   for (i = 0; i < 256; i++) {

                            palette[i].rgbBlue = (BYTE)i;

                            palette[i].rgbGreen = (BYTE)i;

                            palette[i].rgbRed = (BYTE)i;

                            palette[i].rgbReserved = 0;}

                   //存储位图//除了高度,宽度,不改变原始图像的其它信息

                   lpbmpInfo->biWidth=rectWidth;

                   lpbmpInfo->biHeight=rectHeight;

                   f.Write(lpFhdr,len);//写文件头

                   f.Write( lpbmpInfo,sizeof(BITMAPINFOHEADER));//写位图信息

                   f.Write( palette,sizeof(RGBQUAD)*256);//写调色板信息

                   f.Write( lpPic,rectWidth*rectHeight);//写拷贝过来的图像像素

                   f.Close();  }

         GlobalUnlock (hTmpBuf);//释放

         GlobalFree (hTmpBuf);

         GlobalUnlock (hImageBuf);//释放

         GlobalFree (hImageBuf);

         file.Close();

         return TRUE;  }

  • 标签:图像处理 
  • 发表评论:
    正在载入。。。。。。
    Copyright © 2006.09.20 design                                        生活因感动而精彩,理想在创造中放飞--水中月