C# 在C语言的RTF文档中插入图像#

C# 在C语言的RTF文档中插入图像#,c#,.net,richtextbox,rtf,C#,.net,Richtextbox,Rtf,我正在创建一个RichTextBox子类,可以轻松插入图像。我引用了start,但无法使生成的RTF字符串正常工作。当我尝试设置RTB的SelectedRtf时,错误为“文件格式无效”。以下是我的代码: internal void InsertImage(Image img) { string str = @"{\pict\pngblip\picw24\pich24 " + imageToHex(img) + "}"; this.SelectedRtf = str; //

我正在创建一个RichTextBox子类,可以轻松插入图像。我引用了start,但无法使生成的RTF字符串正常工作。当我尝试设置RTB的SelectedRtf时,错误为“文件格式无效”。以下是我的代码:

internal void InsertImage(Image img)
{
    string str = @"{\pict\pngblip\picw24\pich24 " + imageToHex(img) + "}";

    this.SelectedRtf = str;    // This line throws the exception
}

private string imageToHex(Image img)
{
    MemoryStream ms = new MemoryStream();
    img.Save(ms, ImageFormat.Png);

    byte[] bytes = ms.ToArray();

    string hex = BitConverter.ToString(bytes);
    return hex.Replace("-", "");
}
我已经看到了我正在尝试做的工作示例,但是使用了wmetafiles,但是我不希望使用这种方法。有什么想法吗

谢谢,

Jared

也许这是一种幼稚的方法,但我只是使用写字板将PNG插入RTF文档中。下面是第一个区块:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs22 testing\par
\par
\pard\sa200\sl240\slmult1{\pict\wmetafile8\picw27940\pich16378\picwgoal8640\pichgoal5070 
0100090000035af60e00000031f60e0000000400000003010800050000000b0200000000050000
000c026b022004030000001e000400000007010400040000000701040031f60e00410b2000cc00
6b022004000000006b0220040000000028000000200400006b020000010018000000000020ec1d
0000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffff

如您所见,即使使用PNG文件格式,图像标题也以\pict\wmetafile8开头。尝试将标题更改为该格式,看看是否有效。

我放弃了手动插入RTF的尝试,决定使用剪贴板方法。我从这种类型的解决方案中发现的唯一危害是它删除了剪贴板上的内容。我只是在粘贴图像之前保存了它们,然后将其设置回原样:

internal void InsertImage(Image img)
{
    IDataObject obj = Clipboard.GetDataObject();
    Clipboard.Clear();

    Clipboard.SetImage(img);
    this.Paste();

    Clipboard.Clear();
    Clipboard.SetDataObject(obj);
}

工作起来很漂亮。

RichTextBox不支持PNG,它支持WMF-但这不是C中的变体。。RichTextBox还支持BMP格式的图像-这对于C#来说是个好主意,因为位图是标准的.Net类。

插入图像可以正常工作,但是在Win8 x64中,剪贴板内容在插入后不会恢复。在XP中它可以工作。