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

📄 myimage.cpp

📁 电子监控的网络编程实例
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	
//	GlobalReAlloc(hDib,dwDIBSize,GMEM_MODIFY);
	LPVOID pS=GlobalLock(tmpHDIB);
	if(!pS)
	{
		GlobalFree(tmpHDIB);
		return;	
	}
	LPVOID pD=GlobalLock(hImage);
	if(!pS){
		GlobalUnlock(tmpHDIB);
		GlobalFree(tmpHDIB);
		return;
	}
	if (start<widths )
		widths=start;
	int heights=sz.cy;
	//	if(text2.GetLength()>1)
	//		heights=2*sz.cy;
	//	for(int i=99;i>99-heights;i--)
	//		memcpy(LPBYTE(pD)+40+(h-1-(99-i))*start/*+start-300*3*/,LPBYTE(pS)+40+i*720*3/*+(720-300)*3*/,widths);
	for(int i=sz.cy-1;i>0;i--)
		memcpy(LPBYTE(pD)+54+(h-1-i)*start/*+start-300*3*/,LPBYTE(pS)+40+(99-i)*dibWidth*3/*+(720-300)*3*/,widths);
	if(widths2>0)
	{
		if(start<widths2)
			widths2=start;
		for(int i=sz.cy*2-1;i>sz.cy;i--)
			memcpy(LPBYTE(pD)+54+(h-1-i)*start/*+start-300*3*/,LPBYTE(pS)+40+(99-i)*dibWidth*3/*+(720-300)*3*/,widths2);
	}
	
	if(hBitmap)
	{
		//绘制号牌图片
		HDIB tmpHDIB2 = DDBtoDIB(hBitmap, NULL);
		if(!tmpHDIB2)
		{
			GlobalUnlock(tmpHDIB);
			GlobalUnlock(hImage);
			GlobalFree(tmpHDIB);
			return;
		}
		PBYTE ph = NULL;
		ph = (PBYTE)::GlobalLock(tmpHDIB2);
		if(!ph)
		{
			GlobalUnlock(tmpHDIB);
			GlobalUnlock(hImage);
			GlobalFree(tmpHDIB);
			GlobalFree(tmpHDIB2);
			return;
		}
		int cx=0,cy=0;
		LPBITMAPINFOHEADER lp = (LPBITMAPINFOHEADER)ph;
		cx = lp->biWidth;
		cy = lp->biHeight;
		
		if (cx + xstart>dibWidth)
			cx = dibWidth - xstart;
		if (cy + ystart>dibHeight)
			cy = dibHeight - ystart;
		for(i=0;i<cy;i++)	
			memcpy(LPBYTE(pD)+54+(dibHeight-ystart-cy+i)*start+xstart*3, LPBYTE(ph)+40+ (lp->biHeight-cy+i)*lp->biWidth*3 , cx * 3);  
			//	memcpy(pD,pS,dwDIBSize);
		GlobalUnlock(tmpHDIB2);
		GlobalFree(tmpHDIB2);
	}	
	GlobalUnlock(tmpHDIB);
	GlobalUnlock(hImage);
	GlobalFree(tmpHDIB);
}

