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

图像处理 视频分析 机器视觉 模式识别

方向比努力更重要

 
 
 

日志

 
 
关于我

河北软件开发项目,电子警察卡口项目,公安天网项目,媒体流处理,数字图像处理。媒体服务器 RTSP、图像处理、车牌识别……DCT变换,H.264压缩

BMP文件一维海明码压缩原理  

2009-12-03 15:52:32|  分类: ____图形图像 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

HANDLE hSourceFile=INVALID_HANDLE_VALUE,hTargetFile=INVALID_HANDLE_VALUE;
DWORD dwSourceSize=0,dwTargetSize=0;
PBYTE pSource=NULL,pTarget=NULL;
hSourceFile=CreateFile(szSourceFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hSourceFile==INVALID_HANDLE_VALUE)
{
   AfxMessageBox("文件格式错误!");
   return FALSE;
}
dwSourceSize=GetFileSize(hSourceFile,NULL);
pSource=(PBYTE)VirtualAlloc(NULL,dwSourceSize,MEM_COMMIT,PAGE_READWRITE);
    if(pSource==NULL||dwSourceSize<=54)//分配空间失败或者文件太小(BMP文件不可能小于54个字节)
 {
       CloseHandle(hSourceFile);
       return FALSE;
 }
DWORD dwTemp=0;
ReadFile(hSourceFile,pSource,dwSourceSize,&dwTemp,NULL);
BITMAPFILEHEADER *pSourceFileHeader=(BITMAPFILEHEADER*)pSource;
BITMAPINFOHEADER *pSourceInfoHeader=(BITMAPINFOHEADER*)(pSource+sizeof(BITMAPFILEHEADER));
    if(pSourceFileHeader->bfType!=0x4d42||pSourceInfoHeader->biBitCount!=32)//不是BMP文件或者不是24位真彩色
 {
    AfxMessageBox("文件格式错误!");
       CloseHandle(hSourceFile);
       VirtualFree(pSource,NULL,MEM_RELEASE);
       return FALSE;
 }
CloseHandle(hSourceFile);

LONG nWidth=pSourceInfoHeader->biWidth;
LONG nHeight=pSourceInfoHeader->biHeight;
/***********************注意位图的一个扫描行必须是32位的倍数******************************************************/
LONG nSourceWidth=nWidth*4;if(nSourceWidth%4) nSourceWidth=(nSourceWidth/4+1)*4;
LONG nTargetWidth=nWidth;if(nTargetWidth%4) nTargetWidth=(nTargetWidth/4+1)*4;
/***********************以上的位图数据位改为了32位,四字节******************************************************/

dwTargetSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+nHeight*nTargetWidth;
pTarget=(PBYTE)VirtualAlloc(NULL,dwTargetSize,MEM_COMMIT,PAGE_READWRITE);
memset(pTarget,0,dwTargetSize);
if(pTarget==NULL)
{
   VirtualFree(pTarget,NULL,MEM_RELEASE);
   return FALSE;
}
BITMAPFILEHEADER *pTargetFileHeader=(BITMAPFILEHEADER *)pTarget;
BITMAPINFOHEADER *pTargetInfoHeader=(BITMAPINFOHEADER *)(pTarget+sizeof(BITMAPFILEHEADER));
pTargetFileHeader->bfType=pSourceFileHeader->bfType;
pTargetFileHeader->bfSize=dwTargetSize;
pTargetFileHeader->bfReserved1=0;
pTargetFileHeader->bfReserved2=0;
pTargetFileHeader->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
pTargetInfoHeader->biBitCount=8;
pTargetInfoHeader->biClrImportant=0;
pTargetInfoHeader->biClrUsed=256;
pTargetInfoHeader->biCompression=BI_RGB;
pTargetInfoHeader->biHeight=pSourceInfoHeader->biHeight;
pTargetInfoHeader->biPlanes=1;
pTargetInfoHeader->biSize=sizeof(BITMAPINFOHEADER);
pTargetInfoHeader->biSizeImage=nHeight*nTargetWidth;
pTargetInfoHeader->biWidth=pSourceInfoHeader->biWidth;
pTargetInfoHeader->biXPelsPerMeter=pSourceInfoHeader->biXPelsPerMeter;
pTargetInfoHeader->biYPelsPerMeter=pSourceInfoHeader->biYPelsPerMeter;
RGBQUAD *pRgb;
for(int i=0;i<256;i++)//初始化8位灰度图的调色板信息
{
   pRgb=(RGBQUAD*)(pTarget+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+i*sizeof(RGBQUAD));
   pRgb->rgbBlue=i;pRgb->rgbGreen=i;pRgb->rgbRed=i;pRgb->rgbReserved=0;
}
int szh=0;
for (int mm=10;mm<nHeight;mm++)//转化真彩色图为灰度图
{
   szh=mm-10;
   for(int n=0;n<nWidth;n++)
   {
    int m=nHeight-1-mm;
       pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n]=pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*4]*0.114+pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*4+1]*0.587+pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*4+2]*0.299;
