您的位置:首页 > 其它

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: