请教各位大侠,如何将tif文件转换成bmp文件(24位或8位)?最好可以提供源代码,谢谢[email protected]

解决方案 »

  1.   

    LPPICTURE m_pPicture;
    bool CImage::Open(lpszPathName)
    {
    HRESULT hr = ::OleLoadPicturePath(const_cast<LPOLESTR>(T2COLE(lpszPathName)),
      NULL,
      0,
      0,
      IID_IPicture,
      reinterpret_cast<LPVOID *>(&m_pPicture));
    return m_pPicture!=NULL;
    }
    bool CImage::SaveToBmpFile(CString strBmpFileName)
    {
    BOOL bResult = FALSE;
    ILockBytes *Buffer = 0;
    IStorage   *pStorage = 0;
    IStream    *FileStream = 0;
    BYTE    *BufferBytes;
    STATSTG BytesStatistics;
    DWORD OutData;
    long OutStream;
    CFile BitmapFile; CFileException e;
    double SkipFloat = 0;
    DWORD ByteSkip = 0;
    _ULARGE_INTEGER RealData; CreateILockBytesOnHGlobal(NULL, TRUE, &Buffer); // Create ILockBytes Buffer HRESULT hr = ::StgCreateDocfileOnILockBytes(Buffer,
     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage); hr = pStorage->CreateStream(L"PICTURE",
     STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &FileStream); m_pPicture->SaveAsFile(FileStream, TRUE, &OutStream); // Copy Data Stream
    FileStream->Release();
    pStorage->Release();
    Buffer->Flush();  // Get Statistics For Final Size Of Byte Array
    Buffer->Stat(&BytesStatistics, STATFLAG_NONAME); // Cut UnNeeded Data Coming From SaveAsFile() (Leave Only "Pure" Picture Data)
    SkipFloat = (double(OutStream) / 512); // Must Be In a 512 Blocks...
    if(SkipFloat > DWORD(SkipFloat)) ByteSkip = (DWORD)SkipFloat + 1;
    else ByteSkip = (DWORD)SkipFloat;
    ByteSkip = ByteSkip * 512; // Must Be In a 512 Blocks...

    // Find Difference Between The Two Values
    ByteSkip = (DWORD)(BytesStatistics.cbSize.QuadPart - ByteSkip); // Allocate Only The "Pure" Picture Data
    RealData.LowPart = 0;
    RealData.HighPart = 0;
    RealData.QuadPart = ByteSkip;
    BufferBytes = (BYTE*)malloc(OutStream);
    if(BufferBytes == NULL)
    {
    Buffer->Release();
    return false;
    } Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData); if(BitmapFile.Open(strBmpFileName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
    {
    BitmapFile.Write(BufferBytes, OutData);
    BitmapFile.Close();
    bResult = TRUE;
    }
    else // Write File Failed...
    return false;

    Buffer->Release();
    free(BufferBytes); return(!!bResult);
    }
    用完之后
    if(m_pPicture)
     m_pPicture->Release();
    此方法能打开几乎所有文件格式,而且均能把它们转化为bmp格式,GIF只能为第一帧。