为什么小弟我保存的bmp图像中一个像素都没有?大家帮忙看看吧,多谢
为什么我保存的bmp图像中一个像素都没有?大家帮忙看看吧,谢谢
共有三个函数与之相关:
CMyDoc::CMyDoc()
{
// 在doc的构造函数里初始化了一个BITMAPINFO
m_pBitmapInfo = (BITMAPINFO *) new BYTE[sizeof(BITMAPINFO)];
m_pBitmapInfo-> bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_pBitmapInfo-> bmiHeader.biPlanes = 1;
m_pBitmapInfo-> bmiHeader.biBitCount = 8;//8位格式
m_pBitmapInfo-> bmiHeader.biCompression = 0;
m_pBitmapInfo-> bmiHeader.biSizeImage = 0;
m_pBitmapInfo-> bmiHeader.biXPelsPerMeter = 0;
m_pBitmapInfo-> bmiHeader.biYPelsPerMeter = 0;
m_pBitmapInfo-> bmiHeader.biClrUsed = 0;
m_pBitmapInfo-> bmiHeader.biClrImportant = 0;
m_pBitmapInfo-> bmiHeader.biWidth = 0;
m_pBitmapInfo-> bmiHeader.biHeight = 0;
}
///从一个采集卡里获得宽度,高度和每行字节数信息,应该没有错,因为图像能够显示。
void CMyDoc::GetBitmapInfo()
{
int SizeX=GetCurrentCamera()-> GetImageWidth();//宽度
int SizeY=GetCurrentCamera()-> GetImageHeight();//高度
int Bitys=GetCurrentCamera()-> GetImageBytes();//每行字节数
m_pBitmapInfo-> bmiHeader.biWidth = Bitys / ( m_pBitmapInfo-> bmiHeader.biBitCount / 8); // Width = Pitch(bytes) divided by the number of bytes per pixel
m_pBitmapInfo-> bmiHeader.biHeight = -SizeY ;
}
//这是一个按钮的相应函数,希望点击后存下图像,图像是存了,可以打开时警告: 图像必须大于一个像素,打开后,里面什么也没有,就是说一个像素都没有存上,为什么呢。
void CMyDoc::OnGrab()
{
int size=0-m_pBitmapInfo-> bmiHeader.biWidth*m_pBitmapInfo-> bmiHeader.biHeight;//因为是8位,就直接相乘了
m_pBitmapInfo-> bmiHeader.biSizeImage = size;
BITMAPFILEHEADER bfh; //这是文件头
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)( 'M ' < < 8)| 'B ');
bfh.bfSize=54+256*sizeof(RGBQUAD)+m_pBitmapInfo-> bmiHeader.biSizeImage;
bfh.bfOffBits=54+256*sizeof(RGBQUAD);
RGBQUAD rgbq[256];
for(int i=0;i <256;i++)
{
rgbq[i].rgbBlue=i;
rgbq[i].rgbGreen=i;
rgbq[i].rgbRed=i;
rgbq[i].rgbReserved=0;
}//从图像采集卡的得到的是裸的8位图像的数据地址,我想以灰度图显示,就自己写了一个颜色板。
CString name = "C:\\picttest.bmp ";
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&m_pBitmapInfo-> bmiHeader,sizeof(BITMAPINFOHEADER));
共有三个函数与之相关:
CMyDoc::CMyDoc()
{
// 在doc的构造函数里初始化了一个BITMAPINFO
m_pBitmapInfo = (BITMAPINFO *) new BYTE[sizeof(BITMAPINFO)];
m_pBitmapInfo-> bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_pBitmapInfo-> bmiHeader.biPlanes = 1;
m_pBitmapInfo-> bmiHeader.biBitCount = 8;//8位格式
m_pBitmapInfo-> bmiHeader.biCompression = 0;
m_pBitmapInfo-> bmiHeader.biSizeImage = 0;
m_pBitmapInfo-> bmiHeader.biXPelsPerMeter = 0;
m_pBitmapInfo-> bmiHeader.biYPelsPerMeter = 0;
m_pBitmapInfo-> bmiHeader.biClrUsed = 0;
m_pBitmapInfo-> bmiHeader.biClrImportant = 0;
m_pBitmapInfo-> bmiHeader.biWidth = 0;
m_pBitmapInfo-> bmiHeader.biHeight = 0;
}
///从一个采集卡里获得宽度,高度和每行字节数信息,应该没有错,因为图像能够显示。
void CMyDoc::GetBitmapInfo()
{
int SizeX=GetCurrentCamera()-> GetImageWidth();//宽度
int SizeY=GetCurrentCamera()-> GetImageHeight();//高度
int Bitys=GetCurrentCamera()-> GetImageBytes();//每行字节数
m_pBitmapInfo-> bmiHeader.biWidth = Bitys / ( m_pBitmapInfo-> bmiHeader.biBitCount / 8); // Width = Pitch(bytes) divided by the number of bytes per pixel
m_pBitmapInfo-> bmiHeader.biHeight = -SizeY ;
}
//这是一个按钮的相应函数,希望点击后存下图像,图像是存了,可以打开时警告: 图像必须大于一个像素,打开后,里面什么也没有,就是说一个像素都没有存上,为什么呢。
void CMyDoc::OnGrab()
{
int size=0-m_pBitmapInfo-> bmiHeader.biWidth*m_pBitmapInfo-> bmiHeader.biHeight;//因为是8位,就直接相乘了
m_pBitmapInfo-> bmiHeader.biSizeImage = size;
BITMAPFILEHEADER bfh; //这是文件头
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)( 'M ' < < 8)| 'B ');
bfh.bfSize=54+256*sizeof(RGBQUAD)+m_pBitmapInfo-> bmiHeader.biSizeImage;
bfh.bfOffBits=54+256*sizeof(RGBQUAD);
RGBQUAD rgbq[256];
for(int i=0;i <256;i++)
{
rgbq[i].rgbBlue=i;
rgbq[i].rgbGreen=i;
rgbq[i].rgbRed=i;
rgbq[i].rgbReserved=0;
}//从图像采集卡的得到的是裸的8位图像的数据地址,我想以灰度图显示,就自己写了一个颜色板。
CString name = "C:\\picttest.bmp ";
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&m_pBitmapInfo-> bmiHeader,sizeof(BITMAPINFOHEADER));