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

📄 dib.cpp

📁 电子监控的网络编程实例
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				continue;
		}
	}

	m_lpBitmapInfoHeader=(LPBITMAPINFOHEADER)lpNewDib;
	m_lpDIB=(lpNewDib+ *(LPDWORD)lpNewDib+PaletteSize(lpNewDib));

	m_nWidth=nNewWidth;
	m_nHeight=nNewHeight;
	m_nWidthOfByte=WIDTHBYTES(m_nWidth*24);
	m_dwBitsSize=dwMemSize;


	::GlobalUnlock((HGLOBAL)m_hDIB);
	::GlobalFree((HGLOBAL)m_hDIB);

	::GlobalUnlock((HGLOBAL)m_hNewDib);
	m_hDIB=m_hNewDib;


}

//切错变换
//fAngle:切错的角度;bHorzOrVert:True为水平,False为竖直
void CDIB::Traverse(float fAngle,bool bHorzOrVert)
{
	ASSERT(fAngle>-90.0 && fAngle<90.0);

	if(fAngle<0)
		fAngle+=180;
	float  PI;
    PI=(float)4.0*atan(1.0);
    
	fAngle=fAngle*PI/180.0;

	//求新的高和宽
    int		x1,y1;
    int		nNewWidth,nNewHeight;
	int		nWidth=m_nWidth,nHeight=m_nHeight;
    
	//计算新的高度和宽度
	//水平切错
	if(bHorzOrVert)
	{
		nNewWidth=nWidth+abs(nHeight*tan(fAngle));
		nNewHeight=nHeight;
	}
	else
	{
		nNewWidth=nWidth;
		nNewHeight=abs(nWidth*tan(fAngle))+nHeight;
	}
	

	LPBITMAPINFOHEADER		lpBmp;
	LPSTR					lpDib,lpNewDib,lpRgb_Sour,lpRgb_Dest;

	DWORD					dwBytesPerLine_Sour,dwBytesPerLine_Dest;
	DWORD					dwMemSize;
	HDIB					m_hNewDib;

	dwBytesPerLine_Sour=WIDTHBYTES(24*nWidth);
	dwBytesPerLine_Dest=WIDTHBYTES(24*nNewWidth);
	dwMemSize=dwBytesPerLine_Dest*nNewHeight+sizeof(BITMAPINFOHEADER);

	//开始分配旋转后的内存
	m_hNewDib=(HDIB)::GlobalAlloc(GHND,dwMemSize);
	if(m_hNewDib==NULL)
	{
		AfxMessageBox("无法分配内存!",MB_OK+MB_ICONSTOP);

		return ;
	}

	//新缓冲区
	lpNewDib=(LPSTR)::GlobalLock((HGLOBAL)m_hNewDib);
	//源缓冲区
	lpDib =(LPSTR)::GlobalLock((HGLOBAL)m_hDIB);

	::memcpy(lpNewDib,lpDib,sizeof(BITMAPINFOHEADER));
	lpBmp=(LPBITMAPINFOHEADER)lpNewDib;
	lpBmp->biWidth=nNewWidth;
	lpBmp->biHeight=nNewHeight;
	lpBmp->biSizeImage=0;

	lpRgb_Sour =(LPSTR)(lpDib+*(LPDWORD)lpDib);
	lpRgb_Dest =(LPSTR)(lpNewDib+*(LPDWORD)lpNewDib);

	//开始变换
	int r,g,b;
	for(int y=0;y<nNewHeight;y++)
	{
		for(int x=0;x<nNewWidth;x++)
		{
			//水平切错
			if(bHorzOrVert)
			{
				//向右切错
				if(tan(fAngle)>0)
				{
					y1=y;
					x1=(x)-(y)*tan(fAngle);
				}
				//向左切错
				else 
				{
					y1=y;
					x1=(x)+(nNewHeight-1-y)*tan(fAngle);
				}
			}
			//竖直切错
			else
			{
				//向上切错
				if(tan(fAngle)>0)
				{
					x1=x;
					y1=(y)-(x)*tan(fAngle);
				}
				//向下切错
				else
				{
					x1=x;
					y1=(y)+(nNewWidth-1-x)*tan(fAngle);
				}
			}
			
			//反变换后的坐标是否在源图象内?
			if(x1<nWidth && x1>0 && y1>0 && y1<nHeight)
			{
				r=*(lpRgb_Sour+(nWidth-x1-1)*3+0+(nHeight-y1-1)*dwBytesPerLine_Sour);
				g=*(lpRgb_Sour+(nWidth-x1-1)*3+1+(nHeight-y1-1)*dwBytesPerLine_Sour);
				b=*(lpRgb_Sour+(nWidth-x1-1)*3+2+(nHeight-y1-1)*dwBytesPerLine_Sour);

			}
			else
			{
				r=255;
				g=255;
				b=255;
			}

			*(lpRgb_Dest+(nNewWidth-x-1)*3+0+(nNewHeight-y-1)*dwBytesPerLine_Dest)=(BYTE)r;
			*(lpRgb_Dest+(nNewWidth-x-1)*3+1+(nNewHeight-y-1)*dwBytesPerLine_Dest)=(BYTE)g;
			*(lpRgb_Dest+(nNewWidth-x-1)*3+2+(nNewHeight-y-1)*dwBytesPerLine_Dest)=(BYTE)b;
		}
	}

	::GlobalUnlock((HGLOBAL)m_hDIB);
	::GlobalFree((HGLOBAL)m_hDIB);

	::GlobalUnlock((HGLOBAL)m_hNewDib);
	m_hDIB=m_hNewDib;

	m_nWidth=nNewWidth;
	m_nHeight=nNewHeight;
}

