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

📄 myimage.cpp

📁 电子监控的网络编程实例
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		return IMAGE_ERR_LOCK;
	lpDIBHdr = (LPSTR)(lp+14);
	LPBITMAPINFOHEADER lpbih = (LPBITMAPINFOHEADER)lpDIBHdr;

	lpDIBBits = lpDIBHdr + *(LPDWORD)lpDIBHdr;/* + PaletteSize(lpDIBHdr);*///调色板长度
	// Get the DIB's palette, then select it into DC
	//   Select as background since we have
	//   already realized in forground if needed
/*	设置调色板
	if (m_pPal != NULL)
	{
		pOldPal = SelectPalette(pDC,(HPALETTE )m_pPal->m_hObject,TRUE);
		RealizePalette(pDC);
	}
*/
	// Make sure to use the stretching mode best for color pictures 
	SetStretchBltMode(hDC,COLORONCOLOR);
	// Determine whether to call StretchDIBits() or SetDIBitsToDevice() 
	if (dRect.Width()==sRect.Width()&&dRect.Height()==sRect.Height())
		bSuccess = SetDIBitsToDevice(hDC,dRect.left,dRect.top,
		dRect.Width(),dRect.Height(),sRect.left,
		lpbih->biHeight-sRect.top-sRect.Height(),0,lpbih->biHeight,
 			    lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);
	else 
		bSuccess = ::StretchDIBits(hDC,dRect.left,dRect.top,dRect.Width(),
		dRect.Height(),sRect.left,sRect.top,sRect.Width(),sRect.Height(),
		lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);
	
	::GlobalUnlock(hImage);
	// Reselect old palette 
	if (pOldPal != NULL) SelectPalette(hDC,pOldPal, TRUE);
	
	if(bSuccess)
		return IMAGE_OK;
	else return IMAGE_ERR_DRAW;
}


//绘制DDB位图
BOOL CMyImage::DrawDDB(HBITMAP hBitmap, HDC hDC, CRect sRect, CRect dRect)
{
	HBITMAP holdbitmap=NULL;
	HDC hmemdc=NULL;
	
	//hBitmap = (HBITMAP)::LoadImage(NULL, "d:\\111.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
	
	hmemdc = ::CreateCompatibleDC(hDC);
	holdbitmap = (HBITMAP)::SelectObject(hmemdc, hBitmap);
	BOOL bSuccess = FALSE;

	if (dRect.Width()==sRect.Width()&&dRect.Height()==sRect.Height())
		bSuccess = BitBlt(hDC,dRect.left,dRect.top,
		dRect.Width(),dRect.Height(),hmemdc,sRect.left,sRect.top,SRCCOPY);
	else 
		bSuccess = ::StretchBlt(hDC,dRect.left,dRect.top,dRect.Width(),
		dRect.Height(),hmemdc, sRect.left,sRect.top,sRect.Width(),sRect.Height(),SRCCOPY);
	
	::SelectObject(hmemdc, holdbitmap);
	::DeleteDC(hmemdc);
	
	return bSuccess;
}

//绘制DIB位图
BOOL CMyImage::DrawDIB(HDIB hDib, HDC hDC, CRect sRect, CRect dRect)
{
	LPSTR    lpDIBHdr=NULL;            // Pointer to BITMAPINFOHEADER
	LPSTR    lpDIBBits=NULL;           // Pointer to DIB bits
	BOOL     bSuccess=FALSE;      // Success/fail flag
	HPALETTE pOldPal=NULL;        // Previous palette
	
	// Check for valid DIB handle 
	if (hDib == NULL) return FALSE;
	// Lock down the DIB, and get a pointer to the beginning of the bit
	//   buffer
	lpDIBHdr  = (LPSTR)::GlobalLock(hDib);
	if(!lpDIBHdr)
		return FALSE;
	LPBITMAPINFOHEADER lpbih = (LPBITMAPINFOHEADER)lpDIBHdr;

	lpDIBBits = lpDIBHdr + *(LPDWORD)lpDIBHdr;/* + PaletteSize(lpDIBHdr);*///调色板长度
	// Get the DIB's palette, then select it into DC
	//   Select as background since we have
	//   already realized in forground if needed
/*	设置调色板
	if (m_pPal != NULL)
	{
		pOldPal = SelectPalette(pDC,(HPALETTE )m_pPal->m_hObject,TRUE);
		RealizePalette(pDC);
	}
*/
	// Make sure to use the stretching mode best for color pictures 
	SetStretchBltMode(hDC,COLORONCOLOR);
	// Determine whether to call StretchDIBits() or SetDIBitsToDevice() 
	if (dRect.Width()==sRect.Width()&&dRect.Height()==sRect.Height())
		bSuccess = SetDIBitsToDevice(hDC,dRect.left,dRect.top,
		dRect.Width(),dRect.Height(),sRect.left,
		lpbih->biHeight-sRect.top-sRect.Height(),0,lpbih->biHeight,
 			    lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);
	else 
		bSuccess = ::StretchDIBits(hDC,dRect.left,dRect.top,dRect.Width(),
		dRect.Height(),sRect.left,sRect.top,sRect.Width(),sRect.Height(),
		lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);
	
	::GlobalUnlock(hDib);
	// Reselect old palette 
	if (pOldPal != NULL) SelectPalette(hDC,pOldPal, TRUE);
	
	return bSuccess;
}

