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();
}