void CDIB::RectMapToCircle()
{

}

BOOL CDIB::LoadJPG(CString fileName)
{
	HGLOBAL h=::LoadJPG(LPCTSTR(fileName));
	if(h==NULL)
		return FALSE;

	LPSTR	pTemp;
	pTemp = (LPSTR)::GlobalLock( h );

	BITMAPINFO *pBIH;
	BITMAPFILEHEADER *pFH=(BITMAPFILEHEADER *)pTemp;

	
	pBIH = (BITMAPINFO *) (pTemp+sizeof(BITMAPFILEHEADER));

	m_nWidth=pBIH->bmiHeader.biWidth;
	m_nHeight=pBIH->bmiHeader.biHeight;
	m_nWidthOfByte=WIDTHBYTES(m_nWidth*24);
	m_dwBitsSize=m_nWidthOfByte*m_nHeight+sizeof(BITMAPINFOHEADER);

	DWORD dwSize=(pBIH->bmiHeader.biSizeImage)?pBIH->bmiHeader.biSizeImage:m_nWidth*m_nHeight*3;

	BYTE *pSrc=(LPBYTE)(pTemp + pFH->bfOffBits);

	if(dwSize>m_dwBitsSize)
		m_dwBitsSize=dwSize;
		
	DeleteObject();

	m_hDIB = (HDIB)::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,m_dwBitsSize);

	LPSTR	lpDest;
	lpDest=(LPSTR)::GlobalLock(m_hDIB);
		
	memcpy(lpDest,(LPSTR)pBIH,dwSize);


	m_pPal=NULL;


	m_lpBitmapInfoHeader=(LPBITMAPINFOHEADER)lpDest;
	m_nWidth=m_lpBitmapInfoHeader->biWidth;
	m_nHeight=m_lpBitmapInfoHeader->biHeight;
	m_nWidthOfByte=WIDTHBYTES(m_nWidth*24);
	m_lpDIB=(lpDest+ sizeof(BITMAPINFOHEADER));

	::GlobalUnlock(m_hDIB);
	::GlobalUnlock (h);
	::GlobalFree( h );

	return true;
}

