
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_lbmih为DIB信息头指针
pFile -> write((LPVOID)m_lpImage, m_dwSizeImage); }
catch( CException* pe) {
pe->Delete();
AfxMessageBox(“write error”);
return; }
3. 24位BMP位图转化为灰度图
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; //转化后的灰度像素值
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; }