IMAGE_ERROR CMyImage::SaveImage(CString FileName, int nQulity)
{
	ASSERT(!FileName.IsEmpty());
	if(FileName.IsEmpty())
		return IMAGE_ERR_NOFILENAME;
	if(!hImage)
		return IMAGE_NULL;
	IMAGE_ERROR err = IMAGE_OK;
	
	CFile file;
	CFileException fe;	
	
	CString m_strName=FileName;
	CString m_strFileExt=FileName.Right(3);
	m_strFileExt.MakeUpper();
	if(m_strFileExt=="BMP")
	{
		//	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(FileName, CFile::modeCreate | CFile::modeWrite |CFile::shareDenyNone, &fe))
		{
			//	fe.ReportError();
			
			return IMAGE_ERR_WRITEFILE;
		}
		
		TRY
		{
			IMAGE_ERROR err = SaveImage(file);
			if(err != IMAGE_OK)
				return err;
		}
		CATCH (CFileException, eLoad)
		{
			file.Abort(); // will not throw an exception
			return IMAGE_ERR_WRITEFILE;
		}
		END_CATCH
	}
	else if(m_strFileExt=="JPG")
	{
		if (nQulity<10 || nQulity>100)
			nQulity = 40;
		err = SaveJPG(FileName, nQulity);
		if(err!=IMAGE_OK)
			return err;
	}
	else
	{
		return IMAGE_ERR_NOTSUPPORTFILE;
	}
		
	return IMAGE_OK;
}
//保存Image到文件CFile
IMAGE_ERROR CMyImage::SaveImage(CFile &file)
{
	if (!hImage)
		return IMAGE_NULL;
	// Write the file header
	DWORD dwSize = GlobalSize(hImage);
	PBYTE ps = (PBYTE) GlobalLock(hImage);
	if ( !ps )
		return IMAGE_ERR_LOCK;
	TRY
	{	
		file.WriteHuge(ps, dwSize);
	}

	CATCH (CFileException, e)
	{
		BOOL b = ::GlobalUnlock(hImage);
		/*win98下禁用
		if(!p)
		return IMAGE_ERR_UNLOCK;
		*/
		return IMAGE_ERR_WRITEFILE;
		THROW_LAST();
	}
	END_CATCH
		
	BOOL b = ::GlobalUnlock(hImage);
		/*win98下禁用
		if(!p)
		return IMAGE_ERR_UNLOCK;
		*/
	return IMAGE_OK;	
}

IMAGE_ERROR CMyImage::SaveJPG(CString FileName, int nQulity)
{
	if(FileName.IsEmpty())
		return IMAGE_ERR_NOFILENAME;
	if (::SaveJPG(FileName.GetBuffer(0), hImage ,nQulity))
		return IMAGE_OK;
	else
		return IMAGE_ERR_IMAGELOAD_SAVE;
}

HDIB CMyImage::GetDIB()
{
	if(!hImage)
		return NULL;
	HDIB hDib = NULL;
	DWORD dwSize = GlobalSize(hImage);
	hDib = (HDIB)::GlobalAlloc(GHND/*GMEM_FIXED*/, dwSize - 14);
	if(!hDib)
		return NULL;
	PBYTE ps=NULL,pd=NULL;
	ps = (PBYTE)GlobalLock(hImage);
	if(!ps)
	{
		GlobalFree(hDib);
		hDib=NULL;
		return NULL;
	}
	pd = (PBYTE)GlobalLock(hDib);
	if(!pd)
	{
		BOOL b = GlobalUnlock(hImage);
				/*win98下禁用
		if(!p)
		return IMAGE_ERR_UNLOCK;
		*/
		GlobalFree(hDib);
		hDib=NULL;
		return NULL;
	}
	memcpy(pd, ps+14, dwSize -14);
	BOOL b = GlobalUnlock(hImage);
				/*win98下禁用
		if(!p)
		return IMAGE_ERR_UNLOCK;
		*/
	b = GlobalUnlock(hDib);
				/*win98下禁用
		if(!b)
		return IMAGE_ERR_UNLOCK;
		*/
	return hDib;
}

HBITMAP CMyImage::GetDDB()
{
	HDIB hDib = NULL;
	hDib = GetDIB();
	if(!hDib)
		return NULL;
	HBITMAP hBitmap = NULL;
	hBitmap = DIBtoDDB(hDib);
	GlobalFree(hDib);
	return hBitmap;		
}

