• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

如何在VC使用位图

goldolphin 2000-12-23 04:34:00
各位高手,再请教一个问题:
在VC中,如何从一个BMP文件中读入一个位图(16bit,256bit,16kb,or 16mb)并显示在窗体中(用GDI)?在下没多少分可送,实在不好意思。先行谢过了。
...全文
211 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wuchuncai 2000-12-26
//pDC=GetDC
//File 文件名
//x,y 显示位置
//witdh ,height 想显示的宽高(缩放),width=bi.biWidth...(不缩放)
BOOL BmpRead(CDC *pDC,char *FileName,int x,int y,int width,int height)
{
BITMAPINFOHEADER bi;
int dwOffset;
int i;
CFile OpenFile;
LOGPALETTE *lp;
BYTE PaletteBuffer[1024];
CPalette cp,*OldCp;
BYTE *pBuf;
BITMAPINFO *bf;
if(OpenFile.Open (FileName,CFile::modeRead)==NULL)return FALSE;
OpenFile.Seek(14,CFile::begin);
OpenFile.Read(&bi,40);

if(bi.biSizeImage==0)bi.biSizeImage=(long)bi.biWidth*bi.biHeight*bi.biBitCount/8;

if(bi.biBitCount<=8)
{
lp =(LOGPALETTE *)new BYTE[sizeof(LOGPALETTE) +(int)bi.biClrUsed* sizeof(PALETTEENTRY)];
lp->palVersion=0x300;
lp->palNumEntries=(int)bi.biClrUsed;
OpenFile.Read(PaletteBuffer,(int)bi.biClrUsed*4);
OpenFile.Close();
for (i = 0; i < (int)bi.biClrUsed; i++){
lp->palPalEntry[i].peRed = PaletteBuffer[4*i+2];
lp->palPalEntry[i].peGreen = PaletteBuffer[4*i+1];
lp->palPalEntry[i].peBlue = PaletteBuffer[4*i+0];
lp->palPalEntry[i].peFlags = 0;
}
cp.CreatePalette(lp);
OldCp=pDC->SelectPalette(&cp,FALSE);
pDC->RealizePalette();
}
else
OpenFile.Close();
if(bi.biBitCount<=8)
bf=(BITMAPINFO*)new BYTE[bi.biSize + bi.biClrUsed *4];
else
bf=(BITMAPINFO*)new BYTE[bi.biSize];

OpenFile.Open (FileName, CFile::modeRead);
OpenFile.Seek(14,CFile::begin);

if(bi.biBitCount<=8)
OpenFile.Read(bf,(int)bi.biClrUsed *4+bi.biSize);
else
OpenFile.Read(bf,bi.biSize);
OpenFile.Close();

pBuf=new BYTE[bi.biSizeImage];

OpenFile.Open(FileName,CFile::modeRead);

if(bi.biBitCount<=8)
dwOffset=54+bi.biClrUsed*4;
else
dwOffset=54;
OpenFile.Seek(dwOffset,CFile::begin);
OpenFile.Read(pBuf,bi.biSizeImage);
OpenFile.Close();

x=x+(width-(int)bi.biWidth)/2;
y=y+(height-(int)bi.biHeight)/2;


StretchDIBits(
pDC->m_hDC, // handle to device context
0, // x-coordinate of upper-left corner of dest. rectangle
0, // y-coordinate of upper-left corner of dest. rectangle
width, // width of destination rectangle
height, // height of destination rectangle
0, // x-coordinate of upper-left corner of source rectangle
0, // y-coordinate of upper-left corner of source rectangle
bi.biWidth, // width of source rectangle
bi.biHeight, // height of source rectangle
pBuf, // address of bitmap bits
(BITMAPINFO *)bf, // address of bitmap data
DIB_RGB_COLORS, // usage flags
SRCCOPY // raster operation code

);

if(bi.biBitCount<=8)
{
pDC->SelectPalette(OldCp,FALSE);
cp.DeleteObject();
delete lp;
}
delete pBuf;
delete bf;
return TRUE;
}
回复
zhangyongyue 2000-12-26
哥儿们,看看下面代码,这是打开真彩色位图文件的,如果打开256色等有调色版位图文件,加一个调色板变量即可。
CFile ImageFile;
char *kkkq="myfilename.bmp";

