容易的问题(位图)

huxiaoyong1985 2004-05-06 10:08:05
怎么将硬盘中的位图读到内存?
代码!!!
...全文
12 5 点赞 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bluebohe 2004-05-06
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;

//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1) wBitCount = 1;
else if (iBits <= 4) wBitCount = 4;
else if (iBits <= 8) wBitCount = 8;
else wBitCount = 24;

GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrImportant = 0;
bi.biClrUsed = 0;

dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;

//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;

// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}

// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);

//恢复调色板
if (hOldPal)
{
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}

//创建位图文件
fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (fh == INVALID_HANDLE_VALUE) return FALSE;

// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);

return TRUE;
}


  • 打赏
  • 举报
回复
bluebohe 2004-05-06
CBitmap m_bmp;
CDC m_MemDC;
HBITMAP hbitmap=(HBITMAP)LoadImage(0,"g:\\tzg.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

m_MemDC.CreateCompatibleDC (NULL);
m_bmp.Attach(hbitmap);
CBitmap *pBitmap=(CBitmap *)m_MemDC.SelectObject(&m_bmp);

//m_MemDC.TextOut()……

m_MemDC.SelectObject(pBitmap);
SaveBmp(m_bmp,"E:\\tzg.bmp");
m_bmp.Detach();
  • 打赏
  • 举报
回复
countryboy 2004-05-06
1、选择从菜单选择资源中的位图参数,并改变菜单的样式
void CBmpviewDlg::OnOpen()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,NULL,NULL,NULL,"位图文件(*.bmp)|*.bmp");
INT Result=dlg.DoModal();
if(Result==IDOK)
{
HBITMAP hbitmap;
hbitmap=(HBITMAP)::LoadImage(NULL,dlg.GetFileName(),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
BITMAP bm;
::GetObject(hbitmap,sizeof(BITMAP),&bm);
m_bitmap.DeleteObject(); //调用CGdiObject的DeleteObject函数将以前的BITMAP对象删除。
m_bitmap.Attach(hbitmap);
ShowBitmap();
}
else if(Result==IDCANCEL)
return;
}
void CBmpviewDlg::OnSelectBitmap(UINT nBitmapID, UINT nMenuID)
{
m_pSubMenu=m_pMainMenu->GetSubMenu(0);//
m_pSubMenu->CheckMenuItem(ID_BABY1,MF_UNCHECKED);//设成未选中
m_pSubMenu->CheckMenuItem(ID_BABY2,MF_UNCHECKED);//同上
m_pSubMenu->CheckMenuItem(ID_BABY3,MF_UNCHECKED);//同上
m_pSubMenu->CheckMenuItem(nMenuID,MF_CHECKED);//将传过来的菜单项设成选中

m_bitmap.DeleteObject(); //调用CGdiObject的DeleteObject函数将以前的BITMAP对象删除。
m_bitmap.LoadBitmap(nBitmapID);//载入指定ID的图象资源

//执行显示函数
ShowBitmap();
}
void CBmpviewDlg::ShowBitmap()
{
BITMAP bm;
m_bitmap.GetObject(sizeof(BITMAP),&bm);
CDC *pDC=new CDC;
CClientDC dc(&m_image); //将客户区定为我们的PICTURE控件。
pDC->CreateCompatibleDC(&dc);
pDC->SelectObject(m_bitmap);
//将图片伸缩成我们设定的大小。
dc.StretchBlt(0,0,320,240,pDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
//如果不准备进行缩放可以用BITBLT。
//dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,pDC,0,0,SRCCOPY);
delete pDC;
}
  • 打赏
  • 举报
回复
countryboy 2004-05-06
HANDLE LoadImage(
HINSTANCE hinst, // 位图实体的句柄,如果是从文件中加载,则此参数为NULL
LPCTSTR lpszName, // 位图文件的源,路径和文件名
UINT uType, // 加载位图的类型,IMAGE_ICON,IMAGE_CURSOR, or IMAGE_BITMAP
int cxDesired, // 象素宽度
int cyDesired, // 象素高度
UINT fuLoad
);
//从资源文件加载是这样
CBitmap m_bitmap; //建立一个位图对象
m_bitmap.DeleteObject(); //调用CGdiObject的DeleteObject函数将以前的BITMAP对象删除。
m_bitmap.LoadBitmap(nBitmapID);//载入指定ID的图象资源nBitmapID是资源的ID。
//从文件加载需要这样
HBITMAP hbitmap;//建立一个位图句柄
hbitmap =(HBITMAP)::LoadImage(NULL,”test.bmp”,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_bitmap.DeleteObject(); //调用CGdiObject的DeleteObject函数将以前的BITMAP对象删除。
m_bitmap.Attach(hbitmap);//把得到的位图句柄附到m_bitmap对象。
导入几张BMP资源
CBitmap m_bitmap; //位图对象
void ShowBitmap(); //显示位图
void OnSelectBitmap(UINT nBitmapID,UINT nMenuID); //从菜单选择资源中的位图参数
//nBitmapID是位图资源的ID, nMenuID是菜单资源的ID
  • 打赏
  • 举报
回复
huxiaoyong1985 2004-05-06
感动
  • 打赏
  • 举报
回复
相关推荐
发帖
图形处理/算法
加入

1.9w+

社区成员

VC/MFC 图形处理/算法
申请成为版主
帖子事件
创建了帖子
2004-05-06 10:08
社区公告
暂无公告