Подтвердить что ты не робот

Как вставить изображение в RichTextBox?

Большинство примеров, которые я вижу, говорят, чтобы положить их в буфер обмена и использовать вставку, но это не кажется очень хорошим, потому что он перезаписывает буфер обмена.

Я видел один метод, который вручную помещает изображение в RTF с помощью pinvoke для преобразования изображения в wmf. Это лучший способ? Есть ли еще более очевидная вещь, которую я могу сделать?

4b9b3361

Ответ 1

Самый простой способ - изменить RTF-код, чтобы вставить изображение самостоятельно.

В RTF изображение определяется следующим образом:

'{'\pict (brdr? and shading? and 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 picture \ picwX = ширина изображения (X - значение пикселя) \ pichX = высота изображения \ picwgoalX = желаемая ширина изображения в твитах

Итак, чтобы вставить изображение, вам просто нужно открыть изображение, преобразовать данные в шестнадцатеричный, загрузить эти данные в строку и добавить коды RTF вокруг него, чтобы определить изображение RTF. Теперь у вас есть личная строка с данными изображения, которые вы можете вставить в RTF-код документа. Не забудьте закрыть "}"

Затем вы получите RTF-код из RichTextBox (rtbBox.Rtf), вставьте изображение в нужное место и установите код rtbBox.Rtf

Одна из проблем, с которыми вы можете столкнуться, заключается в том, что .NET RTB не очень хорошо поддерживает стандарт RTF.

Я только что сделал небольшое приложение *, которое позволяет вам быстро протестировать некоторый RTF-код внутри RTB и посмотреть, как он его обрабатывает. Вы можете скачать это здесь: тестер RTB (http://your-translations.com/toys).

Вы можете вставить некоторый RTF-контент (например, из Word) в левое поле RTF и нажать "Показать RTF-коды", чтобы отобразить RTF-коды в правом поле RTF, или вы можете вставить RTF-код вправо RTB и нажмите "Применить RTF-коды", чтобы увидеть результаты с левой стороны.

Вы можете, конечно, редактировать коды по своему усмотрению, что делает его весьма удобным для проверки того, поддерживает ли RichTextBox нужные вам команды или узнает, как использовать управляющие слова RTF.

Вы можете загрузить полную спецификацию для RTF онлайн.


NB Это всего лишь небольшая вещь, которую я ударил вместе за 5 минут, поэтому я не реализовал файл, не открывал или не сохранял, не перетаскивал или не использовал другие цивилизованные вещи.

Ответ 2

Я использую следующий код, чтобы сначала получить данные из буфера обмена, сохранить его в памяти, установить изображение в буфер обмена, вставить его в Rich Text Box и, наконец, восстановить данные в Clipboard.

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 - это Open File Dialog, Rich Text Box и кнопки управления соответственно.

Ответ 3

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

Ответ 4

Вот что я делаю, чтобы взломать расширенный текстовый контроль:

Вставьте нужное изображение в текстовую панель или MS-WORD. Сохраните файл как 'rtf'. Откройте файл rtf в блокноте, чтобы увидеть необработанный код rtf. Скопируйте необходимые теги и прочее в свойство 'rtf' вашего Rich Text Box (добавьте существующий текст).

Существует несколько проб и ошибок, но работает.

С С# я использую объекты StringBuilder для хранения места с необходимым кодом rtf. Затем я просто добавляю путь к изображению.

Это обходной путь для того, чтобы не изучать синтаксис RTF.

Ответ 5

Моя собственная версия, которую я опубликовал в новом потоке, по-видимому, мне следовало бы найти и опубликовать ее здесь. Во всяком случае, с помощью буфера обмена снова очень легко.

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

    }
}

Ответ 6

Если вы были на С++, способ сделать это через OLE. Более конкретно, если вы ищете Google для ImageDataObject, он покажет код на С++, как вставить HBITMAP в RTF-элемент управления. Одна ссылка здесь.

Теперь, как это переводится в .Net-код, я не знаю. В настоящее время у меня нет времени для работы по деталям.

Ответ 7

Я тоже искал что-то для этой же задачи и нашел это →

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

Вы можете сгенерировать любой текст RTF, который вы хотите, а затем использовать его, как хотите. Очень хорошо структурированный пример, который автоматически распознает используемый тип изображения (jpg/jpeg/png и т.д.) И будет работать с файлами изображений, которые я использовал. Если вы спешите, это отличный генератор RTF!

Ответ 8

Все, что я сделал, это сделать небольшой элемент управления 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();

            }
    }
}