if( !ImageFile.Open(kkkq, CFile::modeRead) )
{
MessageBox("Progress Cancelled");
return ;
}
BITMAPFILEHEADER bmFH;
ImageFile.Read( &bmFH, sizeof(BITMAPFILEHEADER) );
ImageFile.Read( &FileBMPscroll.bmiHeader, sizeof(BITMAPINFOHEADER) );
if( bmFH.bfType != 19778||FileBMPscroll.bmiHeader.biBitCount!=24)
{
MessageBox("不是24bit位图");
EndWaitCursor();
return ;
}
CRect ImageFileRect;
ImageFileRect.left = 0;
ImageFileRect.top = 0;
ImageFileRect.right = FileBMPscroll.bmiHeader.biWidth;
ImageFileRect.bottom = FileBMPscroll.bmiHeader.biHeight;
long bitbyte=(long)(FileBMPscroll.bmiHeader.biBitCount/8);
long dwSize = (long)ImageFileRect.Width() *
(long)ImageFileRect.Height() * bitbyte;
HGLOBAL hDIBscroll = GlobalAlloc(GHND, dwSize);
if( !hDIBscroll)
{
MessageBox("Progress Cancelled");
return ;
}
lpvBitsscroll = (unsigned char *)GlobalLock(hDIBscroll);
CDC *pDC1=GetDC();
pScrnBMPscrolltmp = new CBitmap;
pScrnBMPscrolltmp->CreateCompatibleBitmap(pDC1,ImageFileRect.Width(),ImageFileRect.Height());
pSmemdcscrolltmp = new CDC;
pSmemdcscrolltmp->CreateCompatibleDC(pDC1);
pSmemdcscrolltmp->SelectObject(pScrnBMPscrolltmp);
ImageFile.Read( lpvBitsscroll, dwSize );
ImageFile.Close();
rkscroll.left=255;
rkscroll.top=0;
rkscroll.right=rkscroll.left+FileBMPscroll.bmiHeader.biWidth;
rkscroll.bottom=0;
BitBlt
(
(HDC) *pDC1, // handle to destination DC
0, // x-coord of destination upper-left corner
0, // y-coord of destination upper-left corner
ImageFileRect.Width(), // width of destination rectangle
ImageFileRect.Height(),// height of destination rectangle
(HDC)* pSmemdcscrolltmp, // handle to source DC
255, // x-coordinate of source upper-left corner
0, // y-coordinate of source upper-left corner
SRCCOPY // raster operation code
);
ReleaseDC(pDC1);
回复
panda_w 2000-12-25
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);
回复
goldolphin 2000-12-25
谢过各位了.
回复
mousubin 2000-12-23
你可以用LoadImage直接从文件中读入位图,另外CImageList类可以让你很方便的显示在窗口中,包括直接显示或透明显示。
回复
adrianx 2000-12-23
void ViewBitmapFromFile(HDC hDC)
{
CFileDialog dlg(TRUE);
if(dlg.DoModal()==IDOK)
{
HDC MemDC = CreateCompatibleDC(hDC);
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,dlg.GetFileName (),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
SelectObject(MemDC,hBitmap);
BITMAP bmp;
GetObject(hBitmap,sizeof(bmp),&bmp);
BitBlt(hDC,0,0,bmp.bmWidth,bmp.bmHeight,MemDC,0,0,SRCCOPY);
DeleteObject(hBitmap);
DeleteDC(MemDC);
}
}
回复
ddddh 2000-12-23
LoadImage函数
回复
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2000-12-23 04:34
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……