假设有一个LPOLEOBJECT的指针指向这个OLE对象,这个OLE对象是一张BMP图片,有没有办法把它保存为一个图片文件,而不是一个复合文件?
其实我是想把一个RichEdit里插入的图片保存为一个可以很容易浏览的图片文件,我曾经试过用GetObject获得了这个OLE对象的IStorage,曾经对这个IStorage进行过各种各样的读取操作,发现都是失败的,又尝试过用StreamOut来把图片输出,发现无法读取这个图片文件,最后也曾尝试过把这个OLE对象保存为一个复合文件,曾经用UltraEdit查看过这个复合文档,发现文件头添加了一部分字节,中间是图片一样的内容,末尾也添加了一些FF的字节,但是由于无法确定添加字节的大小,所以还是放弃了这个做法.
于是求问各位,有没有办法把一个插入到RichEdit的OLE对象保存为一个图片文件,就是.jpg,.bmp还可以浏览到的文件

解决方案 »

  1.   

    怎么没有人回答呢?
    其实我想做一个IM的发送图片的功能,我查了一下QQ的文件,发现每当我发送一幅图片,或者接受一幅图片的时候,QQ都会在一个文件夹里存放这个图片文件,然后估计是用RichEdit显示图片,所以我想实现类似功能,主要难题就是如何把RichEdit里的OLE对象保存为一个图片文件,而不是符合文件
      

  2.   

    QQ是不是自己做编码的?,在接收到的时候把其中的图像再提起出来的吧。我自己猜的,因为有一个控件esrichedit 好像这样做的。
      

  3.   


          // 下面找到选中图片对象对应的位图句柄,通过句柄将图片数据保存到文件中
            // 注意:下面的代码只对位图有效,对于TrueLink自带的表情对象,则不起作
            // 用(GetData接口会获取失败,故无法保存到文件中)
            BOOL bSavePicSuccess = FALSE;
            int nCount = pRichOle->GetObjectCount(); // 当前m_ChatEdit中所有的object对象
            for ( int i=0; i<nCount; i++ )
            {
                REOBJECT reobject;
                memset( &reobject, 0 , sizeof(REOBJECT) );
                reobject.cbStruct = sizeof(REOBJECT);            SCODE sc = pRichOle->GetObject( i, &reobject, REO_GETOBJ_ALL_INTERFACES ); // 获取到reobject对象
                if ( sc != S_OK )
                {
                    continue;
                }            if ( (reobject.dwFlags & REO_SELECTED) != REO_SELECTED ) // 检验当前reobject是否处于选中状态
                {
                    continue; // 不是当前选中的对象,继续查找
                }            IDataObject* pDataObject = NULL;
                sc = reobject.poleobj->QueryInterface( IID_IDataObject, (void**)&pDataObject ); // 获取IDataObject信息
                if ( sc != S_OK )
                {
                    break; // 已经找到选中的图片对象,获取信息失败,直接退出
                }            // 要对fm参数进行设置,指明要从IStorage中获取什么样的信息,否则GetData接口会获取stg信息失败
                STGMEDIUM stg;
                FORMATETC fm;
                fm.cfFormat = CF_BITMAP;        // Clipboard format = CF_BITMAP
                fm.ptd = NULL;                  // Target Device = Screen
                fm.dwAspect = DVASPECT_CONTENT; // Level of detail = Full content
                fm.lindex = -1;                 // Index = Not applicaple
                fm.tymed = TYMED_GDI;           // 对应CF_BITMAP
                
                HRESULT hr = pDataObject->GetData( &fm, &stg );
                if ( hr != S_OK || stg.hBitmap == NULL )
                {
                    break; // 已经找到选中的图片对象,获取信息失败,直接退出
                }            BOOL bRet = SaveBmpDataToFile( stg.hBitmap, csFilePath );
                if ( bRet )
                {
                    bSavePicSuccess = TRUE;
                }
            }        if ( !bSavePicSuccess )
            {
                AfxMessageBox( _T("图片保存失败!") );
            }