【问题标题】:Can the WPF RichTextBox display binary picture content?WPF RichTextBox 可以显示二进制图片内容吗?
【发布时间】:2011-11-30 14:10:18
【问题描述】:

我试图在一个新的 WPF 应用程序中显示一个 RTF 文件(它是在旧系统中创建的)并且遇到了一些困难。旧的 RTF 文件包含格式为二进制 jpegblip 的图片,当读入 RichTextBox 时,会导致此异常:

Unrecognized structure in data format 'Rich Text Format'. Parameter name: stream

我将文件缩减到最低限度以隔离问题,并以以下开头行结束(本文已删除二进制数据):

{\rtf1{\pict\picw2700\pich2700\picwgoal2700\pichgoal2700\jpegblip\bin9889

这仍然导致异常,所以我将二进制数据转换为十六进制并创建一个带有开头行的新文件:

{\rtf1{\pict\picw2700\pich2700\picwgoal2700\pichgoal2700\jpegblip

包含十六进制数据的文件已被控件正确显示。

是否有人能够将包含二进制图片数据的文件加载到 RichTexBox 控件中,或者失败了,是否有关于 RTF 规范中 RichTextBox 支持什么的明确声明?

【问题讨论】:

    标签: wpf richtextbox rtf image


    【解决方案1】:

    我什至不确定微软是否知道 RichTextBox 实现了什么。他们对 RTF 的想法在太空中不受束缚。查看 MS Word、写字板、众多旧版 Rich Edit 控件等。

    这有一些 cmets 谈论在您的 .NET 代码中使用 COM 对象,这在一定程度上是可以预测的,但微软再次没有指定它们遵循规范的哪些部分。 Broken tables in RichTextBox control (word wrap) - 如果您正确包装它们,您可以在 WPF 中使用它们。

    如果您只需要显示文档,您可能会询问是否所有用户都拥有 Word。然后你也许可以嵌入 Word 文档查看器,然后问题就解决了。如果您的软件是在办公室使用的,那么添加它是一个简单的依赖项。

    我可能会阅读该格式,直到我知道它是如何工作的。然后在我的程序中,我会将 RTF 文件读入缓冲区,获取原始对象数据,以某种方式对其进行转换,用更新的对象替换这些对象,然后将其传递给控件。

    【讨论】:

    • 感谢您的链接。不幸的是,不能在所有客户端机器上安装 Word(用于查看和编辑),这就是我们的产品首先使用 RTF 的原因。看起来我们处于一种情况,可能需要在这些旧产品上使用 Word 自动化进行转换。
    【解决方案2】:

    对我来说,这段代码运行良好。我什至可以从数据库表中提取它。

    <RichTextBox Height="100" HorizontalAlignment="Left" Margin="306,30,0,0" Name="rtfMain" VerticalAlignment="Top" Width="200" />
    
    
    rtfMain.Selection.Load(new FileStream(@"C:\temp\document.rtf", FileMode.Open), DataFormats.Rtf);
    

    【讨论】:

    • 这根本没有解决原始问题。我描述的问题是加载带有二进制图像数据的 RTF 文件。
    • rtf 是二进制的,不管它是否包含图像。我已经在二进制的 rtf 文件中尝试了使用图像和不使用图像。也许我的回答会帮助别人。欢呼
    • 汤姆,你在这里遗漏了一些东西。 RTF 规范允许将图像编码为二进制(例如 jpegblip\bin9889)或十六进制(例如 jpegblip)。这与文件本身如何存储在磁盘上无关,而是图像如何使用该文件进行编码。这个问题并不像你想象的那么简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2018-12-04
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多