IMAGE_ERROR CMyImage::GetBuf(PBYTE pImage, DWORD &dwSize, int iMode)
{
	if(!hImage)
		return IMAGE_NULL;
	DWORD dwGlobal = 0;
	PBYTE lp = NULL;
	BOOL b = FALSE;
	switch(iMode) {
	case 0:
		dwGlobal = GlobalSize(hImage);
		if(dwSize != dwGlobal)
			return IMAGE_ERR_SIZE;
		lp = (PBYTE)GlobalLock(hImage);
		if(!lp)
			return IMAGE_ERR_LOCK;
		memcpy(pImage, lp, dwSize);
		b = GlobalUnlock( hImage );
				/*win98下禁用
		if(!b)
		return IMAGE_ERR_UNLOCK;
		*/
		break;
	case 1:
		dwGlobal = GlobalSize(hImage);
		if(dwSize + 14 != dwGlobal)
			return IMAGE_ERR_SIZE;
		lp = (PBYTE)GlobalLock(hImage);
		if(!lp)
			return IMAGE_ERR_LOCK;
		memcpy(pImage, lp+14, dwSize);
		b = GlobalUnlock( hImage );
				/*win98下禁用
		if(!b)
		return IMAGE_ERR_UNLOCK;
		*/
		break;
	default:
		dwGlobal = GlobalSize(hImage);
		if(dwSize + 54 != dwGlobal)
			return IMAGE_ERR_SIZE;
		lp = (PBYTE)GlobalLock(hImage);
		if(!lp)
			return IMAGE_ERR_LOCK;
		memcpy(pImage, lp + 54, dwSize);
		b = GlobalUnlock( hImage );
		/*win98下禁用
		if(!b)
		return IMAGE_ERR_UNLOCK;
		*/
	}
	return IMAGE_OK;
}

void CMyImage::DdbAdd(HBITMAP &hDib, CString text, CString text2, LPLOGFONT plf, HBITMAP hBitmap, int xstart, int ystart)
{
	if(!hDib)
		return;

	LOGFONT lf;
	if(!plf)
	{
		::ZeroMemory(&lf,sizeof(lf));
		lf.lfHeight=160;
		lf.lfWeight=FW_BOLD;
		//	lf.lfItalic=TRUE;
		::lstrcpy(lf.lfFaceName,_T("宋体"));
	}
	else
	{
		memcpy(&lf, plf, sizeof(LOGFONT));
	}

	
	HDC dcMemory;
	HDC pDC=::GetDC(NULL);
	dcMemory=CreateCompatibleDC(pDC);
	CDC* pMemory=new CDC();
	pMemory->Attach(dcMemory);
//	CBitmap bitmap;
//	bitmap.CreateCompatibleBitmap(pMemory,dibWidth,100);
	CBitmap* pOldBitmap =(CBitmap*)::SelectObject(dcMemory,hDib);
	//	::SetBkMode(dcMemory,TRANSPARENT);
	::SetBkColor(dcMemory,RGB(0,0,0));
	::SetTextColor(dcMemory,RGB(255,255,255));
	
	CFont font;
	font.CreatePointFontIndirect(&lf);
	::SelectObject(dcMemory,font.GetSafeHandle());
	CSize sz=pMemory->GetTextExtent(text);
	CSize sz2=pMemory->GetTextExtent(text2);
	DWORD widths=sz.cx*3;
	DWORD widths2=0;
	::TextOut(dcMemory,0,0,text,text.GetLength());
	if(text2.GetLength()>1)
	{
		::TextOut(dcMemory,0,sz.cy,text2,text2.GetLength());
		widths2=sz2.cx*3;
	}
	if(hBitmap)
	{
		BITMAP bitmap;
		::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
		
		HDC dcMemory2 = NULL;
		dcMemory2 = CreateCompatibleDC(pDC);
		::SelectObject(dcMemory2, hBitmap);
		::StretchBlt(dcMemory, xstart, ystart, bitmap.bmWidth, bitmap.bmHeight, dcMemory2, 0, 0, bitmap.bmWidth, bitmap.bmHeight ,SRCCOPY);
		DeleteDC(dcMemory2);	
	}
	
	pMemory->Detach();
	//	ReleaseDC(NULL,dcMemory);
	DeleteDC(dcMemory);
	ReleaseDC(NULL,pDC);
	DeleteDC(pMemory->GetSafeHdc());
	//	ReleaseDC(NULL,pMemory->GetSafeHdc());
	
	delete pMemory;
}

