2009-02-12 131 views
24

我看到的大多數示例都會將它放在剪貼板上並使用粘貼,但這看起來不太好,因爲它會覆蓋剪貼板。如何將圖像插入RichTextBox?

我確實看到one method手動將圖像插入RTF使用pinvoke將圖像轉換爲wmf。這是最好的方法嗎?有沒有更直接的事情可以做?

回答

47

最直接的方法是修改RTF代碼來自己插入圖片。

在RTF,畫面被定義如下:

'{' \ PICT(????BRDR &遮光& picttype & pictsize & metafileinfo)數據 '}' 的問號表示控制字是可選的。 「data」只是十六進制格式的文件內容。如果你想使用二進制,使用\ bin控制字。

例如:

{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860 hex data} 
{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860\bin binary data} 

\ PICT =啓動一個圖像組, \ pngblip = png圖片 \ picwX =畫面(X是像素值) \ pichX的寬度=的高度圖片 \ picwgoalX =所需的圖片緹

所以,插入圖片,你只需要打開你的圖片,將數據轉換爲十六進制,這些數據加載到一個字符串,並添加周圍的RTF代碼寬度定義一個RTF圖片。現在,您可以在文檔的RTF代碼中插入包含圖片數據的自包含字符串。不要忘了關閉「}」

接下來,你從你的RichTextBox(rtbBox.Rtf)獲取RTF代碼,插入圖片在適當的位置,並設置rtbBox.Rtf

的代碼

一您可能遇到的問題是.NET RTB對RTF標準沒有很好的支持。

我剛剛製作了一個小應用程序*,它可以讓您快速測試RTB中的一些RTF代碼並查看它如何處理它。你可以在這裏下載: RTB testerhttp://your-translations.com/toys)。

您可以將一些RTF內容(例如Word)粘貼到左RTF框中,然後單擊「顯示RTF代碼」以在右RTF框中顯示RTF代碼,或者可以將RTF代碼粘貼到右RTB並點擊「應用RTF代碼」查看左側的結果。

您當然可以編輯代碼,這樣可以非常方便地測試RichTextBox是否支持您需要的命令,或者學習如何使用RTF控制字。

您可以在線下載RTF的完整規格。


NB這只是我在5分鐘內拼湊一個小東西,所以我沒有實現文件打開或保存,拖放,或其他文明的東西。

+1

我無法讓RTB顯示PNG,但至少它確實顯示了WMF。 – 2009-11-08 13:32:15

+0

1「twip」= 1/20的一個點。 1點〜1.333像素(這取決於屏幕分辨率;今天大多數顯示器的原始分辨率爲每英寸96像素,所以這成立) – KeithS 2016-01-18 21:15:57

4

這是我做破解富文本控件:

插入在寫字板或MS-WORD所需要的圖像。將文件保存爲'rtf'。在記事本中打開rtf文件以查看原始rtf代碼。將所需標記&複製到Rich Text Box的「rtf」屬性(附加到現有文本)。

有一些試驗和錯誤,但涉及作品。

隨着C#,我用佔位符StringBuilder對象與必要的rtf代碼。然後我只是追加圖像路徑。

這是不必學習RTF語法的解決方法。

+3

這是我聽說過的最醜陋的解決方案。 – 2010-08-08 14:45:39

+0

我從早晨開始搜索「如何在Richtextbox中插入圖像」,但都是麪包車。讀完這個答案後,我已經在180秒內完成了。爲你+1。 – 2013-05-31 18:34:34

0

如果您使用C++,則通過OLE執行此操作。更具體地說,如果您搜索Google ImageDataObject,它將顯示C++代碼如何將HBITMAP插入到RTF控件中。一個鏈接是here

現在,這怎麼翻譯成.Net代碼,我不知道。我目前沒有時間通過​​細節工作。

