请教:
BOOL CCaptureVideo::SaveBitmap(BYTE * pBuffer, long lBufferSize )
{
HANDLE hf = CreateFile(
m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, NULL, NULL );
if( hf == INVALID_HANDLE_VALUE ) return 0;
// 写文件头
BITMAPFILEHEADER bfh;
memset( &bfh, 0, sizeof( bfh ) );
bfh.bfType = 'MB';
bfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER );
bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );
DWORD dwWritten = 0;
WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );
// 写位图格式
BITMAPINFOHEADER bih;
memset( &bih, 0, sizeof( bih ) );
bih.biSize = sizeof( bih );
// bih.biWidth = lWidth;
// bih.biHeight = lHeight;
bih.biWidth = 281; //自己硬写的
bih.biHeight = 234; //自己硬写的
bih.biPlanes = 1;
bih.biBitCount = 32;
WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );
// 写位图数据
WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );
CloseHandle( hf );
return 0;
}
在程序中:
从摄像头取得数据 buffer0
我这样调用 SaveBitmap(buffer0, 281*234*4);
如果介质是硬盘,那么可以生成清晰的 .bmp 图片,
如果介质为 CF 卡,则生成的 .bmp 很模糊,
各位大哥,这要怎么处理?我们使用的介质是 CF 卡 啊!
是不是我这个生成图片的函数不行?
还是别的原因?
谢谢!
BOOL CCaptureVideo::SaveBitmap(BYTE * pBuffer, long lBufferSize )
{
HANDLE hf = CreateFile(
m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, NULL, NULL );
if( hf == INVALID_HANDLE_VALUE ) return 0;
// 写文件头
BITMAPFILEHEADER bfh;
memset( &bfh, 0, sizeof( bfh ) );
bfh.bfType = 'MB';
bfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER );
bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );
DWORD dwWritten = 0;
WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );
// 写位图格式
BITMAPINFOHEADER bih;
memset( &bih, 0, sizeof( bih ) );
bih.biSize = sizeof( bih );
// bih.biWidth = lWidth;
// bih.biHeight = lHeight;
bih.biWidth = 281; //自己硬写的
bih.biHeight = 234; //自己硬写的
bih.biPlanes = 1;
bih.biBitCount = 32;
WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );
// 写位图数据
WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );
CloseHandle( hf );
return 0;
}
在程序中:
从摄像头取得数据 buffer0
我这样调用 SaveBitmap(buffer0, 281*234*4);
如果介质是硬盘,那么可以生成清晰的 .bmp 图片,
如果介质为 CF 卡,则生成的 .bmp 很模糊,
各位大哥,这要怎么处理?我们使用的介质是 CF 卡 啊!
是不是我这个生成图片的函数不行?
还是别的原因?
谢谢!
解决方案 »
- stl的map到底是一个树,还是一个哈希表?
- VC编译错误: fatal error C1189:WINDOWS.H already included. MFC apps must not #include <windows.h>。多谢!!
- 判断磁盘剩余空间问题
- 麻烦下VC版里的星星出来,年龄大些的
- 一个讨论用vc++开发GIS的群,开始征人
- VC中PUCHAR是什么数据类型?DELPHI中可有与些应该的类型呢?
- 如何得知一个页面被分割为几个部分?
- 用Dlg::OnSetCursor()改变鼠标只能在本对话框中有效,请问如何才能使其对屏幕的任何位置有效?
- DLL中开模式对话框后,主程序再开模式对话框,异常。。。
- 在VC中,怎么一个类中有好几个public/private,DECLARE_DYNCREATE宏什么意思?
- 急问:大家能否告诉我一个能免注册下载VC++2008的网址,谢谢
- 我使用retCode=recv((SOCKET)socket,buffer,BUFFER_SIZE,0);内存不断变大时为什么
class CDIB : public CObject
{
public: unsigned char* m_pDib; //从文件中BITMAPINFOHEADER开始直到最后的数据
unsigned char* m_pDibBits; //包含像素数组数据
DWORD m_pSize; //文件中除去BITMAPFILEHEADER外的长度
int m_PaletteEntry; //调色板中颜色表个数
CPalette m_Pal;
BITMAPINFOHEADER* m_pBIH;
RGBQUAD* m_pRQ; //BITMAPINFO结构中的颜色表 CDIB(); BOOL LoadDIB(const char* lpszFileName); //加载DIB文件
BOOL SaveDIB(const char* lpszFileName); //保存DIB文件
BOOL Draw(CDC* pDC,int x,int y,int width,int height); //在指定设备的指定范围内绘制DIB
BOOL SetPalette(CDC* pDC); //应用逻辑调色板 virtual ~CDIB();
};cpp文件实现体为:
CDIB::CDIB()
{
m_pDib=NULL;
}CDIB::~CDIB()
{
if(m_pDib!=NULL)
delete[] m_pDib;
}
// CDIB 成员函数BOOL CDIB::LoadDIB(const char *lpszFileName)
{
CFile file;
if(!file.Open(CString(lpszFileName),CFile::modeRead))
return FALSE;
BITMAPFILEHEADER BFH;
DWORD dwSize=(DWORD)(file.GetLength()-sizeof(BITMAPFILEHEADER));
unsigned char* pDib=new unsigned char[dwSize];
try
{
if(file.Read(&BFH,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER)
|| BFH.bfType!='MB'
|| file.Read(pDib,dwSize)!=dwSize) //如果指定的文件并不是一个合法的DIB
{
delete[] pDib;
return FALSE;
}
}
catch(CFileException* e)
{
e->Delete();
delete[] pDib;
return FALSE;
} if(m_pDib!=NULL)
delete m_pDib; //在读数据之前,先清空原始位图数据 this->m_pSize=dwSize;
this->m_pDib=pDib; this->m_pBIH=(BITMAPINFOHEADER*)m_pDib; //m_pDib所指的结构就是BITMAPINFOHEADER
this->m_pRQ=(RGBQUAD*)&m_pDib[sizeof(BITMAPINFOHEADER)]; //将指针向后移动sizeof(BITMAPINFOHEADER)的长度,那么它指向了颜色表 int count=1<<m_pBIH->biBitCount; //计算位图颜色深度
m_PaletteEntry=count;
if(m_pBIH->biBitCount>8)
{
m_PaletteEntry=0;
}
else if(m_pBIH->biClrUsed!=0)
{
m_PaletteEntry=m_pBIH->biClrUsed;
} if(m_Pal.GetSafeHandle()!=NULL)
this->m_Pal.DeleteObject(); //在设置调色板前,将其句柄清空 m_pDibBits=&m_pDib[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*m_PaletteEntry];//将指针向后移动sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*m_PaletteEntry的长度,那么它指向了像素的数组
if(m_PaletteEntry>0) //如果位图使用了调色板,则需要设置调色板
{
LPLOGPALETTE lpLogPal;
lpLogPal=(LPLOGPALETTE)malloc(sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*m_PaletteEntry);
lpLogPal->palVersion=0x300;
lpLogPal->palNumEntries=m_PaletteEntry;
for(int i=0;i<m_PaletteEntry;i++)
{
lpLogPal->palPalEntry[i].peBlue=m_pRQ[i].rgbBlue;
lpLogPal->palPalEntry[i].peGreen=m_pRQ[i].rgbGreen;
lpLogPal->palPalEntry[i].peRed=m_pRQ[i].rgbRed;
}
m_Pal.CreatePalette(lpLogPal);
delete[] lpLogPal;
}
return TRUE;}BOOL CDIB::SaveDIB(const char *lpszFileName)
{
if(m_pDib==NULL) //如果位图数据为空,则退出
return FALSE; CFile file;
if(!file.Open(CString(lpszFileName),CFile::modeWrite|CFile::modeCreate))//如果文件路径非法,则退出
return FALSE;
try
{
BITMAPFILEHEADER bfh;
memset(&bfh,0,sizeof(BITMAPFILEHEADER));
bfh.bfReserved1=0;
bfh.bfReserved2=0;
bfh.bfSize=sizeof(BITMAPFILEHEADER)+m_pSize; //赋值图片文件的尺寸
bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+m_PaletteEntry*sizeof(RGBQUAD)+sizeof(BITMAPINFOHEADER);//赋予文件头到像素数组之间的偏移量
bfh.bfType='MB';
file.Write(&bfh,sizeof(BITMAPFILEHEADER));//写入BITMAPFILEHEADER结构
file.Write(m_pDib,m_pSize); //写入BITMAPINFOHEADER+颜色表+像素数据 }
catch(CFileException* e)
{
e->Delete();
return FALSE;
}
return TRUE;
}BOOL CDIB::Draw(CDC *pDC, int x, int y, int width, int height)
{
if(m_pDib==NULL) //如果图片没有数据,则退出
return FALSE; if(width<=0) //将图片的尺寸纠正到合法数值
width=m_pBIH->biWidth;
if(height<=0)
height=m_pBIH->biHeight; ::StretchDIBits(pDC->GetSafeHdc(),x,y, //伸缩DIB位图,用于绘制到目标设备
width,height,
0,0,
m_pBIH->biWidth,m_pBIH->biHeight,
m_pDibBits,
(BITMAPINFO*)m_pBIH,
BI_RGB,
SRCCOPY);
return TRUE;
}BOOL CDIB::SetPalette(CDC *pDC)
{
if(m_pDib==NULL) //如果图片没有数据,则退出
return FALSE; if(m_Pal.GetSafeHandle()==NULL) //如果不存在图片,或者图片不使用调色板,则退出
return FALSE; CPalette* pOldPal=pDC->SelectPalette(&m_Pal,false);
pDC->RealizePalette();
pDC->SelectPalette(pOldPal,false);
return TRUE;
}