请问jpg具体的文件格式是怎样的?怎样实现与bmp文件之间的相互转化

解决方案 »

  1.   

    jpg具体的很复杂,找个现成图片格式库用就行了,这种功能应该都有
      

  2.   

    复杂没有关系,主要是很详细的文件格式,这样就可以bmp之间做个比较
      

  3.   

    CxImage库可实现多种格式的图片转换
      

  4.   

    确实挺复杂的,格式上很难说清楚。原理上大概是这样,把图象分成8*8的小格,对每个小格做离散余弦变换(DCT),然后用一个量化矩阵乘一下去掉高频分量,然后用ZigZag拉链顺序串起来,作霍夫曼编码。
      

  5.   

    你用画图打开,另存为24色位图就OK了。我平时就是这样加jpeg资源的。
      

  6.   

    我这里有个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;
    }