BOOL CDIB::SaveJPG(CString fileName,int	nQuality)
{
	DWORD dwFileSize = (DWORD)(sizeof(BITMAPFILEHEADER) + m_dwBitsSize) ;
	
	HGLOBAL h=::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwFileSize);
	if(h==NULL)
		return FALSE;

	LPSTR	lpSour,pTemp;
	pTemp = (LPSTR) ::GlobalLock( h );

	lpSour=(LPSTR)::GlobalLock(m_hDIB);

	BITMAPFILEHEADER *pFH=(BITMAPFILEHEADER *)pTemp;
	
	pFH->bfReserved1 = 0 ;
	pFH->bfReserved2 = 0 ;
	pFH->bfSize = dwFileSize ;
	pFH->bfType = 0X4D42 ;
	pFH->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	
	BITMAPINFOHEADER *pBMI=(BITMAPINFOHEADER *)(pTemp+sizeof(BITMAPFILEHEADER));
	
	memcpy(pBMI,lpSour,m_dwBitsSize);

	BOOL bSave=::SaveJPG(LPCTSTR(fileName),h,nQuality);
	if(h!=NULL)
		::GlobalFree (h);

	::GlobalUnlock(m_hDIB);

	return bSave;
}

BOOL CDIB::SaveDIB(CString csFileName)
{
	CFile file;
	CFileException fe;

//	TRY
//	{
//	   file.Open(csFileName, CFile::modeCreate | CFile::modeWrite,NULL))
//	}
//	CATCH( CFileException, e )
//	{
//		if( e->m_cause == CFileException::fileNotFound )
//			printf( "ERROR: File not found\n");
//	}
//	END_CATCH

	if (!file.Open(csFileName, CFile::modeCreate | CFile::modeWrite |CFile::shareDenyNone, &fe))
	{
		fe.ReportError();

		return false;
	}

	TRY
	{
		if(!SaveDIB(file)) return false;
	}
	CATCH (CFileException, eLoad)
	{
		file.Abort(); // will not throw an exception
		return false;
	}
	END_CATCH
	
	return TRUE;
}

void CDIB::Write(HDIB	hDIB)
{
	LPSTR	lpDest,lpSour;
	
	lpDest=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB);
	
	lpSour=(LPSTR)::GlobalLock((HGLOBAL)hDIB);

	DWORD	dwSize=m_dwBitsSize ;

	memcpy(lpDest,lpSour,dwSize);

	::GlobalUnlock((HGLOBAL)m_hDIB);
	::GlobalUnlock((HGLOBAL)hDIB);
}

void CDIB::WriteDIB(BYTE* bRed,BYTE* bGreen,BYTE* bBlue)
{
	LPSTR					lpDIBHdr;
	LPBITMAPINFOHEADER		lpbmi;
	LPSTR					lpDIB;


	if (m_hDIB == NULL)
		return ;

	lpDIBHdr  = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
	if(lpDIBHdr  ==NULL)
		return;

	lpbmi = (LPBITMAPINFOHEADER)lpDIBHdr;

	if (lpbmi  == NULL)
		return ;

	lpDIB=FindDIBBits();

	for(int  i=0;i<m_nHeight;i++)
		for(int  j=0;j<m_nWidth;j++)
		{
			*(lpDIB+i*m_nWidthOfByte+3*j)=(BYTE)(*(bBlue+i*m_nWidth+j));
			*(lpDIB+i*m_nWidthOfByte+3*j+1)=(BYTE)(*(bGreen+i*m_nWidth+j));
			*(lpDIB+i*m_nWidthOfByte+3*j+2)=(BYTE)(*(bRed+i*m_nWidth+j));
		}

	::GlobalUnlock((HGLOBAL) lpDIBHdr);
}

