请问jpg具体的文件格式是怎样的?怎样实现与bmp文件之间的相互转化 请问jpg具体的文件格式是怎样的?怎样实现与bmp文件之间的相互转化 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 jpg具体的很复杂,找个现成图片格式库用就行了,这种功能应该都有 复杂没有关系,主要是很详细的文件格式,这样就可以bmp之间做个比较 CxImage库可实现多种格式的图片转换 确实挺复杂的,格式上很难说清楚。原理上大概是这样,把图象分成8*8的小格,对每个小格做离散余弦变换(DCT),然后用一个量化矩阵乘一下去掉高频分量,然后用ZigZag拉链顺序串起来,作霍夫曼编码。 你用画图打开,另存为24色位图就OK了。我平时就是这样加jpeg资源的。 我这里有个JPEG到BMP的转换,不知道反过来行不,此函数乃本人呕血整理,君其珍爱!BOOL Jpeg2Bmp(LPCTSTR lpszJpegFile, LPCTSTR lpszBmpFile){ ::CoInitialize(NULL); //初始化COM公寓 HRESULT hr1; CFile file; file.Open(lpszJpegFile,CFile::modeRead|CFile::shareDenyNone);//读入文件内容 DWORD dwSize = file.GetLength(); HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize ); LPVOID lpBuf = ::GlobalLock( hMem ); file.ReadHuge( lpBuf, dwSize ); file.Close(); ::GlobalUnlock( hMem ); IStream * pStream1 = NULL; IPicture * pPicture = NULL; // 由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存 hr1 = ::CreateStreamOnHGlobal( hMem, TRUE, &pStream1 ); ASSERT ( SUCCEEDED(hr1) ); hr1 = ::OleLoadPicture( pStream1, dwSize, TRUE, IID_IPicture, ( LPVOID * )&pPicture ); ASSERT(hr1==S_OK); // Create ILockBytes Buffer ILockBytes *plkbyt = NULL; CreateILockBytesOnHGlobal(NULL, TRUE, &plkbyt); // Create IStorage IStorage *pStorage = NULL; HRESULT hr = ::StgCreateDocfileOnILockBytes(plkbyt,STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage); if (FAILED(hr)) { plkbyt->Release(); plkbyt = NULL; return FALSE; } // Create IStream IStream *pStream = NULL; hr = pStorage->CreateStream(L"PICTURE",STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &pStream); if (FAILED(hr)) { pStorage->Release(); pStorage = NULL; plkbyt->Release(); plkbyt = NULL; return FALSE; } // Copy Data Stream long lSize; hr = pPicture->SaveAsFile(pStream, TRUE, &lSize); if (FAILED(hr)) { pStream->Release(); pStream = NULL; pStorage->Release(); pStorage = NULL; plkbyt->Release(); plkbyt = NULL; return FALSE; } // Get Statistics For Final Size Of Byte Array STATSTG statStg; hr = plkbyt->Stat(&statStg, STATFLAG_NONAME); if (FAILED(hr)) { pStream->Release(); pStream = NULL; pStorage->Release(); pStorage = NULL; plkbyt->Release(); plkbyt = NULL; return FALSE; } // calculate "Pure" Picture Data, Must Be In a 512 Blocks... double dbSkipFloat = (double(lSize) / 512); DWORD dwPicDataSize = 0; if(dbSkipFloat > DWORD(dbSkipFloat)) { dwPicDataSize = (DWORD)dbSkipFloat + 1; } else { dwPicDataSize = (DWORD)dbSkipFloat; } dwPicDataSize = dwPicDataSize * 512; // Allocate Only The "Pure" Picture Data BYTE *pPicDataBuffer = (BYTE*)malloc(dwPicDataSize); if (pPicDataBuffer == NULL) { pStream->Release(); pStream = NULL; plkbyt->Release(); pStorage->Release(); pStorage = NULL; plkbyt = NULL; return FALSE; } // Read "Pure" Picture Data to Buffer _ULARGE_INTEGER ulOffset; ulOffset.LowPart = 0; ulOffset.HighPart = 0; ulOffset.QuadPart = (DWORD)(statStg.cbSize.QuadPart - dwPicDataSize); DWORD dwRealDataSize; hr = plkbyt->ReadAt(ulOffset, pPicDataBuffer, dwPicDataSize, &dwRealDataSize); if (FAILED(hr)) { free(pPicDataBuffer); pPicDataBuffer = NULL; pStream->Release(); pStream = NULL; pStorage->Release(); pStorage = NULL; plkbyt->Release(); plkbyt = NULL; return FALSE; } // Save "Pure" Picture Data to file CFile fBmp; CFileException e; if (!fBmp.Open(lpszBmpFile, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e)) { free(pPicDataBuffer); pPicDataBuffer = NULL; pStream->Release(); pStream = NULL; pStorage->Release(); pStorage = NULL; plkbyt->Release(); plkbyt = NULL; return FALSE; } fBmp.Write(pPicDataBuffer, dwRealDataSize); fBmp.Close(); free(pPicDataBuffer); pPicDataBuffer = NULL; pStream->Release(); pStream = NULL; pStorage->Release(); pStorage = NULL; plkbyt->Release(); plkbyt = NULL; if ( pPicture ) pPicture->Release();// 释放 IPicture 指针 if ( pStream1 ) pStream1->Release(); // 释放 IStream 指针,同时释放了 hMem ::CoUninitialize(); return TRUE;} *请教仿WPE模拟封包发送的实现方法* 火星文是通过什么方法来对比替换文字的呢? new和DEBUG_NEW 请教有关在工具条上实现属性页风格的按钮的问题! 高分请教,为什么打完包以后弹不出对话框呀. help!谢谢 请问如何清除一个vector,是在全局区的 在线等待送分!!!如何将某个图象资源ID中的某个区域范围的图象,放置到一个新的HBITMAP变量中 各位大虾,有关ADO的问题.... 软件发布:Com组件管理程序 怎样用keybd_event模拟按下PRINT SCREEN键 MFC小问题
{
::CoInitialize(NULL); //初始化COM公寓
HRESULT hr1;
CFile file; file.Open(lpszJpegFile,CFile::modeRead|CFile::shareDenyNone);//读入文件内容 DWORD dwSize = file.GetLength();
HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
LPVOID lpBuf = ::GlobalLock( hMem );
file.ReadHuge( lpBuf, dwSize );
file.Close();
::GlobalUnlock( hMem ); IStream * pStream1 = NULL;
IPicture * pPicture = NULL;
// 由 HGLOBAL 得到 IStream,参数 TRUE 表示释放 IStream 的同时,释放内存
hr1 = ::CreateStreamOnHGlobal( hMem, TRUE, &pStream1 );
ASSERT ( SUCCEEDED(hr1) );
hr1 = ::OleLoadPicture( pStream1, dwSize, TRUE, IID_IPicture, ( LPVOID * )&pPicture );
ASSERT(hr1==S_OK);
// Create ILockBytes Buffer
ILockBytes *plkbyt = NULL;
CreateILockBytesOnHGlobal(NULL, TRUE, &plkbyt); // Create IStorage
IStorage *pStorage = NULL;
HRESULT hr = ::StgCreateDocfileOnILockBytes(plkbyt,STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);
if (FAILED(hr))
{
plkbyt->Release();
plkbyt = NULL;
return FALSE;
} // Create IStream
IStream *pStream = NULL;
hr = pStorage->CreateStream(L"PICTURE",STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &pStream);
if (FAILED(hr))
{
pStorage->Release();
pStorage = NULL;
plkbyt->Release();
plkbyt = NULL;
return FALSE;
}
// Copy Data Stream
long lSize;
hr = pPicture->SaveAsFile(pStream, TRUE, &lSize);
if (FAILED(hr))
{
pStream->Release();
pStream = NULL;
pStorage->Release();
pStorage = NULL;
plkbyt->Release();
plkbyt = NULL;
return FALSE;
}
// Get Statistics For Final Size Of Byte Array
STATSTG statStg;
hr = plkbyt->Stat(&statStg, STATFLAG_NONAME);
if (FAILED(hr))
{
pStream->Release();
pStream = NULL;
pStorage->Release();
pStorage = NULL;
plkbyt->Release();
plkbyt = NULL;
return FALSE;
} // calculate "Pure" Picture Data, Must Be In a 512 Blocks...
double dbSkipFloat = (double(lSize) / 512);
DWORD dwPicDataSize = 0;
if(dbSkipFloat > DWORD(dbSkipFloat))
{
dwPicDataSize = (DWORD)dbSkipFloat + 1;
}
else
{
dwPicDataSize = (DWORD)dbSkipFloat;
}
dwPicDataSize = dwPicDataSize * 512;
// Allocate Only The "Pure" Picture Data
BYTE *pPicDataBuffer = (BYTE*)malloc(dwPicDataSize);
if (pPicDataBuffer == NULL)
{
pStream->Release();
pStream = NULL;
plkbyt->Release();
pStorage->Release();
pStorage = NULL;
plkbyt = NULL;
return FALSE;
}
// Read "Pure" Picture Data to Buffer
_ULARGE_INTEGER ulOffset;
ulOffset.LowPart = 0;
ulOffset.HighPart = 0;
ulOffset.QuadPart = (DWORD)(statStg.cbSize.QuadPart - dwPicDataSize);
DWORD dwRealDataSize;
hr = plkbyt->ReadAt(ulOffset, pPicDataBuffer, dwPicDataSize, &dwRealDataSize);
if (FAILED(hr))
{
free(pPicDataBuffer);
pPicDataBuffer = NULL;
pStream->Release();
pStream = NULL;
pStorage->Release();
pStorage = NULL;
plkbyt->Release();
plkbyt = NULL;
return FALSE;
}
// Save "Pure" Picture Data to file
CFile fBmp;
CFileException e;
if (!fBmp.Open(lpszBmpFile, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
{
free(pPicDataBuffer);
pPicDataBuffer = NULL;
pStream->Release();
pStream = NULL;
pStorage->Release();
pStorage = NULL;
plkbyt->Release();
plkbyt = NULL;
return FALSE;
}
fBmp.Write(pPicDataBuffer, dwRealDataSize);
fBmp.Close();
free(pPicDataBuffer);
pPicDataBuffer = NULL;
pStream->Release();
pStream = NULL;
pStorage->Release();
pStorage = NULL;
plkbyt->Release();
plkbyt = NULL;
if ( pPicture ) pPicture->Release();// 释放 IPicture 指针
if ( pStream1 ) pStream1->Release(); // 释放 IStream 指针,同时释放了 hMem
::CoUninitialize(); return TRUE;
}