我要得到Richedit里面的内容,使用richedit的streamout。为何streamout后得到的数据变得那么庞大?

解决方案 »

  1.   

    The value of nFormat must be one of the following: 
    SF_TEXT   Indicates writing text only.
    SF_RTF   Indicates writing text and formatting.
    SF_RTFNOOBJS   Indicates writing text and formatting, replacing OLE items with spaces.
    SF_TEXTIZED   Indicates writing text and formatting, with textual representations of OLE items.
      

  2.   

    我的richedit里面有个显示GIF的控件。SF_RTF:我调用QQ的ImageOled.dll。再streamout数据量大小正常
    而我用我自己的控件。streamout得到的数据异常庞大,快8M了
    不知道这个问题和哪里有关系。
      

  3.   

    to Mackz 流输出??我自己没写,我只是写了GIF的显示部分代码。
      

  4.   

    代码现在没有,在公司里面,在家自己写了个测试,
    控件是最简单的MFC生成的控件,然后插入到richedit,大小有12K
      

  5.   

    QQ那个DLL并不是把里面的图片也输出的 而是只输出一个替代的编号
    你自己写的可能是连图片文件一起输出 可能就比较大了吧。
    另外检查一下输出的时候 是不是连带输出了一些数组或者某些内容重复输出了。
      

  6.   


    你意思是指QQ有将图片压缩了,压缩这个我想过但没有尝试过,也只前几天才发现的这个问题,每次聊天的内容带图片的话,数据量就异常的大,我是有把整个GIF图片的buf输出去了。明天去公司修改试试。谢谢先
      

  7.   

    130K的gif图片,压缩过后不知道会多大。
    如果压缩的很小的话,那又不好解决了。
    我是在Serialize的时候,把整个Buf输出去了
      

  8.   

    Buf里面带的GIF数据只有140K左右,会使得RTF文件达到8M?
    汗一个
      

  9.   

    RTF是把数据以字符形式储存,数据增大几倍是正常的,最好是自己来处理非文本数据。
      

  10.   

    我说的不是压缩 而是指代 例如QQ里面微笑在发送的时候可能只是发送了一个"/wx" 原因是双方都有这个指代了 所以你发送图像跟QQ发送表情是没法去比较大小的
    发送图片(例如截屏)的时候 应该经过了RTF中的高压缩再发送的
      

  11.   


    -----------------------------
    明天我自己压缩一下试试,估计压缩GIF也压缩不了多少了。
    -------------------------
    我发送的是本机屏幕的截屏。整个屏幕(1024 * 768),是将BMP转化为GIF后插到richedit里面的。转化的GIF的大小100K左右吧。
    用的我的控件的话streamout后产生RTF文件好几M了。   我用同样的调用代码去调用QQ的ImageOle.Dll,streamout后也就130K多点吧。
      

  12.   

    WinForm下的RichEdit(SDK)或RichTextBox(.net),都是用字符形式存贮数据。
    对于文字来说当然正好,但对于图像来说,一个只有90多KB的JPEG图像,放RichTextBox中导出保存后要占据2M多空间。解决方法只一就是采用压缩。我以前用过霍夫曼压缩,能将数据减小一半左右。但这样远不能称之为理想。而且压缩率越高,解压就越慢。
    最好办法是采用其它控件代替RichTextBox。但这类东西似乎没有免费的。虽然可以考虑使用WPF中的RichTextBox(具体名称记不清了)。不过同学们要为此从.net2.0转移到.net3.0 不是一朝一夕就能搞定的。或者痛下决心自己弄一个RichTextBox,不过底层代码写起来真的是很繁锁...ORZ
      

  13.   

    richedit在streamout的时候,调用的是控件的IPersistStorage::Save,save调用了控件的Serialize我代码里面有个GIF的解析类,在Serialize的时候,我把那个类空间都释放掉(release),只write原来GIF文件的数据,数据量明显少了很多。130K多点的GIF,导出RTF数据量大小为310K多点吧。除了修改解析类,请问还有办法在Save的时候只保存自己想放进去的数据?MSDN对IPersistStorage::Save的解释为This method saves an object and any nested objects that it contains into the specified storage.
    save保存了所有嵌套的对象。
      

  14.   

    IPersistStorage::Save 保存的到底是什么?只是我Serialize时候写进去的吗?  不太像。如果是的话,我只写了100K的数据。貌似还写得别的东西,看MFC的代码,我看不出什么来
      

  15.   

    控件是我自己写得,而且richedit只插入这么一个控件。streamout除了我Serialize写出来的,还有和什么有关系??
    对了,一个很奇怪的问题,在我我的CXXXXCOntrol里面有个GIF解析类的对象,
    我用这个对象Load 一个gif后,输出的RTF就狂大无比?我试着把GIF解析类的对象Load注释掉。然后定义一个指针,第一没有new,第二次new了一个很大的空间,2次输出的RTF的数据量变化是一样的。
    而当我有使用GIF解析类的对象的时候。并且Load了一个gif。RTF就大的不得了。按理应该没什么关系吧。
      

  16.   

    除了gif数据之外,其它的对象就不要串行化了。
      

  17.   


    是的啊,我只write了GIF的数据。按理由应该正常的啊,搞不懂为何会变那么大
      

  18.   

    不知道可不可先把richtextbox里的图片存为图片形式,然后存图片路径,调用的时候访问路径就可以了,具体怎么做就不知道了,想想,qq发送图片的时候是先存为图片的