技术文栏 - 软件开发 - 浏览文章 - 通过Ipicture把jpeg转成bmp
通过Ipicture把jpeg转成bmp
http://www.5nx.com 2007-10-18 17:42:54 不详
Code:

BOOL CPicture::SaveAsBitmap(CString sFilePathName)
//=============================================================================  
{
        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_IPicture->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();
                HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
                MessageBoxEx(hWnd, "Can not allocate enough memory\t", ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
        }
        
        Buffer->ReadAt(RealData, BufferBytes, OutStream, &OutData);
        
        if (BitmapFile.Open(sFilePathName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))
        {
                BitmapFile.Write(BufferBytes, OutData);
                BitmapFile.Close();
                bResult = TRUE;
        }
        else
                // Write File Failed...
        {
                TCHAR szCause[255];
                e.GetErrorMessage(szCause, 255, NULL);
                HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
                MessageBoxEx(hWnd, szCause, ERROR_TITLE, MB_OK | MB_ICONSTOP, LANG_ENGLISH);
                bResult = FALSE;
        }
        
        Buffer->Release();
        free(BufferBytes);
        return (bResult);
}
所属分类: 软件开发   所属专题: VC
共有 3331 人次浏览 收藏本页 返回上一页 责任编辑: 不详
相关文章
    评论作者:
    电子邮件:
    评论内容:
    投票评价:
    验 证 码:
    图片包含4个随机字符,点击刷新
    请输入上面图片中的随机字符