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;j<iWidth;j++)
{
(*p++)=B[t+j];
(*p++)=G[t+j];
(*p++)=R[t+j];
}
for (j=0;j<m;j++) (*p++)=0;
}
}
void CFrameDisplay::Copy_RGB8(unsigned char *Y,int Width,int Height)
{
int i,j,m,t;
LPBYTE p=RGBbuf;
iWidth=Width; iHeight=Height;
BmpInfo->bmiHeader.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;j<iWidth;j++)
(*p++)=Y[t+j];
for (j=0;j<m;j++) (*p++)=0;
}
}
void CFrameDisplay::ShowImage()
{
int x1,y1,x2,y2,winx,winy;
double x,y,zoom;
CRect Rect;
ipWnd->GetDlgItem(inID)->GetClientRect(&amt;Rect);
winx=Rect.right+1; winy=Rect.bottom+1;
x=winx*1.0/iWidth; y=winy*1.0/iHeight;
zoom=x<y?x:y;
if (x<y)
{
x1=0;
y1=(winy-(int)(iHeight*zoom+0.5))/2;
}
else
{
y1=0;
x1=(winx-(int)(iWidth*zoom+0.5))/2;
}
x2=(int)(iWidth*zoom+0.5); y2=(int)(iHeight*zoom+0.5);
CPaintDC pDC(ipWnd->GetDlgItem(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(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
temp=0x36; pfile.Write(&amt;temp,1); temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
temp=0x28; pfile.Write(&amt;temp,1); temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
t=iWidth;
temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=iHeight;
temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
temp=0x01; pfile.Write(&amt;temp,1); temp=0; pfile.Write(&amt;temp,1);
temp=0x18; pfile.Write(&amt;temp,1); temp=0; pfile.Write(&amt;temp,1);
temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
t=(iWidth*3+3)/4*4*iHeight;
temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
temp=(char)0xc4; pfile.Write(&amt;temp,1);
temp=0x0e; pfile.Write(&amt;temp,1);
temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
temp=(char)0xc4; pfile.Write(&amt;temp,1);
temp=0x0e; pfile.Write(&amt;temp,1);
temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;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(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
temp=0x36; pfile.Write(&amt;temp,1); temp=0x04; pfile.Write(&amt;temp,1); temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
temp=0x28; pfile.Write(&amt;temp,1); temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
t=iWidth;
temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=iHeight;
temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
temp=0x01; pfile.Write(&amt;temp,1); temp=0; pfile.Write(&amt;temp,1);
temp=0x08; pfile.Write(&amt;temp,1); temp=0; pfile.Write(&amt;temp,1);
temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
t=(iWidth+3)/4*4*iHeight;
temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
t=t/256; temp=t>256; pfile.Write(&amt;temp,1);
temp=(char)0xc4; pfile.Write(&amt;temp,1);
temp=0x0e; pfile.Write(&amt;temp,1);
temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
temp=(char)0xc4; pfile.Write(&amt;temp,1);
temp=0x0e; pfile.Write(&amt;temp,1);
temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
temp=0; pfile.Write(&amt;temp,1); temp=1; pfile.Write(&amt;temp,1); temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
temp=0; pfile.Write(&amt;temp,1); temp=1; pfile.Write(&amt;temp,1); temp=0; pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
for (t=0;t<256;t++)
{
temp=(char)t;
pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1); pfile.Write(&amt;temp,1);
temp=0;
pfile.Write(&amt;temp,1);
}
t=(iWidth+3)/4*4*iHeight;
pfile.Write(RGBbuf,t);
pfile.Close();
}