www.pudn.com > NoiseEstimate.rar > FrameDisplay.cpp


#include "StdAfx.h" 
#include "NoiseEstimate.h" 
#include "FrameDisplay.h" 
 
CFrameDisplay::CFrameDisplay(void) 
{ 
} 
 
CFrameDisplay::~CFrameDisplay(void) 
{ 
	GlobalUnlock(hloc); 
	GlobalFree(hloc);   
 
	if (!RGBbuf) free(RGBbuf); 
} 
CFrameDisplay::CFrameDisplay(CWnd *pWnd,int nID) 
{ 
	ipWnd=pWnd; inID=nID; 
 
	hloc = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE,sizeof(BITMAPINFOHEADER) + (sizeof(RGBQUAD) * 256)); 
	BmpInfo = (LPBITMAPINFO) GlobalLock(hloc); 
	HANDLE hloc1; 
	RGBQUAD *argbq; 
	int i=0; 
 
	hloc1 = LocalAlloc(LMEM_ZEROINIT | LMEM_MOVEABLE,(sizeof(RGBQUAD) * 256)); 
	argbq = (RGBQUAD *) LocalLock(hloc1); 
 
	for(i=0;i<256;i++) { 
		argbq[i].rgbBlue=i; 
		argbq[i].rgbGreen=i; 
		argbq[i].rgbRed=i; 
		argbq[i].rgbReserved=0; 
	} 
 
	BmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
	BmpInfo->bmiHeader.biPlanes = 1; 
	BmpInfo->bmiHeader.biBitCount = 24; 
	BmpInfo->bmiHeader.biCompression = 0;//BI_RGB; 
 
	memcpy(BmpInfo->bmiColors, argbq, sizeof(RGBQUAD) * 256); 
	RGBbuf=NULL; 
 
	LocalUnlock(hloc1); 
	LocalFree(hloc1); 
} 
 
void CFrameDisplay::Copy_RGB24(unsigned char *B,unsigned char *G,unsigned char *R,int Width,int Height) 
{ 
	int i,j,m,t; 
	LPBYTE p; 
 
	iWidth=Width; iHeight=Height; 
	BmpInfo->bmiHeader.biWidth = iWidth; 
	BmpInfo->bmiHeader.biHeight = iHeight; 
	BmpInfo->bmiHeader.biBitCount = 24; 
	if (RGBbuf) free(RGBbuf); 
	if (NULL== (RGBbuf = (unsigned char *)malloc((iWidth*3+3)/4*4*iHeight) ) )  
	{ 
		AfxMessageBox("Couldn't allocate memory for RGBbuf\n"); 
		return; 
	} 
 
	p=RGBbuf; 
	m=(4-(iWidth*3)%4)%4; 
	for(i=iHeight;i>0;i--) 
	{ 
		t=(i-1)*iWidth; 
		for (j=0;jbmiHeader.biWidth = iWidth; 
	BmpInfo->bmiHeader.biHeight = iHeight; 
	BmpInfo->bmiHeader.biBitCount = 8; 
	if (RGBbuf) free(RGBbuf); 
	if (NULL== (RGBbuf = (unsigned char *)malloc((iWidth*3+3)/4*4*iHeight) ) )  
	{ 
		AfxMessageBox("Couldn't allocate memory for RGBbuf\n"); 
		return; 
	} 
 
	p=RGBbuf; 
	m=(4-iWidth%4)%4; 
	for(i=iHeight;i>0;i--) 
	{ 
		t=(i-1)*iWidth; 
		for (j=0;jGetDlgItem(inID)->GetClientRect(&Rect); 
	winx=Rect.right+1; winy=Rect.bottom+1; 
	x=winx*1.0/iWidth; y=winy*1.0/iHeight; 
	zoom=xGetDlgItem(inID)); 
	pDC.SetStretchBltMode(STRETCH_DELETESCANS); 
	StretchDIBits(pDC.m_hDC,x1,y1,x2,y2,0,0,iWidth,iHeight, RGBbuf, BmpInfo, DIB_RGB_COLORS,SRCCOPY); 
} 
 
void CFrameDisplay::SaveImage24(CString filename) 
{ 
	char temp; 
	long t; 
	CFile pfile; 
	if (!pfile.Open(filename+".bmp",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary)) 
	{ 
		AfxMessageBox("文件无法建立"); 
		return; 
	} 
 
	pfile.Write("BM",2); 
	t=(iWidth*3+3)/4*4*iHeight+0x36; 
	temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); 
	temp=0x36; pfile.Write(&temp,1); temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); 
	temp=0x28; pfile.Write(&temp,1); temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); 
	t=iWidth; 
	temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=iHeight; 
	temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	temp=0x01; pfile.Write(&temp,1); temp=0; pfile.Write(&temp,1); 
	temp=0x18; pfile.Write(&temp,1); temp=0; pfile.Write(&temp,1); 
	temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); 
	t=(iWidth*3+3)/4*4*iHeight; 
	temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	temp=(char)0xc4; pfile.Write(&temp,1); 
	temp=0x0e; pfile.Write(&temp,1); 
	temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); 
	temp=(char)0xc4; pfile.Write(&temp,1); 
	temp=0x0e; pfile.Write(&temp,1); 
	temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); 
	pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); 
	pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); 
 
	t=(iWidth*3+3)/4*4*iHeight; 
	pfile.Write(RGBbuf,t); 
 
	pfile.Close(); 
} 
 
void CFrameDisplay::SaveImage8(CString filename) 
{ 
	char temp; 
	long t; 
	CFile pfile; 
	if (!pfile.Open(filename+".bmp",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary)) 
	{ 
		AfxMessageBox("文件无法建立"); 
		return; 
	} 
 
	pfile.Write("BM",2); 
	t=(iWidth+3)/4*4*iHeight+0x436; 
	temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); 
	temp=0x36; pfile.Write(&temp,1); temp=0x04; pfile.Write(&temp,1); temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); 
	temp=0x28; pfile.Write(&temp,1); temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); 
	t=iWidth; 
	temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=iHeight; 
	temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	temp=0x01; pfile.Write(&temp,1); temp=0; pfile.Write(&temp,1); 
	temp=0x08; pfile.Write(&temp,1); temp=0; pfile.Write(&temp,1); 
	temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); 
	t=(iWidth+3)/4*4*iHeight; 
	temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	t=t/256; temp=t%256; pfile.Write(&temp,1); 
	temp=(char)0xc4; pfile.Write(&temp,1); 
	temp=0x0e; pfile.Write(&temp,1); 
	temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); 
	temp=(char)0xc4; pfile.Write(&temp,1); 
	temp=0x0e; pfile.Write(&temp,1); 
	temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); 
	temp=0; pfile.Write(&temp,1); temp=1; pfile.Write(&temp,1); temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); 
	temp=0; pfile.Write(&temp,1); temp=1; pfile.Write(&temp,1); temp=0; pfile.Write(&temp,1); pfile.Write(&temp,1); 
 
	for (t=0;t<256;t++) 
	{ 
		temp=(char)t; 
		pfile.Write(&temp,1); pfile.Write(&temp,1); pfile.Write(&temp,1); 
		temp=0; 
		pfile.Write(&temp,1); 
	} 
 
	t=(iWidth+3)/4*4*iHeight; 
	pfile.Write(RGBbuf,t); 
 
	pfile.Close(); 
}