wince 加载bmp文件方法
2012-06-27 14:35
295 查看
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);
}
一、方法一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);
}
相关文章推荐
- 加载bmp文件方法二
- WinCE中显示32位色BMP文件的一种方法
- 加载bmp文件方法一
- WinCE中显示32位色BMP文件的一种方法
- WinCE中显示32位色BMP文件的一种方法
- wince&evc下加载BMP位图文件
- Afinal加载网络图片及下载文件使用方法
- spring 中加载xml配置文件的方法
- WinCE中将调试信息写入文件的方法[…
- Qml文件的两种加载方式|启动Qt quick app的两种方法
- android studio 2.0加载so文件的方法
- 谈谈动态地加载Jquery库文件的方法
- iOS加载并显示bundle的.txt文件的方法
- 在Asp.Net头部动态加载css和js文件的方法(转)
- [yii2]不加载layout布局文件的实现方法
- main方法中同时加载多个Spring文件
- MFC 的 Picture Control 加载 BMP/PNG 图片的方法
- Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)
- WinCE中将调试信息写入文件的方法
- 解决方法:未能加载文件或程序集“Microsoft.Office.Interop.Excel。。。”