web-dev-qa-db-ja.com

RichTextBoxに画像を挿入するにはどうすればよいですか?

私が見る例のほとんどは、クリップボードに貼り付けて貼り付けを使用するように言っていますが、それはクリップボードを上書きするため、あまり良くないようです。

1つの方法 を見ました。これは手動で画像をRTFに配置し、ピンボークを使用して画像をwmfに変換します。これが最良の方法ですか?私ができる簡単なことは?

26

最も簡単な方法は、RTFコードを変更して自分で画像を挿入することです。

RTFでは、画像は次のように定義されます。

'{'\pict(brdr?&shading?&picttype&pictsize&metafileinfo?)data '}'疑問符は、コントロールのWordがオプションであることを示します。 「データ」は、単に16進形式のファイルのコンテンツです。バイナリを使用する場合は、\ binコントロールWordを使用します。

例えば:

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

\ pict =画像グループを開始、\ pngblip = png画像\ picwX =画像の幅(Xはピクセル値)\ pichX =画像の高さ\ picwgoalX =希望する画像の幅(twip)

したがって、画像を挿入するには、画像を開いて、データを16進数に変換し、これらのデータを文字列にロードし、RTFコードを追加してRTF画像を定義する必要があります。これで、ドキュメントのRTFコードに挿入できる画像データを含む自己完結型の文字列ができました。最後の「}」を忘れないでください

次に、RichTextBox(rtbBox.Rtf)からRTFコードを取得し、適切な場所に画像を挿入して、rtbBox.Rtfのコードを設定します

遭遇する可能性のある問題の1つは、.NET RTBがRTF標準を十分にサポートしていないことです。

RTB内のRTFコードをすばやくテストし、それがどのように処理されるかを確認できる小さなアプリケーション*を作成しました。こちらからダウンロードできます: RTBテスターhttp://your-translations.com/toys )。

いくつかのRTFコンテンツ(たとえば、Wordから)を左側のRTFボックスに貼り付け、[RTFコードを表示]をクリックして、RTFコードを表示できます。 RTFボックスを右クリックするか、RTFコードを右RTBに貼り付けて[RTFコードを適用]をクリックして、左側に結果を表示します。

もちろん、必要に応じてコードを編集できます。これにより、RichTextBoxが必要なコマンドをサポートしているかどうかをテストしたり、RTF制御語の使用方法を学習したりするのに非常に便利です。

RTFの完全な仕様をオンラインでダウンロードできます。


NB 5分間で平手打ちしただけなので、ファイルを開いたり保存したり、ドラッグアンドドロップしたり、他の文明的なものを実装したりしませんでした。

53
Sylverdrag

次のコードを使用して、最初にクリップボードからデータを取得し、メモリに保存し、画像をクリップボードに設定し、リッチテキストボックスに貼り付け、最後にクリップボードにデータを復元します。

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は、それぞれ、ファイルを開くダイアログ、リッチテキストボックス、およびボタンコントロールです。

11
Bibek Dahal
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);
            }
        }
    }
6
ashwin

リッチテキストコントロールをハックするために私が行うことは次のとおりです。

ワードパッドまたはMS-Wordに必要な画像を挿入します。ファイルを「rtf」として保存します。メモ帳でrtfファイルを開き、生のrtfコードを確認します。必要なタグとものをリッチテキストボックスの「rtf」プロパティにコピーします(既存のテキストに追加します)。

いくつかの試行錯誤が伴いますが、機能します。

C#では、必要なrtfコードでプレースホルダーStringBuilderオブジェクトを使用します。次に、画像パスを追加します。

これは、RTF構文を学ぶ必要がないための回避策です。

4
Sesh

新しいスレッドに投稿した自分のバージョン。ここで検索して投稿する必要があったようです。とにかく、クリップボードを再度使用すると、非常に簡単です。

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

    }
}
1
SandraTinch

私がやったのは、c#で小さなpictureBoxコントロールを作成し、それを隠すのに十分な大きさの別のオブジェクトの後ろに隠れるようにすることだけでした。次に、画像を挿入するボタンを作成し、pictureBoxに画像をロードし、それを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
Larryrl

C++を使用している場合、その方法はOLEを使用します。具体的には、GoogleでImageDataObjectを検索すると、C++コードにHBITMAPをRTFコントロールに挿入する方法が表示されます。1つのリンクは here です。

さて、これがどのように.Netコードに変換されるかはわかりません。私は現在、詳細について作業する時間がありません。

0
Joel Lucsy

品質を損なうことなく画像を挿入し、透明な画像/ 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();
                }
0
Sourcephy

私もこの同じタスクのために何かを探していて、これを見つけました->

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

任意のタイプのRTF必要なテキストを生成してから、必要に応じて使用できます。使用されている画像タイプ(jpg/jpeg/pngなど)を自動検出する非常によく構成された例急いでいるのなら、これは素晴らしいRTFジェネレーターです!

0
jackocurly0074