wince 加载bmp文件方法

本文介绍了在Windows CE(WinCE)系统中加载BMP文件的四种方法:一是使用SHLoadDIBitmap函数;二是利用Imaging技术加载JPG、PNG、GIF等多种格式的图片;三是从资源中加载位图;四是通过DIB直接读取位图文件内容。详细代码示例展示了每种方法的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wince 加载bmp文件方法
一、方法一SHLoadDIBitmap
bool LoadBitmapFile(LPCTSTR szFIleName,CDC& dc)

{


CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap   bmBkgnd, *pOldBitmap = NULL;
HBITMAP   bitmap=NULL;
bmBkgnd.Detach();
bitmap = (HBITMAP)::SHLoadDIBitmap(szFIleName);
if(bitmap!=NULL)
{


bmBkgnd.Attach(bitmap);
pOldBitmap = memdc.SelectObject(&bmBkgnd);
dc.BitBlt(0,0,800,480,&memdc,0,0,SRCCOPY);
memdc.SelectObject(&pOldBitmap);
bmBkgnd.DeleteObject();
memdc.DeleteDC();
return true;
}
return false;

}
二、方法二使用Imaging技术
此方法可加载JPG PNG GIF BMP等
void CTestSaveJPGDlg::ShowPic(const TCHAR *fileName)
{


 IImage * m_pImage, *m_pThum;
 IImagingFactory * m_pImagingFactory;


 HRESULT hr;


 HBITMAP  hBitmap = 0;


 CWindowDC hdc(0);  
 CDC hdcMem;
 HGDIOBJ  hOldSel;
 ImageInfo imageInfo;


 //COM初始化
 if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))
 {  
  goto END;
 }


 //创建COM实例
 if(FAILED(hr = CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**) &m_pImagingFactory)))
 {
  goto END;
 }


 //从文件中创建图片
 if(FAILED(hr = m_pImagingFactory->CreateImageFromFile(fileName, &m_pImage)))
 {
  goto END;
 }
//m_pImagingFactory-
 //绘制图片
//  if(FAILED(hr = m_pImage->Draw(hdc,&rcWnd,NULL)))
//  {
//   goto END;
//  }
 //获取图片属性 




 m_pImage->GetImageInfo(&imageInfo);


 //double dDotPermmX = imageInfo.Xdpi / 25.4;
 //double dDotPermmY = imageInfo.Ydpi / 25.4;


 ////pSrcRect指向以像素点为单位的区域
 //RECT rcSrc = {(LONG)(pSrcRect->left / dDotPermmX / 0.01),
 // (LONG)(pSrcRect->top / dDotPermmY / 0.01),
 // (LONG)(pSrcRect->right / dDotPermmX / 0.01),
 // (LONG)(pSrcRect->bottom / dDotPermmY / 0.01)};   


 


 //创建一个内存DC,用来存储图片数据
 hdcMem.CreateCompatibleDC(&hdc);
 hBitmap = CreateCompatibleBitmap(hdc.GetSafeHdc(),imageInfo.Width,imageInfo.Height);
 hOldSel = hdcMem.SelectObject(hBitmap);




 //将图片数据存储到内存DC中
 RECT  rcMemDC = {0,0,imageInfo.Width,imageInfo.Height}; 


 //获取缩略图实例
 m_pImage->GetThumbnail(imageInfo.Width,imageInfo.Height,&m_pThum);


 m_pThum->Draw(hdcMem.GetSafeHdc(),&rcMemDC,NULL);


 //hdcMem.SelectObject(hOldSel); 


 RECT *pDstRect = &rcMemDC; 
 RECT *pSrcRect = &rcMemDC;
 
 
  //将图片绘制到目标DC
   StretchBlt(hdc,
//    pDstRect->left,
//    pDstRect->top,
//    pDstRect->right - pDstRect->left,
//    pDstRect->bottom - pDstRect->top,
 30,
 50,
 128*2,
 120*2,
   hdcMem,
    pSrcRect->left,
    pSrcRect->top,
    pSrcRect->right - pSrcRect->left,
    pSrcRect->bottom - pSrcRect->top,
   SRCCOPY);




