【问题标题】:How can I insert an image into a RichTextBox?如何将图像插入 RichTextBox?
【发布时间】:2010-10-07 06:29:03
【问题描述】:

我看到的大多数示例都说将其放在剪贴板上并使用粘贴,但这似乎不是很好,因为它会覆盖剪贴板。

我确实看到one method 使用 pinvoke 手动将图像放入 RTF 以将图像转换为 wmf。这是最好的方法吗?有没有更直接的事情我可以做?

【问题讨论】:

  • 您可以将图像粘贴 (Ctrl+V) 到RichTextBox - 不过这很有趣;当我将RichTextBox RTF 属性保存到文件而图像已经粘贴到 RichTextBox 时,它似乎也将图像保存在RTF 也是如此。(我使用 RichTextBox.Load() 重新加载了 RTF,它从保存的 RTF 中加载了图像)

标签: c# vb.net image richtextbox rtf


【解决方案1】:

使用剪贴板插入代码后,输入Clipboard.Clear();。它运行良好,它不会清除所有内容,只清除最后添加到剪贴板的项目。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

几个小时寻找解决方案以在不损失质量的情况下插入图像并用透明图像/png修复灰色背景

                // assuming the image is in your Resources
                var img = Resources.ImageWithTransparentBckgrnd;
                var g = Graphics.FromImage(img);
                using (var ms = new MemoryStream())
                {
                    img.Save(ms, ImageFormat.Png);
                    IntPtr ipHdc = g.GetHdc();
                    Metafile mf = new Metafile(ms, ipHdc);
                    g = Graphics.FromImage(mf);
                    g.FillEllipse(Brushes.White, 0, 0, 16, 16); // size you want to fill in
                    g.Dispose();
                    mf.Save(ms, ImageFormat.Png);
                    IDataObject dataObject = new DataObject();
                    dataObject.SetData("PNG", false, ms);
                    Clipboard.SetDataObject(dataObject, false);
                    richTextBox1.Paste();
                    SendKeys.Send("{RIGHT}");
                    richTextBox1.Focus();
                }

【讨论】:

    【解决方案3】:

    我在新线程中发布的我自己的版本,显然我应该在这里搜索并发布它。无论如何,再次使用剪贴板,非常容易。

    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();
            }
    
        }
    }
    

    【讨论】:

      【解决方案4】:

      我所做的只是在 c# 中制作了一个小的图片框控件,并确保它隐藏在另一个足够大的对象后面以隐藏它。然后我做了一个按钮来插入图片,它用图片加载图片框,然后将它放入richTextBox,然后清除图片框控件。

      这是代码。

       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();
      
                  }
          }
      }
      

      【讨论】:

        【解决方案5】:

        我也在寻找相同任务的东西并找到了这个 ->

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

        您可以生成您想要的任何类型的 RTF 文本,然后随意使用它。结构非常好的示例,它将自动感知正在使用的图像类型(jpg/jpeg/png 等)并适用于我一直在使用的图像文件。如果您赶时间,那么这是一个很棒的 RTF 生成器!

        【讨论】:

        • 这应该被选为答案:)
        【解决方案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);
                    }
                }
            }
        

        【讨论】:

        • == true 确实是我见过的最没用的代码。
        【解决方案7】:

        我使用下面的代码首先从剪贴板中获取数据,保存到内存中,设置剪贴板中的图像,粘贴到富文本框中,最后恢复剪贴板中的数据。

        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 分别是打开文件对话框、富文本框和按钮控件。

        【讨论】:

        • 说实话,我对这个解决方案持怀疑态度。我的意思是,如果您已经在剪贴板上有图像(在我的情况下),那么将其从剪贴板上取下,然后将其重新放回不应该做任何事情。但不知何故,这个确切的把戏就像一场梦。谢谢!
        • 如果 Richtextbox 只读属性设置为 true 会发生什么?此剪贴板方法将失败。
        • @Jerry:你误会了。开始时剪贴板上的数据不是 insert-image-into-richtext 过程的一部分。 Bibek 的回答具有“按照你发现它们的方式放回原样”的逻辑。
        • 我认为将剪贴板数据设置回之前的状态实际上并不奏效。相反,它是空的。
        【解决方案8】:

        如果您使用的是 C++,则可以通过 OLE 来实现。更具体地说,如果您在 Google 上搜索 ImageDataObject,它将显示 C++ 代码如何将 HBITMAP 插入 RTF 控件。一个链接是here

        现在,我不知道这如何转化为 .Net 代码。我目前没有时间研究细节。

        【讨论】:

          【解决方案9】:

          这是我破解富文本控件的方法:

          在写字板或 MS-WORD 中插入所需的图像。将文件另存为“rtf”。在记事本中打开 rtf 文件以查看原始 rtf 代码。将所需的标签和内容复制到富文本框的“rtf”属性(附加到现有文本)。

          涉及一些试验和错误,但有效。

          在 C# 中,我使用带有必要 rtf 代码的占位符 StringBuilder 对象。然后我只是附加图像路径。

          这是一种无需学习 RTF 语法的解决方法。

          【讨论】:

          • 我从早上开始就在搜索“如何在 Richtextbox 中插入图像”,但一切都是范。阅读此答案后,我在不到 180 秒的时间内完成了它。为你 +1。
          【解决方案10】:

          最直接的方法是自己修改 RTF 代码来插入图片。

          在RTF中,图片是这样定义的:

          '{' \pict (brdr?& shading?& picttype & pictsize & metafileinfo?) 数据'}' 问号表示控制字是可选的。 “数据”只是十六进制格式的文件内容。如果要使用二进制,请使用 \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 tester (http://your-translations.com/toys)。

          您可以将一些 RTF 内容(例如来自 Word)粘贴到左侧 RTF 框中,然后单击“显示 RTF 代码”以在右侧 RTF 框中显示 RTF 代码,也可以将 RTF 代码粘贴到右侧RTB 并单击“应用 RTF 代码”以在左侧查看结果。

          你当然可以随意编辑代码,这样可以很方便的测试RichTextBox是否支持你需要的命令,或者学习如何使用RTF控制字。

          您可以在线下载 RTF 的完整规范。


          NB这只是我在5分钟内拍打的小东西,所以我没有实现文件打开或保存,拖放或其他文明的东西。

          【讨论】:

          • 我无法让 RTB 显示 png,但至少它确实显示了 wmf。
          • 1 "twip" = 1/20 个点。 1 点 ~ 1.333 像素(这取决于屏幕分辨率;如今大多数显示器的原始分辨率为每英寸 96 像素,所以这一点成立)
          • 据我所知,RichTextBox(以及 RTBTester)不接受 \pngblip。它只接受 \wmetafile[8]。有关更完整的说明,请参阅此参考:codeproject.com/Articles/4544/…。我知道如果我从 RichTextBox 保存 RTF,那么它可以有 \pngblip。但是,将 {\pngblip....} 构造复制到 RTBTester 不会显示图像。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-19
          • 2010-11-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多