BOOL CDIB::Create(CBitmap&	Bitmap)
{
	BITMAP			bm;
	BITMAPINFOHEADER	bi;
	LPBITMAPINFOHEADER 	lpbi;
	DWORD			dwLen;
	HDIB			hDIB;
	HDIB			handle;
	HDC 			hDC;
	HPALETTE		hPal;


	ASSERT( Bitmap.GetSafeHandle() );


	// If a palette has not been supplied use defaul palette
	hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);

	// Get bitmap information
	Bitmap.GetObject(sizeof(bm),(LPSTR)&bm);

	// Initialize the bitmapinfoheader
	bi.biSize		= sizeof(BITMAPINFOHEADER);
	bi.biWidth		= bm.bmWidth;
	bi.biHeight 		= bm.bmHeight;
	bi.biPlanes 		= 1;
	bi.biBitCount		= 24;
	bi.biCompression	= BI_RGB;
	bi.biSizeImage		= 0;
	bi.biXPelsPerMeter	= 0;
	bi.biYPelsPerMeter	= 0;
	bi.biClrUsed		= 0;
	bi.biClrImportant	= 0;

	// Compute the size of the  infoheader and the color table
	dwLen  = bi.biSize ;

	// We need a device context to get the DIB from
	hDC = GetDC(NULL);
	hPal = SelectPalette(hDC,hPal,FALSE);
	RealizePalette(hDC);

	// Allocate enough memory to hold bitmapinfoheader and color table
	hDIB = (HDIB)GlobalAlloc(GMEM_FIXED,dwLen);

	if (!hDIB)
	{
		SelectPalette(hDC,hPal,FALSE);
		ReleaseDC(NULL,hDC);
		return FALSE;
	}

	lpbi = (LPBITMAPINFOHEADER)hDIB;

	*lpbi = bi;

	// Call GetDIBits with a NULL lpBits param, so the device driver 
	// will calculate the biSizeImage field 
	GetDIBits(hDC, (HBITMAP)Bitmap.GetSafeHandle(), 0L, (DWORD)bi.biHeight,
			(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS);

	bi = *lpbi;

	// If the driver did not fill in the biSizeImage field, then compute it
	// Each scan line of the image is aligned on a DWORD (32bit) boundary
	if (bi.biSizeImage == 0)
		bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) 
						* bi.biHeight;

	// Realloc the buffer so that it can hold all the bits
	dwLen += bi.biSizeImage;

	m_nWidth=bi.biWidth ;
	m_nHeight=bi.biHeight ;
	m_nWidthOfByte=WIDTHBYTES(m_nWidth*24);
	if(dwLen<m_nWidthOfByte*m_nHeight+sizeof(BITMAPINFOHEADER))
		dwLen=m_nWidthOfByte*m_nHeight+sizeof(BITMAPINFOHEADER);


	if (handle = (HDIB)GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE))
		hDIB = handle;
	else
	{
		GlobalFree(hDIB);

		// Reselect the original palette
		SelectPalette(hDC,hPal,FALSE);
		ReleaseDC(NULL,hDC);
		return FALSE;
	}

	// Get the bitmap bits
	lpbi = (LPBITMAPINFOHEADER)hDIB;

	// FINALLY get the DIB
	BOOL bGotBits = GetDIBits( hDC, (HBITMAP)Bitmap.GetSafeHandle(),
				0L,				// Start scan line
				(DWORD)bi.biHeight,		// # of scan lines
				(LPBYTE)lpbi 			// address for bitmap bits
				+ (bi.biSize),
				(LPBITMAPINFO)lpbi,		// address of bitmapinfo
				(DWORD)DIB_RGB_COLORS);		// Use RGB for color table

	if( !bGotBits )
	{
		GlobalFree(hDIB);
		
		SelectPalette(hDC,hPal,FALSE);
		ReleaseDC(NULL,hDC);
		return NULL;
	}

	SelectPalette(hDC,hPal,FALSE);
	ReleaseDC(NULL,hDC);


	LPSTR	lpDest=(LPSTR)GlobalLock(hDIB);

	m_nWidth=bi.biWidth ;
	m_nHeight=bi.biHeight ;
	m_nWidthOfByte=WIDTHBYTES(m_nWidth*24);
	m_dwBitsSize=dwLen;


	m_lpBitmapInfoHeader=(LPBITMAPINFOHEADER)lpDest;
	m_lpDIB=(lpDest+ *(LPDWORD)lpDest+PaletteSize(lpDest));

	m_pPal=NULL;

	GlobalUnlock(hDIB);

	m_hDIB=hDIB;

	return TRUE;
}

BOOL CDIB::Create( HBITMAP	hBitmap)
{
	CBitmap*	Bitmap=CBitmap::FromHandle(hBitmap);

	return Create(*Bitmap);
}

BOOL CDIB::IsNULL()
{
	if(m_hDIB) return FALSE;
	else return TRUE;
}

⌨️ 快捷键说明

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