⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dib.cpp

📁 用vc++实现的运动轨迹识别系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	if(CurrentPoint.x!=this->width-1)
	{
		Pointtmp.x=CurrentPoint.x+1;
		Pointtmp.y=CurrentPoint.y;
	
		if(this->IsBorderPoint(Pointtmp,lpDIBBits, wBytesPerLine))
		return Pointtmp;
	}
	if((CurrentPoint.y!=this->height-1)&&(CurrentPoint.x!=this->width-1))
	{
		Pointtmp.x=CurrentPoint.x+1;
		Pointtmp.y=CurrentPoint.y+1;
	
		if(this->IsBorderPoint(Pointtmp,lpDIBBits, wBytesPerLine))
		return Pointtmp;
	}
	if(CurrentPoint.y!=this->height-1)
	{
		Pointtmp.x=CurrentPoint.x;
		Pointtmp.y=CurrentPoint.y+1;
	
		if(this->IsBorderPoint(Pointtmp,lpDIBBits, wBytesPerLine))
		return Pointtmp;
	}
	if((CurrentPoint.x!=0)&&(CurrentPoint.y!=this->height-1))
	{
		Pointtmp.x=CurrentPoint.x-1;
		Pointtmp.y=CurrentPoint.y+1;
	
		if(this->IsBorderPoint(Pointtmp,lpDIBBits, wBytesPerLine))
		return Pointtmp;
	}
	if(CurrentPoint.x!=0)
	{
		Pointtmp.x=CurrentPoint.x-1;
		Pointtmp.y=CurrentPoint.y;
	
		if(this->IsBorderPoint(Pointtmp,lpDIBBits, wBytesPerLine))
		return Pointtmp;
	}
	if((CurrentPoint.x!=0)&&(CurrentPoint.y!=0))
	{
		Pointtmp.x=CurrentPoint.x-1;
		Pointtmp.y=CurrentPoint.y-1;
	
		if(this->IsBorderPoint(Pointtmp,lpDIBBits, wBytesPerLine))
		return Pointtmp;
	}
	
	if(CurrentPoint.y != 0)
	{
		Pointtmp.x = CurrentPoint.x;
		Pointtmp.y = CurrentPoint.y-1;
	
		if(this->IsBorderPoint(Pointtmp,lpDIBBits, wBytesPerLine))
			return Pointtmp;
	}
   	if((CurrentPoint.y!=0)&&(CurrentPoint.x!=this->width-1))
	{
		Pointtmp.y=CurrentPoint.y-1;
		Pointtmp.x=CurrentPoint.x+1;
	
		if(this->IsBorderPoint(Pointtmp,lpDIBBits, wBytesPerLine))
		return Pointtmp;
	}
	CPoint errorPoint;
	errorPoint.x=errorPoint.y=-2;
	return errorPoint;
	*/
	return Pointtmp;
}

BOOL DIB::IsBorderPoint(CPoint CurrentPoint ,LPBYTE lpDIBBits,WORD wBytesPerLine)
{
	long lOffset;
	lOffset = this->PixelOffset(CurrentPoint.y,CurrentPoint.x,wBytesPerLine);
	if(*(lpDIBBits+lOffset)!=0)
		return false;

	if(CurrentPoint.y!=0)
	{
		lOffset = this->PixelOffset(CurrentPoint.y-1,CurrentPoint.x,wBytesPerLine);
		if(*(lpDIBBits+lOffset)==255)
		return true;
	}

	if(CurrentPoint.x!=this->width-1)
	{
		lOffset = this->PixelOffset(CurrentPoint.y,CurrentPoint.x+1,wBytesPerLine);
		if(*(lpDIBBits+lOffset)==255)
		return true;
	}

	if(CurrentPoint.y!=this->height-1)
	{
		lOffset = this->PixelOffset(CurrentPoint.y+1,CurrentPoint.x,wBytesPerLine);
		if(*(lpDIBBits+lOffset)==255)
		return true;
	}


	if(CurrentPoint.x!=0)
	{
		lOffset = this->PixelOffset(CurrentPoint.y,CurrentPoint.x-1,wBytesPerLine);
		if(*(lpDIBBits+lOffset)==255)
		return true;
	}

	return false;
}



