2011-11-03 137 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")); 
}