.h
void JpgToBmp(LPCTSTR lpszJpgFile,LPCTSTR lpszBmpFile);
PBITMAPINFO CreateBitmapInfoStruct(HBITMAP hBmp);
void CreateBMPFile(LPCTSTR pszFile,PBITMAPINFO pbi,HBITMAP hBMP,HDC hDC);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
.cpp
PBITMAPINFO CDialogshowDlg::CreateBitmapInfoStruct(HBITMAP hBmp)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;
GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp);
cClrBits = (WORD)(bmp.bmPlanes* bmp.bmBitsPixel);
if(cClrBits == 1)
cClrBits = 1;
else if (cClrBits <= 4)
cClrBits = 4;
else if (cClrBits <= 8)
cClrBits = 8;
else if (cClrBits <= 16)
cClrBits = 16;
else if (cClrBits <= 24)
cClrBits = 24;
else cClrBits = 32;
if (cClrBits != 24)
pbmi = (PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)* (1<<cClrBits));
else
pbmi =(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if(cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1<<cClrBits);
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth*cClrBits +31)&~31)/8*pbmi->bmiHeader.biHeight;
pbmi->bmiHeader.biClrImportant = 0;
return pbmi;
}
void CDialogshowDlg::CreateBMPFile(LPCTSTR pszFile,PBITMAPINFO pbi,HBITMAP hBMP,HDC hDC)
{
HANDLE hf;
BITMAPFILEHEADER hdr;
PBITMAPINFOHEADER pbih;
LPBYTE lpBits;
DWORD dwTotal;
DWORD cb;
BYTE *hp;
DWORD dwTmp;
pbih = (PBITMAPINFOHEADER)pbi;
lpBits = (LPBYTE)GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
GetDIBits(hDC, hBMP, 0, (WORD)pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS);
hf = CreateFile(pszFile, GENERIC_READ|GENERIC_WRITE, (DWORD)0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
hdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD);
WriteFile(hf,(LPVOID)&hdr,sizeof(BITMAPFILEHEADER),(LPDWORD)&dwTmp,NULL);
WriteFile(hf,(LPVOID)pbih,sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof(RGBQUAD), (LPDWORD)&dwTmp,(NULL));
dwTotal = cb = pbih->biSizeImage;
hp = lpBits;
WriteFile(hf,(LPSTR)hp,(int)cb,(LPDWORD)&dwTmp,NULL);
CloseHandle(hf);
GlobalFree((HGLOBAL)lpBits);
}
//转换jpg成bmp
void CDialogshowDlg::JpgToBmp(LPCTSTR lpszJpgFile,LPCTSTR lpszBmpFile)
{
HANDLE hFile = CreateFile(lpszJpgFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
DWORD dwFileSize = GetFileSize(hFile, NULL);
LPVOID pvData = NULL;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
pvData = GlobalLock(hGlobal);
DWORD dwBytesRead = 0;
BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
GlobalUnlock(hGlobal);
CloseHandle(hFile);
LPSTREAM pstm = NULL;
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
LPPICTURE pPicture;
hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID*)&pPicture);
pstm->Release();
HDC hdc = ::CreateCompatibleDC(NULL); //::GetDC(m_hWnd);
HDC hdcOld;
HBITMAP hBitmap;
HBITMAP hOldBitmap;
pPicture->SelectPicture(hdc, &hdcOld, (OLE_HANDLE*)&hOldBitmap);
pPicture->get_Handle((OLE_HANDLE*)&hBitmap);
PBITMAPINFO pbi = CreateBitmapInfoStruct(hBitmap);
CreateBMPFile(lpszBmpFile, pbi, hBitmap, hdc);
pPicture->SelectPicture(hdcOld, NULL, NULL);
::SelectObject(hdc, hOldBitmap);
::DeleteDC(hdc);
}