在.NET中将图像插入RTF文件

时间:2011-11-03 23:08:04

标签: c# .net image rtf

我正在尝试将图像插入到富文本文件中。我已经阅读了一些答案,但我没有把它弄好。我使用的代码如下:

            string[] imgfiles = Directory.GetFiles(dirin, "*.png");
            foreach (string imageFileName in imgfiles)
            {
                var someImage = Image.FromFile(imageFileName);
                MemoryStream memStream = new MemoryStream();
                someImage.Save(memStream, ImageFormat.Png);
                byte[] imgbytedata = memStream.ToArray();
                memStream.Close();
                memStream.Dispose();
                StringBuilder sb = new StringBuilder();
                for(int i = 0; i < imgbytedata.Length; i++)
                {
                    sb.Append(imgbytedata[i]);
                }
                var imgstr = "{" + string.Format("\\pict\\pngblip\\picw{0}\\pich{1}\\picwgoal{0}\\pichgoal{1}\\bin binary {2}", someImage.Width, someImage.Height, sb.ToString()) + "}";
                sb = null;

                rtb.AppendText(imgstr);
            }

3 个答案:

答案 0 :(得分:2)

当您从字节数组构建字符串时,您将附加字节数据的字符串版本,即“76”,“127”,“90”等。

一个主要问题(我不知道这是否是您的实际问题)是当您尝试阅读它时,读者不知道如何从中提取字节。举个例子......

var c = new StringBuilder();
c.Append(6);
c.Append(64);
Console.WriteLine(c.ToString());

输出:

"664"

解决方案:将您的字节数组转换为带有Convert.ToBase64String的base64String,并将其存储在文件中。

喜欢这样......

var c = Convert.ToBase64String(new byte[] {6, 64});
Console.WriteLine(c);
Console.WriteLine();
foreach (var entry in Convert.FromBase64String(c))
    Console.WriteLine(entry);

输出

"BkA="

6
64

另一个潜在的问题:我听说过使用string.Format特别大的字符串可能会导致问题。我可以理解一个用大图像文件生成内存异常的情况。

解决方案:请勿使用string.Format。首先将标题附加到StringBuilder或在两个单独的操作中写入标题和图像数据。

答案 1 :(得分:1)

您没有以任何方式分离字节值。例如,假设您的图像只有四个字节16,23,240和1,那么您会将“16232401”附加到字符串,这显然是错误的。我不知道RTF期望什么,但你需要分隔符或两位十六进制值或base64或其他。

<强>更新

RTF使用未分离的两位十六进制值,每128个字符(或64个字节)使用CR / LF。这样的事情可以解决问题:

    StringBuilder sb = new StringBuilder();
    // TODO: Append image headers here.
    // Then append image data:
    for (int i = 0; i != imgbytedata.Length; ++i)
    {
        if ((i % 64) == 0)
        {
            sb.AppendLine();
        }
        sb.AppendFormat("{0:x2}", imgbytedata[i]);
    }

答案 2 :(得分:0)

因此提问者希望将图像嵌入到RTF中。

我认为这可以解决您的问题。用这个替换你的for循环。

for(int i = 0; i < imgbytedata.Length; i++)
{
    if (i % 64 == 0)
          sb.Append(Environment.NewLine);
    sb.Append(imgbytedata[i].ToString("X"));
}