CPoint DIB::SearchInteriorPoint(CPoint Point,LPBYTE lpDIBBits,WORD wBytesPerLine)
{
	long lOffset;
	CPoint Pointtmp;
	Pointtmp.x=Pointtmp.y=-1;
	if((Point.x!=0)&&(Point.y!=this->height-1))
	{
		lOffset = this->PixelOffset(Point.y+1,Point.x-1,wBytesPerLine);
		if(*(lpDIBBits+lOffset)==0)
		{
			Pointtmp.x=Point.x-1;
			Pointtmp.y=Point.y+1;
			return Pointtmp;
		}
	}

	if(Point.y!=this->height-1)
	{
		lOffset = this->PixelOffset(Point.y+1,Point.x,wBytesPerLine);
		if(*(lpDIBBits+lOffset)==0)
		{
			Pointtmp.x=Point.x;
			Pointtmp.y=Point.y+1;
			return Pointtmp;
		}
	}

	if((Point.x!=this->width-1)&&(Point.y!=this->height-1))
	{
		lOffset = this->PixelOffset(Point.y+1,Point.x+1,wBytesPerLine);
		if(*(lpDIBBits+lOffset)==0)
		{
			Pointtmp.x=Point.x+1;
			Pointtmp.y=Point.y+1;
			return Pointtmp;
		}
	}

	if(Point.x!=this->width-1)
	{
		lOffset=this->PixelOffset(Point.y,Point.x+1,wBytesPerLine);
		if(*(lpDIBBits+lOffset)==0)
		{
			Pointtmp.x=Point.x+1;
			Pointtmp.y=Point.y;
			return Pointtmp;
		}
	}
	return Pointtmp;
}



BOOL DIB:: SaveDIB(HANDLE hDib, CFile& file)
{
	// Bitmap文件头
	BITMAPFILEHEADER bmfHdr;
	
	// 指向BITMAPINFOHEADER的指针
	LPBITMAPINFOHEADER lpBI;
	
	// DIB大小
	DWORD dwDIBSize =0;

	if (hDib == NULL)
	{
		// 如果DIB为空,返回FALSE
		return FALSE;
	}

	// 读取BITMAPINFO结构,并锁定
	lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);
	
	if (lpBI == NULL)
	{
		// 为空,返回FALSE
		return FALSE;
	}
	
	// 判断是否是WIN3.0 DIB
//	if (!IS_WIN30_DIB(lpBI))
//	{
		// 不支持其它类型的DIB保存
		
		// 解除锁定
	//	::GlobalUnlock((HGLOBAL) hDib);
		
		// 返回FALSE
	//	return FALSE;
//	}

	// 填充文件头

	// 文件类型"BM"
	bmfHdr.bfType =  0x4d42; //DIB_HEADER_MARKER;

	// 计算DIB大小时,最简单的方法是调用GlobalSize()函数。但是全局内存大小并
	// 不是DIB真正的大小,它总是多几个字节。这样就需要计算一下DIB的真实大小。
	
	// 文件头大小+颜色表大小
	// (BITMAPINFOHEADER和BITMAPCOREHEADER结构的第一个DWORD都是该结构的大小)
//	dwDIBSize = *(LPDWORD)lpBI; //+ ::PaletteSize((LPSTR)lpBI);
	dwDIBSize = sizeof(BITMAPINFOHEADER);//+lpBI->biSizeImage;	
	// 计算图像大小
	if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))
	{
		// 对于RLE位图,没法计算大小,只能信任biSizeImage内的值
		dwDIBSize += lpBI->biSizeImage;
	}
	else
	{
		// 象素的大小
		DWORD dwBmBitsSize;

		// 大小为Width * Height
		dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*24) * lpBI->biHeight;
		
		// 计算出DIB真正的大小
		dwDIBSize += dwBmBitsSize;

		// 更新biSizeImage(很多BMP文件头中biSizeImage的值是错误的)
		lpBI->biSizeImage = dwBmBitsSize;
	}


	// 计算文件大小:DIB大小+BITMAPFILEHEADER结构大小
	bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
	
	// 两个保留字
	bmfHdr.bfReserved1 = 0;
	bmfHdr.bfReserved2 = 0;

	// 计算偏移量bfOffBits,它的大小为Bitmap文件头大小+DIB头大小+颜色表大小
	bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize;
											 // + PaletteSize((LPSTR)lpBI);
	// 尝试写文件
