转换jpg成bmp方法

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值