www.pudn.com > testWordAll.rar > JpgToBmp.cpp


// JpgToBmp.cpp: implementation of the CJpgToBmp class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "testWordAll.h" 
#include "JpgToBmp.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CJpgToBmp::CJpgToBmp() 
{ 
 
} 
 
CJpgToBmp::~CJpgToBmp() 
{ 
 
} 
 
PBITMAPINFO CJpgToBmp::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<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<bmiHeader.biCompression = BI_RGB;      
     
	pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31)/8 * pbmi->bmiHeader.biHeight;      
	pbmi->bmiHeader.biClrImportant   =   0;      
	return   pbmi;      
}      
     
void CJpgToBmp::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 CJpgToBmp::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); 
}