END:
 //释放资源
 if(m_pImage != NULL)
 {
  m_pImage->Release();
  m_pImage = NULL;
 }


 if(m_pImagingFactory != NULL)
 {
  m_pImagingFactory->Release();
  m_pImagingFactory = NULL;
 }
 
 CoUninitialize();
}
三、从资源中装入位图 方法
在VC 开发环境的资源编辑器里可将要显示的BMP 位图文件加载到资源中,并用资源
ID 来标识它,在应用的视类的成员函数OnDraw(CDC 3 pDC) 中显示,如:
CDC 3 hMemDC = new CDC;
Cbitmap 3 hBitmap = new Cbitmap 
hBitmap = LoadBitmap ( ID-BMPSOURCE)   / / ID-BMPSOURCE 为资源ID
hMemDC - > CreateCompatibleDC(pDC) 
hMemDC - > SelectObject (hBitmap) 
pDC - >BitBlt (0 ,0 ,nWidth ,nHeight ,hMemDC ,0 ,0 ,SRCCOPY) 
由于ID-BMPSOURCE 为资源ID ,BMP 位图文件不能在应用运行时装入。
四、使用DIB加载


BOOL CDib::Load(CString & FileName)
{
 CFile cf;
 // 打开位图文件
 if (!cf.Open(FileName, CFile::modeRead))
  return (FALSE);
 // 获得位图文件大小,并减去BITMAPFILEHEADER的长度
 DWORD dwDibSize;
 dwDibSize = cf.GetLength() - sizeof(BITMAPFILEHEADER);
 // 为DIB位图分配内存
 unsigned char *pDib;
 pDib = new unsigned char[dwDibSize];
 if (pDib == NULL)
  return (FALSE);
 BITMAPFILEHEADER BFH;
 // 读取位图文件数据
 try
 {
  // 文件格式是否正确有效
  if ( cf.Read(&BFH, sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER) ||
   BFH.bfType != *(WORD*)"BM" || cf.Read(pDib, dwDibSize) != dwDibSize)
  {
   delete []pDib;
   return (FALSE);
  }
 }
 catch (CFileException *e)
 {
  e->Delete();
  delete []pDib;
  return (FALSE);
 }
 // delete先前加载的位图
 if (m_pDib != NULL)
  delete m_pDib;
 // 将临时Dib数据指针和Dib大小变量赋给类成员变量
 m_pDib = pDib;
 m_dwDibSize = dwDibSize;
 // 为相应类成员变量赋BITMAPINFOHEADER和调色板指针
 m_pBIH = (BITMAPINFOHEADER*)m_pDib;
 m_pPalette = (RGBQUAD*) &m_pDib[sizeof(BITMAPINFOHEADER)];
 // 计算调色板中实际颜色数量
 m_nPaletteEntries = 1 << m_pBIH->biBitCount;
 if (m_pBIH->biBitCount > 8)
  m_nPaletteEntries = 0;
 else if (m_pBIH->biClrUsed != 0)
  m_nPaletteEntries = m_pBIH->biClrUsed;
 // 为相应类成员变量赋image data指针
 m_pDibBits = &m_pDib[sizeof(BITMAPINFOHEADER) + m_nPaletteEntries * sizeof (RGBQUAD)];
 // delete先前的调色板
 if (m_Palette.GetSafeHandle() != NULL)
  m_Palette.DeleteObject();
 // 如果位图中存在调色板,创建LOGPALETTE 及CPalette
 if (m_nPaletteEntries != 0)
 {
  LOGPALETTE *pLogPal = (LOGPALETTE*)new char[sizeof(LOGPALETTE) + m_nPaletteEntries *sizeof(PALETTEENTRY)];
  if (pLogPal != NULL)
  {
   pLogPal->palVersion = 0x300;
   pLogPal->palNumEntries = m_nPaletteEntries;
   for (int i = 0; i < m_nPaletteEntries; i++)
   {
    pLogPal->palPalEntry[i].peRed = m_pPalette[i].rgbRed;
    pLogPal->palPalEntry[i].peGreen = m_pPalette[i].rgbGreen;
    pLogPal->palPalEntry[i].peBlue = m_pPalette[i].rgbBlue;
   }
   //创建CPalette并释放LOGPALETTE的内存
   m_Palette.CreatePalette(pLogPal);
   delete []pLogPal;
  }
 }
 return (TRUE);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值