/* 
这是一个用来画透明位图的函数 
CDC *pDC 需要画位图的CDC指针 
UINT IDImage 位图资源ID 
CRect &rect 指定位图在pDC中的位置 
COLORREF rgbMask 位图的透明色 
*/
void CMyImage::DrawTransparentBitmap(CDC *pDC, UINT IDImage, CRect &rect, COLORREF rgbMask)
{
	CDC ImageDC,MaskDC; 
	
	CBitmap Image,*pOldImage; 
	CBitmap maskBitmap,*pOldMaskDCBitmap ; 
	
	Image.LoadBitmap(IDImage); 
	ImageDC.CreateCompatibleDC(pDC); 
	pOldImage=ImageDC.SelectObject(&Image); 
	
	MaskDC.CreateCompatibleDC(pDC); 
	maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL ); 
	pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap ); 
	
	ImageDC.SetBkColor(rgbMask); 
	MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY ); 
	
	ImageDC.SetBkColor(RGB(0,0,0)); 
	ImageDC.SetTextColor(RGB(255,255,255)); 
	ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND); 
	
	pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND); 
	pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT); 
	
	MaskDC.SelectObject(pOldMaskDCBitmap); 
	ImageDC.SelectObject(pOldImage); 
}

//显示错误信息
void CMyImage::ShowErr(IMAGE_ERROR err)
{
	switch(err) {
	case IMAGE_OK:		
		break;
	case IMAGE_NULL:
		AfxMessageBox("图像Image为空--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_CREATE:
		AfxMessageBox("创建图像Image失败--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_FREE:				//释放图像Image失败
		AfxMessageBox("释放图像Image失败--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_LOCK:				//锁定图像Image失败
		AfxMessageBox("锁定图像Image失败--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_UNLOCK:           //解锁图像Image失败
		AfxMessageBox("解锁图像Image失败--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_READFILE:			//读图像文件失败
		AfxMessageBox("读图像文件失败--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_FILENOTEXIST:		//文件不存在
		AfxMessageBox("图像文件不存在--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_RGB:			//图像格式不对//目前只能处理24位真彩色
		AfxMessageBox("图像格式不对|目前只能处理24位真彩色--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_IMAGELOAD_SAVE:		//调用ImageLoad读写JPG图像失败
		AfxMessageBox("调用ImageLoad写JPG图像失败--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_IMAGELOAD_READ:
		AfxMessageBox("调用ImageLoad读JPG图像失败--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_INFOHEADER:		//没有指定BITMAPINFOHEADER(m_bih)			
		AfxMessageBox("没有指定位图头信息--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_WRITEFILE:		//写文件失败()
		AfxMessageBox("写文件失败--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_NOTSUPPORTFILE:	//不支持的图像格式(只支持BMP和JPG)		
		AfxMessageBox("不支持的图像格式(只支持BMP和JPG)--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_SIZE:				//缓冲大小不正确	
		AfxMessageBox("缓冲大小不正确--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_NOFILENAME:		//文件名称为空		
		AfxMessageBox("文件名称为空--CMyImage", MB_OK | MB_ICONERROR);
		break;
	case IMAGE_ERR_DRAW:	//用StretchDIBits或SetDIBitsToDevice绘制图像时失败
		AfxMessageBox("用StretchDIBits或SetDIBitsToDevice绘制图像时失败--CMyImage", MB_OK | MB_ICONERROR);
		break;
	default:
		AfxMessageBox("未知错误--CMyImage", MB_OK | MB_ICONERROR);
	}
}
//从文件获得DIB位图
HDIB CMyImage::LoadDIB(CString FileName)
{

	if(FileName.IsEmpty())
		return NULL;
	
	CFile file;
	CFileException fe;	
	if (!file.Open(FileName, CFile::modeRead | CFile::shareDenyNone , &fe))
	{
		//		MessageBox(NULL,"无法读取文件!","错误",MB_ICONSTOP);
		
		return NULL;
	}
	HDIB hDib = NULL;
	CString m_strName=FileName;
	CString m_strFileExt=FileName.Right(3);
	m_strFileExt.MakeUpper();
	if(m_strFileExt=="BMP")
	{
		TRY
		{
			hDib = LoadDIB(file);
			if( !hDib )
			{
				file.Close();
				return NULL;
			}
		}
		CATCH (CFileException, eLoad)
		{
			file.Abort(); // will not throw an exception
			return NULL;
		}
		END_CATCH
	}
	else if(m_strFileExt=="JPG")
	{
		//	file.Close();
		hDib = LoadDibJPG(FileName);
		if( !hDib)
			return NULL;
	}
	else
	{
		file.Close();
		return NULL;
	}
	
	file.Close();
	return hDib;
}
//从BMP文件中获得DIB
HDIB CMyImage::LoadDIB(CFile &file)
{
	BITMAPFILEHEADER bmfHeader;
	LPBITMAPINFOHEADER lpbmi=NULL;		// pointer to a Win 3.0-style DIB
	LPBITMAPINFO		lpbmifo=NULL;
	BITMAPINFO			BitmapInfo;
	LPBYTE pDIB=NULL;
	
	// Get length of DIB in bytes for use when reading
	DWORD m_dwBitsSize = file.GetLength()-sizeof(BITMAPFILEHEADER);
	
	// Go read the DIB file header and check if it's valid.
	if(file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
		return NULL;
	
	if (bmfHeader.bfType != DIB_HEADER_MARKER)
		return NULL;
	
	if(file.Read((LPSTR)&BitmapInfo, sizeof(BitmapInfo)) != sizeof(BitmapInfo))
		return NULL;

	if(BitmapInfo.bmiHeader.biBitCount!=24)
	{
		//		MessageBox(NULL,"读取图像文件错误,目前只支持24位真彩色图像。","读取图像文件错误",MB_OK|MB_ICONERROR);
		
		return NULL;
	}
	
	
	DWORD	dwWidth=BitmapInfo.bmiHeader.biWidth;
	DWORD	dwHeight=BitmapInfo.bmiHeader.biHeight;
	DWORD	dwWidthOfByte=WIDTHBYTES(dwWidth*24);
	
	DWORD	dwTemp=dwWidthOfByte*dwHeight+sizeof(BITMAPINFOHEADER);
	if(dwTemp>m_dwBitsSize)
		m_dwBitsSize=dwTemp;
	
	
	DWORD dwDibOffset=bmfHeader.bfOffBits;
	HDIB	hDib = NULL;
	hDib = (HDIB)::GlobalAlloc(GHND/*GMEM_FIXED*/, m_dwBitsSize);
	if(!hDib)
		return NULL;
	// Allocate memory for DIB
//	m_hDIB = (HDIB)::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,m_dwBitsSize );
	//Allocate memory error
//	if (m_hDIB == NULL) return FALSE;
	PBYTE aa = NULL;
	aa =(PBYTE)::GlobalLock(hDib);
	if(!aa)
	{
		GlobalFree(hDib);
		return NULL;
	}
//	memcpy(aa, &bmfHeader, 14);
//	memcpy(aa + 14, &(BitmapInfo->bmiHeader), 40);
	pDIB = aa;
	//Point to BITMAPINFOHEADER structure 
	lpbmi=(LPBITMAPINFOHEADER)pDIB;
	lpbmifo=(LPBITMAPINFO)pDIB;
	
//	m_lpBitmapInfoHeader=(LPBITMAPINFOHEADER)pDIB;
	
	file.Seek(sizeof(BITMAPFILEHEADER),CFile::begin);
	// Go read the bits.
	if(file.ReadHuge(pDIB, m_dwBitsSize)!=m_dwBitsSize)
	{
		BOOL b = ::GlobalUnlock(hDib);
		/*win98下不能使用
		if(!b)
		return IMAGE_ERR_UNLOCK;
		*/
		GlobalFree(hDib);
		
		return NULL;
	}
	
	if(lpbmi->biCompression!=BI_RGB)
	{
		BOOL b = ::GlobalUnlock(hDib);
		/*win98下不能使用
		if(!b)
		return IMAGE_ERR_UNLOCK;
		*/
		GlobalFree(hDib);
		return NULL;
	}
	
	BOOL b = ::GlobalUnlock(hDib);
		/*win98下不能使用
		if(!b)
		return IMAGE_ERR_UNLOCK;
		*/
	return hDib;
}
//从JPG文件中获得DIB
HDIB CMyImage::LoadDibJPG(CString FileName)
{
	if(FileName.IsEmpty())
		return NULL;
	HGLOBAL h = NULL;
	h = ::LoadJPG(LPCTSTR(FileName));
	if(h==NULL)
		return NULL;

	PBYTE lp = NULL;
	DWORD dwSize = GlobalSize(h);
	lp = (LPBYTE)::GlobalLock(h);
	if(!lp)
	{
		GlobalFree(h);
		return NULL;
	}
	HDIB hDib = NULL;
	hDib = (HDIB)::GlobalAlloc(GHND/*GMEM_FIXED*/, dwSize - 14);
	if(!hDib)
		return NULL;
	PBYTE lpd = NULL;
	lpd = (PBYTE)::GlobalLock(hDib);
	if(!lpd)
	{
		GlobalUnlock(h);
		GlobalFree(h);
		return NULL;
	}
	memcpy(lpd, lp + 14, dwSize -14);
	BOOL b = ::GlobalUnlock(h);
	b = GlobalUnlock(hDib);
			/*win98下不能使用
		if(!b)
		return IMAGE_ERR_UNLOCK;
		*/
	
	
	return hDib;
}

//从文件获得DDB位图
HBITMAP CMyImage::LoadDDB(CString FileName)
{
	if(FileName.IsEmpty())
		return NULL;
	HDIB h = NULL;
	h =LoadDIB(FileName);
	if(!h)
		return NULL;
	HBITMAP hBitmap = NULL;
	hBitmap = DIBtoDDB(h);
	if(!hBitmap)
	{
		GlobalFree(h);
		return NULL;
	}
	return hBitmap;
}

BOOL CMyImage::GetBih(HDIB hDib, int &width, int &height, int &bitscount)
{
	width=0;
	height=0;
	bitscount=24;
	if(!hDib)
		return FALSE;
	PBYTE lp = NULL;
	lp = (PBYTE)GlobalLock(hDib);
	if(!lp)
	{
		return FALSE;
	}
	LPBITMAPINFOHEADER lpbih = (LPBITMAPINFOHEADER)lp;
	width = lpbih->biWidth;
	height = lpbih->biHeight;
	bitscount = lpbih->biBitCount;
	BOOL b = GlobalUnlock(hDib);
	return TRUE;
}

BOOL CMyImage::GetBih(HBITMAP hBitmap, int &width, int &height, int &bitscount)
{
	width = 0;height=0;bitscount=24;
	if(!hBitmap)
		return FALSE;
	BITMAP bitmap;
 	
	// 计算位图文件每个像素所占字节数
	::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
    width = bitmap.bmWidth;
	height = bitmap.bmHeight;
	bitscount = bitmap.bmBitsPixel;
	return TRUE;
	
}

//复制MyImage对象
CMyImage* CMyImage::CopyImage(CMyImage *pImage)
{
	if(!pImage)
		return NULL;
	DWORD dwSize = 0;
	dwSize = GetImageSize(pImage);
	IMAGE_ERROR err=IMAGE_OK;
	PBYTE ld=NULL, ls=NULL;
	if(dwSize > 0 )
	{
		CMyImage* Image = new CMyImage();
		if(!Image)
			return NULL;
		err = Image->CreateObject(dwSize);
		if(err != IMAGE_OK)
			return NULL;
		ls = (PBYTE)::GlobalLock(pImage->hImage);
		if(!ls)
		{
			delete Image;
			Image = NULL;
			return NULL;
		}
		ld = (PBYTE)::GlobalLock(Image->hImage);
		if(!ld)
		{
			delete Image;
			Image = NULL;
			GlobalUnlock(pImage->hImage);
			return NULL;
		}
		memcpy(ld, ls, dwSize);
		GlobalUnlock(Image->hImage);
		GlobalUnlock(pImage->hImage);
		return Image;
	}
	else
		return NULL;
}

//获取MyImage对象的大小
DWORD CMyImage::GetImageSize(CMyImage* pImage)
{
	if(!hImage)
		return 0;
	DWORD dwSize = GlobalSize(hImage);
	return dwSize;
}

//复制DIB位图
HDIB CMyImage::CopyDIB(HDIB hDib)
{
	if(!hDib)
		return NULL;
	DWORD dwSize = GlobalSize(hDib);
	HDIB h = NULL;
	h = (HDIB)::GlobalAlloc(GHND/*GMEM_FIXED*/, dwSize);
	if(!h)
		return NULL;
	PBYTE ls=NULL,ld=NULL;
	ls = (PBYTE)::GlobalLock(hDib);
	if(!ls)
	{
		return NULL;
	}
	ld = (PBYTE)::GlobalLock(h);
	if(!ld)
	{
		::GlobalUnlock(hDib);
		::GlobalFree(h);
		return NULL;
	}
	memcpy(ld, ls, dwSize);
	GlobalUnlock(hDib);
	GlobalUnlock(h);
	return h;
}

⌨️ 快捷键说明

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