6
private void toolStripButton1_Click(object sender, EventArgs e) 
    { 
     FileDialog fDialog = new OpenFileDialog(); 
     fDialog.CheckFileExists = true; 
     fDialog.CheckPathExists = true; 
     fDialog.RestoreDirectory = true; 
     fDialog.Title = "Choose file to import"; 
     if (fDialog.ShowDialog() == DialogResult.OK) 
     { 
      string lstrFile = fDialog.FileName; 
      Bitmap myBitmap = new Bitmap(lstrFile); 
      // Copy the bitmap to the clipboard. 
      Clipboard.SetDataObject(myBitmap); 
      DataFormats.Format format = DataFormats.GetFormat(DataFormats.Bitmap); 
      // After verifying that the data can be pasted, paste 
      if(top==true && this.rtTop.CanPaste(format)) 
      { 
       rtTop.Paste(format); 
      } 
      if (btmLeft == true && this.rtBottomLeft.CanPaste(format)) 
      { 
       rtBottomLeft.Paste(format); 
      } 
      if (btmCenter == true && this.rtBottomCenter.CanPaste(format)) 
      { 
       rtBottomCenter.Paste(format); 
      } 
      if (btmRight == true && this.rtBottomRight.CanPaste(format)) 
      { 
       rtBottomRight.Paste(format); 
      } 
     } 
    } 
11

我用下面的代碼首先從剪貼板中獲取數據,將其保存在內存中,在剪貼板中設定的圖像,將其粘貼在富文本框,並終於在剪貼板中恢復數據。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    OpenFileDialog1.Filter = "All files |*.*" 
    OpenFileDialog1.Multiselect = True 
    Dim orgdata = Clipboard.GetDataObject 

    If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 
     For Each fname As String In OpenFileDialog1.FileNames 
      Dim img As Image = Image.FromFile(fname) 
      Clipboard.SetImage(img) 
      RichTextBox1.Paste() 

     Next 
    End If 
    Clipboard.SetDataObject(orgdata) 
End Sub 

的OpenFileDailog1,RichTextBox1和Button1打開文件對話框,分別爲格式文本框和按鈕控件。

0

我也一直在尋找的東西完成相同的任務,發現了這個 - >

http://sourceforge.net/projects/netrtfwriter/

您可以生成任何類型的RTF文本的,你想,然後用它自己的喜好。結構非常好的例子,它會自動感知正在使用的圖像類型(jpg/jpeg/png等),併爲我一直使用的圖像文件工作。如果你匆忙,那麼這是一個偉大的RTF發電機!

0

我所做的只是在c#中創建一個小圖片框控件,並確保它隱藏在另一個足以隱藏它的對象後面。然後,我做了一個按鈕來插入一張圖片,並將圖片加載到圖片框中,然後將圖片放入richTextBox中,然後清除pictureBox控件。

這是代碼。

private void InsertPicture_Click(object sender, EventArgs e) 
    { 

        { 
      if (openFileDialog4.ShowDialog() == DialogResult.OK) 
      { 
       // Show the Open File dialog. If the user clicks OK, load the 
       // picture that the user chose. 
       pictureBox2.Load(openFileDialog4.FileName); 
       Clipboard.SetImage(pictureBox2.Image); 
       pictureBox2.Image = null; 
       this.richTextBox1.Paste(); 

      } 
    } 
} 
0

我自己的版本,我張貼在一個新的線程,顯然我應該搜索並張貼在這裏。無論如何,再次使用剪貼板,非常容易。

private void button1_Click(object sender, EventArgs e) 
    { 
     openFileDialog1.Filter = "Images |*.bmp;*.jpg;*.png;*.gif;*.ico"; 
     openFileDialog1.Multiselect = false; 
     openFileDialog1.FileName = ""; 
     DialogResult result = openFileDialog1.ShowDialog(); 
     if (result == DialogResult.OK) 
     { 
      Image img = Image.FromFile(openFileDialog1.FileName); 
      Clipboard.SetImage(img); 
      richTextBox1.Paste(); 
      richTextBox1.Focus(); 
     } 
     else 
     { 
      richTextBox1.Focus(); 
     } 

    } 
}