2011-11-03 198 views
0

我试图将图像插入富文本文件格式文本文件。我已经阅读了一些答案,但我没有把它说得很对。我使用的代码如下:将图像插入在.NET

  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); 
      } 
+0

大概应该提一下哪里出了问题,例如你是否得到了一些异常或错误信息? – AaronLS

+0

您是否看到我的答案更新? – arx

回答

2

当你从字节数组构建字符串,要附加的字节数据的字符串版本,即“76”,“127”,“90后”等

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

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

OUTPUT:

"664" 

解决方案:将您的字节数组到base64String与Convert.ToBase64String并存储在文件中。

像这样....

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或者用两个单独的操作书写标题和图像数据。

+0

这改变了格式,但我仍然看不到图像。 –

1

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

更新

RTF使用未分离两位的十六进制值与CR/LF每128个字符(或64个字节)。像这样的应该做的伎俩:

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]); 
    } 
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")); 
}