关于bmp文件的显示?高手请进! 用File|Open打开一个bmp文件,显示在客户区是不是有两中方法:1)用API函数loadimage和BitBlt函数2)直接对bmp解码请高手能不能把二种方法具体到细节都贴出来,有没有源程序(只关于bmp的)?thx........ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.显示磁盘上的外部BMP文件 { HBITMAP bitmap; /////读取位图文件SAMPLE.BMP bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"SAMPLE.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); ASSERT(bitmap); HBITMAP OldBitmap; CDC MemDC;CRect rect; MemDC.CreateCompatibleDC(&dc); GetClientRect(rect); OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap); ///显示它 dc.BitBlt(20,20,rect.Width()-20,rect.Height()-20,&MemDC,0,0,SRCCOPY); MemDC.SelectObject(OldBitmap); } HBITMAP hBitmap =(HBITMAP)::LoadImage (AfxGetInstanceHandle (), szPathName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE|LR_DEFAULTSIZE); ASSERT (hBitmap != NULL); m_pbmp = new CBitmap(); //m_pbmp=CBitmap::FromHandle(hBitmap); m_pbmp->Attach (hBitmap); BITMAP bm; CDC dcMem; m_pbmp->GetObject(sizeof(bm),(LPVOID)&bm); dcMem.CreateCompatibleDC(pDC); CBitmap *pBmpOld=(CBitmap *)dcMem.SelectObject(m_pbmp); pDC->BitBlt(0,0, ,bm.bmWidth ,bm.bmWidth &dcMem, 0,0, SRCCOPY); dcMem.SelectObject(pBmpOld); 先去了解一下bmp文件的格式他是由40bytes的文件头和图像文件组成DIB格式具体的可以找一个对bmp文件操作的例子 用File|Open可以打开任意个BMP文件,怎么做?这些语句放在OnDraw()中好像显示有问题? 这些语句放在那儿? OnDraw()中吗?还有,我是要用File|Open可以打开任意个bmp文件的? 源程序﹐如下。 CString filename; CFileDialog dlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"BMP(*.bmp)|*.bmp||",NULL); if(dlg.DoModal()==IDOK) { filename=dlg.GetPathName(); } CFile file; if(!file.Open(filename,CFile::modeRead)) { AfxMessageBox("can't open the file."); return; } CDC *pdc; pdc=GetDC(); WORD bfType; DWORD bfSize; DWORD bfOffset; CRect rect; LPBITMAPINFO lpbi32bpp; GetClientRect(&rect); BITMAPINFOHEADER bm_header; file.Read(&bfType,sizeof(WORD)); file.Read(&bfSize,sizeof(DWORD)); file.Seek(2*sizeof(WORD),CFile::current); file.Read(&bfOffset,sizeof(DWORD)); file.Seek(14,CFile::begin); file.Read(&bm_header,sizeof(BITMAPINFOHEADER)); LPBYTE p_BMData,p_BMData1; p_BMData=(BYTE*)new BYTE[bfSize-bfOffset];//should use globalalloc() p_BMData1=(BYTE*)new BYTE[bfSize-bfOffset]; file.Seek(bfOffset,CFile::begin); int m=bfSize-bfOffset; file.ReadHuge(p_BMData,bfSize-bfOffset); int count=0; lpbi32bpp=(LPBITMAPINFO)p_BMData; lpbi32bpp->bmiHeader.biBitCount=bm_header.biBitCount; lpbi32bpp->bmiHeader.biClrImportant=bm_header.biClrImportant; lpbi32bpp->bmiHeader.biClrUsed=bm_header.biClrUsed; lpbi32bpp->bmiHeader.biCompression=bm_header.biCompression; lpbi32bpp->bmiHeader.biHeight=bm_header.biHeight; lpbi32bpp->bmiHeader.biPlanes=bm_header.biPlanes; lpbi32bpp->bmiHeader.biSize=bm_header.biSize; lpbi32bpp->bmiHeader.biSizeImage=bm_header.biSizeImage; lpbi32bpp->bmiHeader.biWidth=bm_header.biWidth; lpbi32bpp->bmiHeader.biXPelsPerMeter=bm_header.biXPelsPerMeter; lpbi32bpp->bmiHeader.biYPelsPerMeter=bm_header.biYPelsPerMeter; for(;count<300;count++) { for(int i=0;i<m;i++) { p_BMData1[i]=p_BMData[i]* count/300; } SetDIBitsToDevice(pdc->m_hDC, 20, 20, bm_header.biWidth, bm_header.biHeight, 0, 0, 0, bm_header.biHeight, p_BMData1, lpbi32bpp, DIB_RGB_COLORS); // Sleep(10); //ValidateRect(&rect); } for(;count>0;count--) { for(int i=0;i<m;i++) { p_BMData1[i]=p_BMData[i]* count/300; lpbi32bpp=(LPBITMAPINFO)p_BMData; lpbi32bpp->bmiHeader.biBitCount=bm_header.biBitCount; lpbi32bpp->bmiHeader.biClrImportant=bm_header.biClrImportant; lpbi32bpp->bmiHeader.biClrUsed=bm_header.biClrUsed; lpbi32bpp->bmiHeader.biCompression=bm_header.biCompression; lpbi32bpp->bmiHeader.biHeight=bm_header.biHeight; lpbi32bpp->bmiHeader.biPlanes=bm_header.biPlanes; lpbi32bpp->bmiHeader.biSize=bm_header.biSize; lpbi32bpp->bmiHeader.biSizeImage=bm_header.biSizeImage; lpbi32bpp->bmiHeader.biWidth=bm_header.biWidth; lpbi32bpp->bmiHeader.biXPelsPerMeter=bm_header.biXPelsPerMeter; lpbi32bpp->bmiHeader.biYPelsPerMeter=bm_header.biYPelsPerMeter; } SetDIBitsToDevice(pdc->m_hDC, 20, 20, bm_header.biWidth, bm_header.biHeight, 0, 0, 0, bm_header.biHeight, p_BMData1, lpbi32bpp, DIB_RGB_COLORS); } delete p_BMData; delete p_BMData1; 文件操作 在中文XPsp2下,能不能开发出英文版软件? C++基础问题:什么叫做名字粉碎(name mangling)? 哈哈!大家好啊,潜水归来,特来放分!!!!!!!!!!!!!! 怎么才能取得一个链接指向的文件名? 关于单片机知识的一个问题 基于对话框的程序中,我加了一个Edit控件,如何改写这个Edit控件的右键菜单~? 如何设combo box的只读性? 哪位高手有图像边界提取的源代码?急!! C#不会这么弱智吧?? 如何在Dlg上添加一个ComboBoxEx?? Controls上面只有ComboBox 想播放一个midi
显示磁盘上的外部BMP文件
{
HBITMAP bitmap;
/////读取位图文件SAMPLE.BMP
bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"SAMPLE.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
ASSERT(bitmap);
HBITMAP OldBitmap;
CDC MemDC;CRect rect;
MemDC.CreateCompatibleDC(&dc);
GetClientRect(rect);
OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap);
///显示它
dc.BitBlt(20,20,rect.Width()-20,rect.Height()-20,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);
}
szPathName, IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION|LR_LOADFROMFILE|LR_DEFAULTSIZE); ASSERT (hBitmap != NULL); m_pbmp = new CBitmap();
//m_pbmp=CBitmap::FromHandle(hBitmap);
m_pbmp->Attach (hBitmap);
BITMAP bm;
CDC dcMem; m_pbmp->GetObject(sizeof(bm),(LPVOID)&bm); dcMem.CreateCompatibleDC(pDC);
CBitmap *pBmpOld=(CBitmap *)dcMem.SelectObject(m_pbmp); pDC->BitBlt(0,0,
,bm.bmWidth
,bm.bmWidth
&dcMem,
0,0,
SRCCOPY); dcMem.SelectObject(pBmpOld);
他是由40bytes的文件头和图像文件组成DIB格式
具体的可以找一个对bmp文件操作的例子
这些语句放在OnDraw()中好像显示有问题?
还有,我是要用File|Open可以打开任意个bmp文件的?
CString filename;
CFileDialog dlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"BMP(*.bmp)|*.bmp||",NULL);
if(dlg.DoModal()==IDOK)
{
filename=dlg.GetPathName();
}
CFile file;
if(!file.Open(filename,CFile::modeRead))
{
AfxMessageBox("can't open the file.");
return;
}
CDC *pdc;
pdc=GetDC();
WORD bfType;
DWORD bfSize;
DWORD bfOffset;
CRect rect;
LPBITMAPINFO lpbi32bpp;
GetClientRect(&rect);
BITMAPINFOHEADER bm_header;
file.Read(&bfType,sizeof(WORD));
file.Read(&bfSize,sizeof(DWORD));
file.Seek(2*sizeof(WORD),CFile::current);
file.Read(&bfOffset,sizeof(DWORD));
file.Seek(14,CFile::begin);
file.Read(&bm_header,sizeof(BITMAPINFOHEADER));
LPBYTE p_BMData,p_BMData1;
p_BMData=(BYTE*)new BYTE[bfSize-bfOffset];//should use globalalloc()
p_BMData1=(BYTE*)new BYTE[bfSize-bfOffset];
file.Seek(bfOffset,CFile::begin);
int m=bfSize-bfOffset;
file.ReadHuge(p_BMData,bfSize-bfOffset);
int count=0;
lpbi32bpp=(LPBITMAPINFO)p_BMData;
lpbi32bpp->bmiHeader.biBitCount=bm_header.biBitCount;
lpbi32bpp->bmiHeader.biClrImportant=bm_header.biClrImportant;
lpbi32bpp->bmiHeader.biClrUsed=bm_header.biClrUsed;
lpbi32bpp->bmiHeader.biCompression=bm_header.biCompression;
lpbi32bpp->bmiHeader.biHeight=bm_header.biHeight;
lpbi32bpp->bmiHeader.biPlanes=bm_header.biPlanes;
lpbi32bpp->bmiHeader.biSize=bm_header.biSize;
lpbi32bpp->bmiHeader.biSizeImage=bm_header.biSizeImage;
lpbi32bpp->bmiHeader.biWidth=bm_header.biWidth;
lpbi32bpp->bmiHeader.biXPelsPerMeter=bm_header.biXPelsPerMeter;
lpbi32bpp->bmiHeader.biYPelsPerMeter=bm_header.biYPelsPerMeter;
for(;count<300;count++)
{
for(int i=0;i<m;i++)
{
p_BMData1[i]=p_BMData[i]* count/300;
}
SetDIBitsToDevice(pdc->m_hDC,
20,
20,
bm_header.biWidth,
bm_header.biHeight,
0,
0,
0,
bm_header.biHeight,
p_BMData1,
lpbi32bpp,
DIB_RGB_COLORS);
// Sleep(10);
//ValidateRect(&rect);
}
for(;count>0;count--)
{
for(int i=0;i<m;i++)
{
p_BMData1[i]=p_BMData[i]* count/300;
lpbi32bpp=(LPBITMAPINFO)p_BMData;
lpbi32bpp->bmiHeader.biBitCount=bm_header.biBitCount;
lpbi32bpp->bmiHeader.biClrImportant=bm_header.biClrImportant;
lpbi32bpp->bmiHeader.biClrUsed=bm_header.biClrUsed;
lpbi32bpp->bmiHeader.biCompression=bm_header.biCompression;
lpbi32bpp->bmiHeader.biHeight=bm_header.biHeight;
lpbi32bpp->bmiHeader.biPlanes=bm_header.biPlanes;
lpbi32bpp->bmiHeader.biSize=bm_header.biSize;
lpbi32bpp->bmiHeader.biSizeImage=bm_header.biSizeImage;
lpbi32bpp->bmiHeader.biWidth=bm_header.biWidth;
lpbi32bpp->bmiHeader.biXPelsPerMeter=bm_header.biXPelsPerMeter;
lpbi32bpp->bmiHeader.biYPelsPerMeter=bm_header.biYPelsPerMeter;
}
SetDIBitsToDevice(pdc->m_hDC,
20,
20,
bm_header.biWidth,
bm_header.biHeight,
0,
0,
0,
bm_header.biHeight,
p_BMData1,
lpbi32bpp,
DIB_RGB_COLORS);
}
delete p_BMData;
delete p_BMData1;