/*************************************************************************************************/
       int szl=int((n+1)*2/8)+20;int szlw=((n+1)*2)%8;
       if(int(pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n])<192)
    {
     switch(szlw)
     {
          case 6:
     fax[szh][szl]    |=0x0c;
     break;
    case 4:
     fax[szh][szl]    |=0x30;
     break;
    case 2:
     fax[szh][szl]    |=0xc0;
     break;
    case 0:
     fax[szh][szl-1]  |=0x03;
     break;
     }
    }
    else if(int(pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n])<250)
    {
     switch(szlw)
     {
          case 6:
     if(fax[szh][szl]&0x10)
     {fax[szh][szl]    |=0x08;}
     else
     {fax[szh][szl]    |=0x06;}
     break;
    case 4:
     if(fax[szh][szl]&0x40)
     {fax[szh][szl]    |=0x20;}
     else
     {fax[szh][szl]    |=0x10;}
     break;
    case 2:
     if(fax[szh][szl-1]&0x01)
     {fax[szh][szl]    |=0x80;}
     else
     {fax[szh][szl]    |=0x60;}
     break;
    case 0:
     if(fax[szh][szl-1]&0x04)
     {fax[szh][szl-1]    |=0x02;}
     else
     {fax[szh][szl-1]    |=0x01;}
     break;
     }
    }
/*************************************************************************************************/
}
}
cout<<"正在生成文件"<<endl<<"请等待……"<<endl;
/**************************把BYTE fax[1100][216]转换成char FAX[1100][1728]**********************************************/
kwCharTurntoBit((char *)&fax[0][0], 1100*216, (char *)&FAX[0][0]);
/******************************把转换好的海明码存储在一个char buf[1600*1024]中*********************************************************/ 
addEOL();
CProgressCtrl* pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pProg->SetPos(0); 
for( i=0;i<1100;i++)
{
 pProg->SetPos(pProg->GetPos()+1);              
 count=0;
 bkFlag=0;//每一行刚开始的时候都默认为是白色的。
 for(int j=0;j<1728;j++)
 {
  char temp;
     temp=char(bkFlag+48);
  if(FAX[i][j]==temp)                              /***************************************/
  {count++;}                                       /***如何这样的话,每次都少处理一个点****/
  else                                             /****************************************/
  {
   terminating=count%64;
      makeup=count/64-1;
   addHM();
   bkFlag=!bkFlag;
   count=1;                    //直接赋值为1,不能白循环一次。
  }
 }
 terminating=count%64;
 makeup=count/64-1;
 addHM();
 addEOL();
}
int len = strlen(buf);
strncpy(&buf[len], RTC, strlen(RTC));
char bbuff[200*1024];
memset(bbuff, 0, 200*1024);
/*******************转换buf位成bbuff字符***************************************************************/
len = kwBitTurntoChar(buf, strlen(buf), bbuff);
/******************************************************************************************************/
fstream file(SavePath,ios::in|ios::out|ios::binary);
if(!file)
{
 cout<<"fax.dat can't open.\n";
 abort();
}
file.write(bbuff,len);
file.close();
hTargetFile=CreateFile(szTargetFile,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
BOOL stat=WriteFile(hTargetFile,pTarget,dwTargetSize,&dwTemp,NULL);
CloseHandle(hTargetFile);
VirtualFree(pSource,NULL,MEM_RELEASE);
VirtualFree(pTarget,NULL,MEM_RELEASE);
//AfxMessageBox("进行完毕!");
return 1;

  评论这张
 
阅读(1047)| 评论(0)

历史上的今天

评论

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

页脚

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