BOOL CMyImage::SaveDIB(HDIB hDib, CString FileName, int nQulity)
{
	ASSERT(!FileName.IsEmpty());
	if(FileName.IsEmpty())
		return FALSE;
	if(!hDib)
		return FALSE;
	
	CFile file;
	CFileException fe;	
	
	CString m_strName=FileName;
	CString m_strFileExt=FileName.Right(3);
	m_strFileExt.MakeUpper();
	if(m_strFileExt=="BMP")
	{
		//	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(FileName, CFile::modeCreate | CFile::modeWrite |CFile::shareDenyNone, &fe))
		{
			//	fe.ReportError();
			
			return FALSE;
		}
		
		TRY
		{
			if(!SaveDIB(hDib, file))
				return FALSE;
		}
		CATCH (CFileException, eLoad)
		{
			file.Abort(); // will not throw an exception
			return FALSE;
		}
		END_CATCH
	}
	else if(m_strFileExt=="JPG")
	{
		if (nQulity<10 || nQulity>100)
			nQulity = 40;
		if(!SaveJPG(hDib, FileName, nQulity))
			return FALSE;
	}
	else
	{
		return FALSE;
	}
	
	return TRUE;
}
//保存DIB 为BMP文件
BOOL CMyImage::SaveDIB(HDIB hDib, CFile &file)
{
	if (!hDib)
		return FALSE;
	BITMAPFILEHEADER bfh;
	memset(&bfh, 0, sizeof(bfh));
	bfh.bfType = 'MB';
	bfh.bfOffBits = 54;
	bfh.bfSize = GlobalSize(hDib)+14;
	// Write the file header
	DWORD dwSize = bfh.bfSize - 14;
	PBYTE ps = (PBYTE) GlobalLock(hDib);
	if ( !ps )
		return FALSE;
	TRY
	{	file.Write(&bfh, 14);
		file.WriteHuge(ps, dwSize);
	}

	CATCH (CFileException, e)
	{
		BOOL b = ::GlobalUnlock(hDib);
		/*win98下禁用
		if(!p)
		return IMAGE_ERR_UNLOCK;
		*/
		return FALSE;
		THROW_LAST();
	}
	END_CATCH
		
	BOOL b = ::GlobalUnlock(hDib);
		/*win98下禁用
		if(!b)
		return FALSE;
		*/
	return TRUE;	
}
//保存 DIB为JPG文件
BOOL CMyImage::SaveJPG(HDIB hDib, CString FileName, int nQulity)
{
	if(FileName.IsEmpty())
		return FALSE;
	if(!hDib)
		return FALSE;
	HGLOBAL h = NULL;
	DWORD dwSize = GlobalSize(hDib);
	h = ::GlobalAlloc(GHND/*GMEM_FIXED*/, dwSize + 14);
	if(!h)
		return FALSE;
	PBYTE ps=NULL,pd=NULL;
	pd=(PBYTE)GlobalLock(h);
	if(!pd)
	{
		GlobalFree(h);
		return FALSE;
	}
	ps=(PBYTE)GlobalLock(hDib);
	if(!ps)
	{
		GlobalUnlock(h);
		GlobalFree(h);
		return FALSE;
	}
	BITMAPFILEHEADER bfh;
	memset(&bfh, 0, sizeof(bfh));
	bfh.bfType = 'MB';
	bfh.bfOffBits = 54;
	bfh.bfSize = dwSize + 14;
	memcpy(pd, &bfh, sizeof(bfh));
	memcpy(pd + 14, ps, dwSize);
	GlobalUnlock(h);
	if(!(::SaveJPG(FileName.GetBuffer(0), h, nQulity)))
	{
		GlobalFree(h);
		return FALSE;
	}
	GlobalFree(h);
	return TRUE;
}

BOOL CMyImage::SaveDDB(HBITMAP hBitmap, CString FileName, int nQulity)
{
	ASSERT(!FileName.IsEmpty());
	if(FileName.IsEmpty())
		return FALSE;
	if(!hBitmap)
		return FALSE;
	HDIB hDib = NULL;
	hDib = DDBtoDIB(hBitmap);
	if(!hDib)
		return FALSE;
	if(!SaveDIB(hDib, FileName, nQulity))
	{
		GlobalFree(hDib);
		return FALSE;
	}
	GlobalFree(hDib);
	return TRUE;

}
//绘制Image对象
IMAGE_ERROR CMyImage::DrawImage(HDC hDC, CRect sRect, CRect dRect)
{
	LPBYTE	lp=NULL;
	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 (!hImage)
		return IMAGE_NULL;
	// Lock down the DIB, and get a pointer to the beginning of the bit
	//   buffer
	lp  = (LPBYTE)::GlobalLock(hImage);
	if(!lp)

⌨️ 快捷键说明

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