从文件中读出图片!!!!!求助 我从别人的软件里看到有个文件,他自定义了扩展名的。不过我知道头几个字节是他自定义的内容,然后就是BM文件格式了,我想知道怎么动态读入内存生成BMP对象,谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 读取前几个字节后跟读普通位图一样啊,申请空间,将后半段读入,然后用BitBlt显示即可 简单封装一个位图类,用于从文件中加载位图文件class CDIB{private: int m_nWidth; int m_nHeight; int m_nBitCount; int m_nPaletteSize; BYTE* m_lpBitmap; BYTE* m_lpBits; BITMAPINFOHEADER* m_lpBMPHdr; RGBQUAD* m_lpPalette; BOOL LoadDib(BYTE* lpDib);public: CDIB(); ~CDIB(); void Clear(); BYTE* GetBits(){return m_lpBits;}; BOOL IsEmpty(){return !m_lpBits;} BOOL LoadFromFile(CFile *pf); BOOL LoadFromFile(LPCTSTR filename);}CDIB::CDIB(){ m_lpBitmap=NULL; m_lpBits=NULL; m_lpPalette=NULL; m_lpBMPHdr=NULL; m_nWidth=m_nHeight=0; m_nBitCount=0;}CDIB::~CDIB(){ Clear();}void CDIB::Clear(){ if (m_lpBitmap) delete[] m_lpBits; m_sErr=""; m_lpBits=NULL; m_lpBMPHdr=NULL; m_lpPalette=NULL; m_nWidth=m_nHeight=0; m_nBitCount=0;}BOOL CDIB::LoadFromFile(LPCTSTR filename){ CFile f; if (!f.Open(filename,CFile::modeRead)) return FALSE; BOOL r=LoadFromFile(&f); f.Close(); return r;}BOOL CDIB::LoadFromFile(CFile *pf){ BYTE* lpDib; BITMAPFILEHEADER* pFileHdr=NULL; int nLen; nLen=pf->GetLength(); m_lpBitmap=new BYTE[nLen]; pf->Read(m_lpBitmap,nLen); pFileHdr=(BITMAPFILEHEADER*)m_lpBitmap; if(pFileHdr->bfSize!=nLen) { delete[] m_lpBitmap; m_lpBitmap=NULL; return FALSE;; } if (m_lpBitmap[0]!='B'&&m_lpBitmap[1]!='M') { delete[] m_lpBitmap; m_lpBitmap=NULL; return FALSE; } lpDib=m_lpBitmap+sizeof(BITMAPFILEHEADER); m_lpBMPHdr=(BITMAPINFOHEADER*)(lpDib); BOOL ret=LoadDib(lpDib); return ret;}BOOL CDIB::LoadDib(BYTE *lpDib){ BYTE *lpBits; BITMAPINFOHEADER *pInfo; int nWidth,nHeight,nBitCount,nByteWidth; RGBQUAD *pPalette; unsigned int PaletteSize; pInfo=(BITMAPINFOHEADER *)lpDib;//取出位图文件信息,位图第二部分数据 lpBits=lpDib+sizeof(BITMAPINFOHEADER); nWidth=pInfo->biWidth; nHeight=pInfo->biHeight; nBitCount=pInfo->biBitCount; nByteWidth=BYTE_PER_LINE(nWidth,nBitCount); switch (nBitCount) { case 24: m_lpPalette=NULL; m_nPaletteSize=0; m_lpBits=lpBits; break; case 8: case 4: case 1: m_nPaletteSize=PaletteSize=1<<pInfo->biBitCount; if (pInfo->biClrUsed!=0 && pInfo->biClrUsed<PaletteSize) PaletteSize=pInfo->biClrUsed; pPalette=(RGBQUAD *)lpBits; lpBits+=sizeof(RGBQUAD)*PaletteSize;//根据调色板个数定位位图数据段的指针位置 m_lpPalette=pPalette; m_lpBits=lpBits; break; default: m_sErr="无效位图"; return FALSE; } m_nBitCount=nBitCount; m_nWidth=nWidth; m_nHeight=nHeight; return TRUE;} 高分求解,关于自己注册webbrowser下载管理器的问题 visual studio 2010 C++调试配置问题 ocx控件窗口拖放与接收鼠标滚轮消息的问题 关于用VC做一个日历的问题 怎么把BMP图像转换成JPG图像? 怎样实时截获IE当前的url vs.net那样的工具栏是怎么做的? 函数waveInPrepareHeader() vc中的webbrowser控件如何交互? 请问这段系统钩子代码,如何改! 如何改变对话框中控件的字体?哪位高手帮一下忙,不胜感激!!! 为什么dll文件动态加载失败?
class CDIB
{
private:
int m_nWidth;
int m_nHeight;
int m_nBitCount;
int m_nPaletteSize;
BYTE* m_lpBitmap;
BYTE* m_lpBits;
BITMAPINFOHEADER* m_lpBMPHdr;
RGBQUAD* m_lpPalette;
BOOL LoadDib(BYTE* lpDib);
public:
CDIB();
~CDIB();
void Clear();
BYTE* GetBits(){return m_lpBits;};
BOOL IsEmpty(){return !m_lpBits;}
BOOL LoadFromFile(CFile *pf);
BOOL LoadFromFile(LPCTSTR filename);
}CDIB::CDIB()
{
m_lpBitmap=NULL;
m_lpBits=NULL;
m_lpPalette=NULL;
m_lpBMPHdr=NULL;
m_nWidth=m_nHeight=0;
m_nBitCount=0;
}CDIB::~CDIB()
{
Clear();
}
void CDIB::Clear()
{
if (m_lpBitmap) delete[] m_lpBits;
m_sErr="";
m_lpBits=NULL;
m_lpBMPHdr=NULL;
m_lpPalette=NULL;
m_nWidth=m_nHeight=0;
m_nBitCount=0;
}BOOL CDIB::LoadFromFile(LPCTSTR filename)
{
CFile f;
if (!f.Open(filename,CFile::modeRead)) return FALSE;
BOOL r=LoadFromFile(&f);
f.Close();
return r;
}
BOOL CDIB::LoadFromFile(CFile *pf)
{
BYTE* lpDib;
BITMAPFILEHEADER* pFileHdr=NULL;
int nLen;
nLen=pf->GetLength();
m_lpBitmap=new BYTE[nLen];
pf->Read(m_lpBitmap,nLen);
pFileHdr=(BITMAPFILEHEADER*)m_lpBitmap;
if(pFileHdr->bfSize!=nLen)
{
delete[] m_lpBitmap;
m_lpBitmap=NULL;
return FALSE;;
}
if (m_lpBitmap[0]!='B'&&m_lpBitmap[1]!='M')
{
delete[] m_lpBitmap;
m_lpBitmap=NULL;
return FALSE;
}
lpDib=m_lpBitmap+sizeof(BITMAPFILEHEADER);
m_lpBMPHdr=(BITMAPINFOHEADER*)(lpDib);
BOOL ret=LoadDib(lpDib);
return ret;
}
BOOL CDIB::LoadDib(BYTE *lpDib)
{
BYTE *lpBits;
BITMAPINFOHEADER *pInfo;
int nWidth,nHeight,nBitCount,nByteWidth;
RGBQUAD *pPalette;
unsigned int PaletteSize; pInfo=(BITMAPINFOHEADER *)lpDib;//取出位图文件信息,位图第二部分数据
lpBits=lpDib+sizeof(BITMAPINFOHEADER); nWidth=pInfo->biWidth;
nHeight=pInfo->biHeight;
nBitCount=pInfo->biBitCount;
nByteWidth=BYTE_PER_LINE(nWidth,nBitCount);
switch (nBitCount)
{
case 24:
m_lpPalette=NULL;
m_nPaletteSize=0;
m_lpBits=lpBits;
break;
case 8:
case 4:
case 1:
m_nPaletteSize=PaletteSize=1<<pInfo->biBitCount;
if (pInfo->biClrUsed!=0 && pInfo->biClrUsed<PaletteSize) PaletteSize=pInfo->biClrUsed;
pPalette=(RGBQUAD *)lpBits;
lpBits+=sizeof(RGBQUAD)*PaletteSize;//根据调色板个数定位位图数据段的指针位置
m_lpPalette=pPalette;
m_lpBits=lpBits;
break;
default:
m_sErr="无效位图";
return FALSE;
}
m_nBitCount=nBitCount;
m_nWidth=nWidth;
m_nHeight=nHeight;
return TRUE;
}