//	TRY
	{
		// 写文件头
		file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));
		
		// 写DIB头和象素
		file.WriteHuge(lpBI, dwDIBSize);
	}
//	CATCH (CFileException, e)
//	{
		// 解除锁定
	//	::GlobalUnlock((HGLOBAL) hDib);
		
		// 抛出异常
///		THROW_LAST();
//	}
//	END_CATCH
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) hDib);
	
	// 返回TRUE
	return TRUE;
}




HANDLE DIB::ScaleDIB(HANDLE hDIB, float scal_x, float scal_y)
{
	if(scal_x<0 || scal_y <0)
		return NULL;

	LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER) GlobalLock(hDIB);
	int w = lpbi->biWidth;
	int h = lpbi->biHeight;
	BYTE  tempmess[40];
	LPBYTE Src = this->FindDIBBits(hDIB);
	memcpy(tempmess,(LPBYTE)lpbi,40);
	int wid = ((int)(w*scal_x+0.5f)*24+31)/32*4;
	int imgsize =(int) (wid*(int)(h*scal_y+0.5f));
	
	HDIB hDIB2 = GlobalAlloc(GMEM_MOVEABLE,(DWORD)(sizeof(BITMAPINFOHEADER)+imgsize));
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB2);
	memcpy((LPBYTE)lpbi,tempmess,40);
	lpbi->biWidth =(int)(w*scal_x+0.5f);
	lpbi->biHeight = (int)(h*scal_y+0.5f);
	lpbi->biSizeImage = imgsize;
	LPBYTE lpData = this->FindDIBBits(hDIB2);
	int srcWidth = w;
	int srcHeight = h;
	int dstWidth = (int)(w*scal_x+0.5f);
	int dstHeight = (int)(h*scal_y+0.5f);

	for(int i=0; i<dstHeight;i++)
	{
		float y_inverse_map = (float)i/scal_y;
		int y_lt = (int)y_inverse_map;
		float v=y_inverse_map - y_lt;
		int indexBase = i *wid;
		for(int j=0;j<dstWidth;j++)
		{
			float x_inverse_map = (float)j/scal_x;
			int x_lt = (int) x_inverse_map;
			float u=x_inverse_map - x_lt;
			int index = indexBase + j*3;
			*(lpData+index) = Src[y_lt*((w*24+31)/32*4)+x_lt*3];
			*(lpData+index+1) = Src[y_lt*((w*24+31)/32*4)+x_lt*3+1];
			*(lpData+index+2) = Src[y_lt*((w*24+31)/32*4)+x_lt*3+2];
		//	int r,g,b;
			//((interPolate(Src,x_lt,y_lt,u,v,srcWidth,srcHeight,&r,&g,&b))) ;
		//	*(lpData+temp)   = b;
			//*(lpData+index++)   = (BYTE)((interPolate(Src,x_lt,y_lt,u,v,srcWidth,srcHeight)>>16)) & 0x000000ff;
		//	(interPolate(Src,x_lt,y_lt,u,v,srcWidth,srcHeight,&r,&g,&b));
		//	*(lpData+temp+1)   = g;
		  //  (interPolate(Src,x_lt,y_lt,u,v,srcWidth,srcHeight,&r,&g,&b));
		//	 *(lpData+temp+2)   =r;
			
		}
	}
	GlobalUnlock(hDIB);
	GlobalUnlock(hDIB2);
	return hDIB2;

}

