📄 subject_13992.htm
字号:
<p>
序号:13992 发表者:刚刚 发表日期:2002-09-02 12:00:34
<br>主题:请大家看看这段DIB位图文件读取代码,是从书上抄下来的(我总觉得有很大问题)
<br>内容:问题:<BR>1、data[][]内存储的是图形的数据部分么?为什么我修改里面的内容,结果用MakeBmpFile()输出的结果还是一样的??<BR>2、如果data[][]内存储的是图形的数据部分,那m_pDib指向的又是什么? 我没看见m_pDib指向data啊?!<BR><BR>这个困难困扰小弟很久了,请各位帮帮忙看看,指点迷津, 谢谢了!<BR><BR><BR><BR>CDetectorView 内有如下定义:<BR><BR>CPalette m_Palette;<BR>unsigned char * m_pDib ,*m_pDibBits;<BR>DWORD m_dwDibSize;<BR>BITMAPINFOHEADER *m_pDibBits;<BR>RGBQUAD *m_pPalette;<BR>int m_mPaletteEntries;<BR>struct RGBDaya<BR>{<BR> BYTE Blue;<BR> BYTE Green;<BR> BYTE Red;<BR><BR>}<BR>LONG col,row;<BR>RGBData *data[1024];<BR>BOOL m_bit24;<BR><BR>然后有<BR>BOOL CDetectorView::LoadBkpic()<BR>{<BR> CFile cf;<BR> //打开位图<BR> CString path;<BR> GetModuleFileName(NULL,path.GetBuffer(255),255);<BR> path.ReleaseBuffer();<BR> path=path.Left(path.GetLength()-12);<BR> path+="pic_base\\back.dpr";<BR> if (!cf.Open(path,CFile::modeRead))<BR> return(FALSE);<BR> //获得文件大小<BR> DWORD dwDibSize;<BR> dwDibSize=cf.GetLength()-sizeof(BITMAPFILEHEADER);<BR><BR> unsigned char *pDib;<BR> pDib=new unsigned char[dwDibSize];<BR> if (pDib==NULL)<BR> return(FALSE);<BR> BITMAPFILEHEADER BFH;<BR> //读取头文件<BR> if (cf.Read(&BFH,sizeof(BITMAPFILEHEADER))!=<BR> sizeof(BITMAPFILEHEADER)||<BR> BFH.bfType!='MB'||<BR> cf.Read(pDib,dwDibSize)!=dwDibSize)<BR> {<BR> //如果出现错误,释放DIB空间<BR> delete [] pDib;<BR> return(FALSE);<BR> }<BR> //如果类中的位图指针不空,释放它<BR> if (m_pDib!=NULL)<BR> delete m_pDib;<BR> //位图指针和大小赋给成员变量<BR> m_pDib=pDib;<BR> m_dwDibSize=dwDibSize;<BR> m_pBIH=(BITMAPINFOHEADER *)m_pDib;<BR> m_pPalette=(RGBQUAD *)&m_pDib[sizeof(BITMAPINFOHEADER)];<BR> //计算调色板颜色数目<BR> m_nPaletteEntries=1<<m_pBIH->biBitCount;<BR> if(m_pBIH->biBitCount>8)<BR> m_nPaletteEntries=0;<BR> else if (m_pBIH->biClrUsed!=0)<BR> m_nPaletteEntries=m_pBIH->biClrUsed;<BR> //让m_pDibBits指向实际的DIB位数据<BR> m_pDibBits=&m_pDib[sizeof(BITMAPINFOHEADER)+<BR> m_nPaletteEntries*sizeof(RGBQUAD)];<BR> //如果已有一个调色板,释放它<BR> if(m_Palette.GetSafeHandle()!=NULL)<BR> m_Palette.DeleteObject();<BR> //创建调色板<BR> if (m_nPaletteEntries!=0)<BR> {<BR> //分配LOGPALETET结构的存储空间<BR> LOGPALETTE *pLogPal=<BR> (LOGPALETTE *) new char[sizeof(LOGPALETTE)+<BR> m_nPaletteEntries*sizeof(PALETTEENTRY)];<BR> if (pLogPal!=NULL)<BR> {<BR> //设置调色板的版本为0x300<BR> //设置调色板的数目<BR> pLogPal->palVersion=0x300;<BR> pLogPal->palNumEntries=m_nPaletteEntries;<BR> //将RGB值放入每个PALETTENTRY项<BR> for (int i=0;i<m_nPaletteEntries;i++)<BR> {<BR> pLogPal->palPalEntry[i].peRed=m_pPalette[i].rgbRed;<BR> pLogPal->palPalEntry[i].peGreen=m_pPalette[i].rgbGreen;<BR> pLogPal->palPalEntry[i].peBlue=m_pPalette[i].rgbBlue;<BR> }<BR> //创建调色板对象并删除LOGPALETTE的内存<BR> m_Palette.CreatePalette(pLogPal);<BR> delete [] pLogPal;<BR> }<BR> }<BR> //如果是24位位图,设置m_bit24为1,并读入位数据给data数组<BR> if (m_pBIH->biBitCount!=24)<BR> {<BR> AfxMessageBox("The file is not a 24_bit bitmap!");<BR> m_bit24=0;<BR> }<BR> else<BR> m_bit24=1;<BR> col=m_pBIH->biWidth;<BR> row=m_pBIH->biHeight;<BR> DWORD offset=BFH.bfOffBits;<BR> if (m_bit24==1)<BR> {<BR> for (LONG i=0;i<1024;i++)<BR> {<BR> data[i]=new RGBData[1024];<BR> for(LONG j=0;j<1024;j++)<BR> {<BR> data[i][j].Blue=0;<BR> data[i][j].Green=0;<BR> data[i][j].Red=0;<BR> }<BR> }<BR> cf.Seek(offset,CFile::begin);//定位至位数据的开始处<BR><BR> for(LONG y=row-1;y>=0;y--)<BR> cf.Read(data[y],col*3);<BR> cf.Close();<BR> }<BR> return(TRUE);<BR>}<BR><BR><BR><BR>BOOL CDetectorView::MakeBmpFile()<BR>{<BR> if (m_pDib==NULL)<BR> return(FALSE);<BR> CFile cf;<BR> if (!cf.Open(Bmpfile,CFile::modeCreate|CFile::modeWrite))<BR> return(FALSE);<BR> BITMAPFILEHEADER BFH;<BR> memset(&BFH,0,sizeof(BITMAPFILEHEADER));<BR> BFH.bfType='MB';<BR> BFH.bfSize=sizeof(BITMAPFILEHEADER)+m_dwDibSize;<BR> BFH.bfOffBits=sizeof(BITMAPFILEHEADER)+<BR> sizeof(BITMAPINFOHEADER)+<BR> m_nPaletteEntries*sizeof(RGBQUAD);<BR> cf.Write(&BFH,sizeof(BITMAPFILEHEADER));<BR> cf.Write(m_pDib,m_dwDibSize);<BR> return(TRUE);<BR>}
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-09-02 13:48:03
<br>内容: unsigned char *pDib;<BR> pDib=new unsigned char[dwDibSize]; (1)<BR> if (pDib==NULL)<BR> return(FALSE);<BR> BITMAPFILEHEADER BFH;<BR> //读取头文件<BR> if (cf.Read(&BFH,sizeof(BITMAPFILEHEADER))!=<BR> sizeof(BITMAPFILEHEADER)||<BR> BFH.bfType!='MB'||<BR> cf.Read(pDib,dwDibSize)!=dwDibSize) (2)<BR> {<BR> //如果出现错误,释放DIB空间<BR> delete [] pDib;<BR> return(FALSE);<BR> }<BR> 。。。。<BR> m_pDib=pDib; (3)<BR><BR>实际存放图形数据的内存空间在(1)中创建,并在(2)中将读入。pDib中保存了它的地址。在(3)中,将它保存到了类的成员变量m_pDib。<BR><BR>在MakeBmpFile中,实际保存的也是m_pDib指向的数据。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:刚刚 回复日期:2002-09-02 13:57:28
<br>内容:这些我都清楚,MakeBmpFile保存的是m_pDib指向的数据,但是我想知道这跟data[][]数组有什么关系,因为书上所提供的处理函数均是对data[][]里面的东西进行处理,但是我用同样的方法对data里面的数据处理以后,结果就跟没处理过一样, why????<BR>例如以下函数(将图形翻转的):<BR>void CDetectorView::Filecurve()<BR>{<BR> RGBData Tempdata;<BR> for(long y=0;y<row/2;y++)<BR> for (long x=0;x<col;x++)<BR> {<BR> Tempdata=data[y][x];<BR> data[y][x]=data[row-1-y][x];<BR> data[row-1-y][x]=Tempdata;<BR> }<BR> return;<BR>}<BR>对data[][]里面的数据处理没有用,怎么回事,应该怎么解决?我就是不清楚m_pDib跟data[][]的关系,谢谢了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:刚刚 回复日期:2002-09-02 14:10:50
<br>内容:如果说数据不是存放在data[][]里面的,而是在m_pDib所指向的字符串结构里面的话,那如何修改??(比如在该图片上的某一个特定的位置插入一张别的图片)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -