Member 13032047 Ответов: 1

Как скопировать и вставить изображение из файла .rtf в поле rich text box в поле picture


Что мне нужно сделать:

Всем привет! Мне нужно скопировать изображение в буфер обмена из файла .rtf, открытого в поле форматированного текста. Затем вставьте изображение в графическое поле. Я долго искал, и копирование из графического окна(PBX) для вставки в Форматированное текстовое поле(RTB) очень распространено. Но, кажется, я не могу найти ничего, что говорит мне, как скопировать и вставить другой способ, кроме кода, которым я делюсь ниже? Может ли кто-нибудь помочь мне в этом, например, пример кода, добавить к коду, которым я поделился, ссылку и т. д.? Любая помощь будет очень признательна!!! Я забыл упомянуть, что работаю в VB.NET, VS2015, и код, которым я поделился, является переводом с C#(?).

Что я уже пробовал:

Сначала я вставляю скриншот своего приложения в RTB. Затем, используя следующий код, я могу успешно скопировать изображение в буфер обмена и вставить его в АТС. Я также могу сделать то же самое, скопировав изображение с веб-страницы, вставив его в RTB, скопировав изображение в буфер обмена, а затем вставив его в АТС. Чтобы проверить это, я делаю снимок экрана или копирую изображение с веб-страницы, вставляю его в RTB моего приложения, очищаю и проверяю, что буфер обмена пуст, чтобы убедиться, что моя процедура копирования действительно работает, копирую изображение из RTB, проверяю буфер обмена, чтобы убедиться, что изображение было скопировано, а затем вставляю изображение в АТС.

Однако, хотя это отлично работает для изображений, которые я только что захватил таким образом, похоже, что это не работает для изображения, содержащегося в файле .rtf, который я открываю в своем приложении??? В файле .rtf есть одно изображение, а затем какой-то текст. Процедура копирования, которую я использую, на самом деле копирует изображение в открытый файл .rtf в RTB, но не копирует изображение в буфер обмена??? Теперь я могу вставить скопированное изображение в RTB, создав дубликат изображения, но оно не будет вставлено в АТС, потому что вставка зависит от того, какое изображение находится в буфере обмена.

мой вопрос:
1. Как скопировать изображение (то есть в соответствии с тем, что мне нужно сделать (выше) в буфер обмена, а затем вставить его в поле изображения?
2. Как определить, какое изображение находится в файле .rtf, когда я открываю его в своем приложении? Я уже пробовал: RichTextBox1.SelectionType.ToString, который приводит к типу: Object. Я также могу обнаружить изображение с помощью: If Description.Rtf.Contains("\pict\wmetafile8\") Потом Я.Описание.[Select](0, 1), но как мне получить тип изображения, чтобы скопировать его в буфер обмена?
3. Когда я выбираю и копирую изображение в файле .rtf, почему оно не копируется в буфер обмена? Буфер обмена пуст, но я могу вставить изображение обратно в RTB??? Скопировано ли изображение в память??? Как получить скопированное изображение в буфер обмена? Или я могу каким-то образом получить скопированное изображение для вставки в АТС???

код:

'PROJECT: Copy an image from Richtextbox and paste it in a Picturebox
        'SOURCE CODE (Part 1): https://social.msdn.microsoft.com/forums/en-US/be9c1008-0f7a-4fdd-9736-7698d2f90eb9/copy-an-image-from-richtextbox-and-paste-it-in-a-picturebox

'Copy The Image To Clipboard:
Clipboard.Clear()
        Me.RichTextBox1.[Select](0, 1)

        If (Me.RichTextBox1.SelectionType And RichTextBoxSelectionTypes.Object) = RichTextBoxSelectionTypes.Object Then
            RichTextBox1.Copy()
        End If

'Paste The Image Into PBX From Clipboard:
        Dim idata As IDataObject = Clipboard.GetDataObject()

        If idata.GetDataPresent("System.Drawing.Bitmap") Then
            Dim imgObject As Object = idata.GetData("System.Drawing.Bitmap")

            If imgObject IsNot Nothing Then
                Dim img As Image = TryCast(imgObject, Image)

                If img IsNot Nothing Then
                    PictureBox1.Image = img
                End If
            End If
        End If

1 Ответов

Рейтинг:
1

Luc Pattyn

Привет,

получить вещи из RichTextBox не так-то просто.
это было предметом вопроса Ранее на этом самом сайте здесь:Копирование / извлечение изображений из richtextbox[^]

Несколько фактов:
- при нажатии кнопки "Print Screen" изображение типа Bitmap отправляется в буфер обмена;
- вы можете узнать, что в данный момент находится в буфере обмена, используя некоторые методы/свойства Clipboard Class
- вы можете поместить изображение в PictureBox двумя способами, используя его Image свойство (для изображений в памяти) или его ImageLocation свойство (для файлов).
- вам не нужен PictureBox для отображения изображения; вы можете установить его в качестве фонового изображения на большинстве элементов управления, включая панель и форму.
- RichTextBox может возвращать все свое содержимое в виде строки (свойство Text, даже если оно включает в себя другие элементы, кроме текста) или в виде файла (метод SaveFile); он использует то же самое расширение .rtf, что и Wordpad (и Word понимает). Этот формат довольно громоздкий...
- если примеры используют C#, не волнуйтесь, C# и VB.NET они очень похожи, их отличает главным образом синтаксическое различие


Мой вывод: я бы постарался избегать RichTextBox, если это вообще возможно; когда у вас есть изображение в буфере обмена, вы можете поместить его в PictureBox, панель и многое другое... не проходя через трудности rtf. Если вам нужно извлечь изображение из существующего rtf, используйте информацию, на которую я ссылался, или google еще немного...

:)


Luc Pattyn

ОК Я предлагаю вам начать читать этот.

И тогда вам придется манипулировать строкой rtf (свойство Text); вам нужно либо найти, прочитать и полностью понять документ спецификации RTF, либо поэкспериментировать с несколькими документами RTF, которые вы создаете самостоятельно с помощью WordPad (избегайте Word, если можете, он всегда генерирует тонну кода! Если только вам не придется поддерживать и это тоже...).

Однажды я написал код, который добавляет изображение в RTF-документ; он использовал растровое изображение и некоторый машинный код, чтобы преобразовать его в Метафайл. У меня нет кода для обратной дороги.

Member 13032047

Hi Luc, Thanks for your suggestions! The main focus of the app I'm building is the description editor (i.e. RTB) into which a screenshot is pasted, then the user can use a dummy outline to describe the screenshot. The result is saved as an .rtf file. When the .rtf file is opened, I need to extract the image for each individual .rtf file on the fly. Therefore, avoiding the use of an RTB isn't possible. My problem is not assigning an image from the clipboard to a control, but how to get the image from an .rtf file open in the RTB to the clipboard! Once the image is in the clipboard it's not difficult to assign it to a control. Also, I have experimented with my own code and searched the internet for code to discover which type of image is in the open .rtf file, but haven't found any code to achieve this? I will continue looking at the NRTFTree library until I can understand it. But, I still don't have answers to my questions which I feel are essential to achieve what I'm trying to do! If anyone has any code examples I would be very grateful!

Luc Pattyn

Как я уже говорил, Посмотрите на спецификацию RTF и поэкспериментируйте.
Гугл привел меня сюда этот показывая, что есть много возможностей (как всегда с чем-нибудь Microsoft), и история никогда не заканчивается.

Member 13032047

Hi Luc, I looked at the Wikipedia section on images, RTF, etc. I have looked before at the RTF spec and can't seem to glean (or even understand:-) anything from it about images that helps. I already have built a working solution for generating to and converting from RTF Markup code. It works for screenshots (i.e. bitmaps) or web images, but not for jpg's, etc., (an answer I need for the future)! I can both generate the RTF markup from an image together with text in a RTB, clear the RTB and convert from the RTF markup to restore the same image and text to the RTB. I started working on this because someone suggested that it would resolve the issue of image quality when resizing images. This is true and my solution resolves these issues. The app I am now building uses the code from that solution. Extracting just the image from the generated RTF Markup could be a way to display the images from the outlines being browsed in the app, but I have no idea how to achieve this?

Member 13032047

Эй, Люк, я пытаюсь ответить на твои ответы, но все сообщения внезапно исчезли? Я посмотрел в конфигурации, и опция предварительного просмотра сообщений проверена??? Не знаете, где искать, чтобы увидеть сообщения???

Luc Pattyn

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

До свидания всем вам.