//cwh 01.6.20
/*****************************************
卷积核心算法
*****************************************/
void DIB::interPolate(LPBYTE Src,int x,int y, float u,float v, int scanw, int scanh,int *r,int *g,int *b)
{
//	UINT r11,g11,b11;
	//r=g=b=0;
		int red1[2][2];
		int green1[2][2];
		int blue1[2][2];
		int xx1[2];
		int yy1[2];
		xx1[0]=x*3;xx1[1]=x*3+3;
		yy1[0]=y;yy1[1]=y+1;
		if(xx1[1]>scanw-1)
			xx1[1] = scanw-1;
		if(yy1[1]>scanh-1)
			yy1[1] = scanh-1;

		for(int i=0;i<2;i++)
		{
			int indexBase1 = yy1[i]*((scanw*24+31)/32*4);
			for(int j=0;j<2;j++)
			{
				int index1 = indexBase1 + xx1[j];
				blue1[j][i] = (*(Src+index1));
			    green1[j][i] = (*(Src+index1+1));
			    red1[j][i] =  (*(Src+index1+2));

			}
		}

		//r11 = ((1-u)*(1-v)*red1[0][0]+(1-u)*v*red1[0][1]+u*(1-v)*red1[1][0]+u*v*red1[1][1]);
	//	g11 = ((1-u)*(1-v)*green1[0][0]+(1-u)*v*green1[0][1]+u*(1-v)*green1[1][0]+u*v*green1[1][1]);
		//b11 = ((1-u)*(1-v)*blue1[0][0]+(1-u)*v*blue1[0][1]+u*(1-v)*blue1[1][0]+u*v*blue1[1][1]);
  
	//	*r=r11;
		//*g=g11;
	//	*b=b11;
//	return (0x00ffffff&((b<<16)|(g<<8)|r));
}

HANDLE DIB::CopyHandle( HANDLE hSrc)
{	
	HANDLE hDst;
	LPBITMAPINFOHEADER lpbi;
	int width,height;
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hSrc);
	width = lpbi->biWidth;
	height = lpbi->biHeight;
	hDst = GlobalAlloc(GMEM_MOVEABLE,lpbi->biSize+lpbi->biSizeImage);
	if(!hDst)
		return NULL;
	LPBYTE lpDest;
	lpDest = (LPBYTE)GlobalLock(hDst);
	memcpy(lpDest,(LPBYTE)lpbi,lpbi->biSize+lpbi->biSizeImage);
	GlobalUnlock(hSrc);
	GlobalUnlock(hDst);
	return hDst;

}
HANDLE  DIB::  Gradient(HANDLE hDIB)
{
	LPBITMAPINFOHEADER lpbi;
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
	int width = lpbi->biWidth;
	int height = lpbi->biHeight;
	long lOffset;
	LPBYTE lpS,lpD;
	WORD wBytesPerLine = this->BytePerLine(hDIB);
	HANDLE hNewDIB;
	hNewDIB = GlobalAlloc(GMEM_MOVEABLE,(DWORD)(lpbi->biSize+lpbi->biSizeImage));
	if(!hNewDIB)
	{
		AfxMessageBox("分配内存失败");
		return NULL;
	}
	lpS = (LPBYTE)lpbi;
	lpD =(LPBYTE) GlobalLock(hNewDIB);
	memcpy(lpD,lpS,sizeof(BITMAPINFOHEADER));
	lpS = this->FindDIBBits(hDIB);
	lpD = this->FindDIBBits(hNewDIB);
	int color1,color2;
	for(int i=1;i<height-1;i++)
		for(int j=1;j<width-1;j++)
		{
			lOffset = this->PixelOffset(i+1,j+1,wBytesPerLine);
			color1 = *(lpS+lOffset);
			lOffset = this->PixelOffset(i-1,j-1,wBytesPerLine);
			color2 = *(lpS+lOffset);
			lOffset = this->PixelOffset(i,j,wBytesPerLine);
			*(lpD+lOffset++) = abs(color2-color1)*3;
			*(lpD+lOffset++) = abs(color2-color1)*3;
			*(lpD+lOffset++) = abs(color2-color1)*3;

		}
		for(i =0;i<height;i++)
		{
			lOffset = this->PixelOffset(i,0,wBytesPerLine);
			*(lpD+lOffset++) =0;
			*(lpD+lOffset++) =0;
			*(lpD+lOffset++) =0;
		}

		for(i =0;i<height;i++)
		{
			lOffset = this->PixelOffset(i,width-1,wBytesPerLine);
			*(lpD+lOffset++) =0;
			*(lpD+lOffset++) =0;
			*(lpD+lOffset++) =0;
		}
		for(i =0;i<width;i++)
		{
			lOffset = this->PixelOffset(height-1,i,wBytesPerLine);
			*(lpD+lOffset++) =0;
			*(lpD+lOffset++) =0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -