web-dev-qa-db-fra.com

Comment puis-je insérer une image dans un RichTextBox?

La plupart des exemples que je vois disent de le mettre dans le presse-papiers et d'utiliser coller, mais cela ne semble pas très bon, car cela écrase le presse-papiers.

J'ai vu une méthode qui met manuellement l'image dans le RTF en utilisant un pinvoke pour convertir l'image en wmf. Est-ce le meilleur moyen? Y a-t-il une chose plus simple que je puisse faire?

25
Daniel LeCheminant

Le moyen le plus simple serait de modifier le code RTF pour insérer l'image vous-même. 

En RTF, une image est définie comme ceci:

'{'\pict (brdr? & shading? & picttype & pictsize & metafileinfo?) data '}' Un point d'interrogation indique que le contrôle Word est facultatif . "data" est simplement le contenu du fichier dans format hexadécimal. Si vous voulez utiliser le binaire, utilisez le mot de contrôle\bin. 

Par exemple:

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

\ pict = démarre un groupe d'images, \pngblip = image png \picwX = largeur de l'image (X est la valeur en pixels) \pichX = hauteur de l'image \picwgoalX = désiré largeur de l'image en twips

Donc, pour insérer une image, il vous suffit d'ouvrir votre image, de convertir les données en hexadécimal, de charger ces données dans une chaîne et d'ajouter les codes RTF autour d'elle pour définir une image RTF. Maintenant, vous avez une chaîne autonome avec des données d'image que vous pouvez insérer dans le code RTF d'un document. N'oubliez pas la fermeture "}"

Ensuite, vous obtenez le code RTF de votre RichTextBox (rtbBox.Rtf), insérez la photo au bon emplacement et définissez le code de rtbBox.Rtf.

Un problème que vous pouvez rencontrer est que .NET RTB ne supporte pas très bien le standard RTF. 

Je viens de faire une petite application * qui vous permet de tester rapidement du code RTF dans un RTB et de voir comment il le gère. Vous pouvez le télécharger ici: Testeur RTB ( http://votre-translations.com/toys ). 

Vous pouvez coller du contenu RTF (de Word, par exemple) dans la zone de gauche RTF et cliquer sur "Afficher les codes RTF" pour afficher les codes RTF dans le menu déroulant. à droite de la case RTF, ou vous pouvez coller le code RTF dans le RTB droit et cliquer sur "Appliquer les codes RTF" pour afficher les résultats à gauche. 

Vous pouvez bien sûr éditer les codes à votre guise, ce qui est très pratique pour vérifier si RichTextBox prend en charge les commandes dont vous avez besoin ou pour apprendre à utiliser les mots de contrôle RTF. 

Vous pouvez télécharger une spécification complète pour RTF en ligne.


NB C’est juste une petite chose que j’ai giflé en 5 minutes, je n’ai donc pas implémenté d’ouverture ou de sauvegarde de fichiers, de glisser-déposer ou d’autres tâches civilisées. 

50
Sylverdrag

J'utilise le code suivant pour obtenir d'abord les données du Presse-papiers, les enregistrer en mémoire, définir l'image dans le Presse-papiers, les coller dans la zone de texte enrichi et enfin restaurer les données dans le Presse-papiers.

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 et Button1 sont respectivement des contrôles de boîte de dialogue Ouvrir un fichier, Zone de texte enrichi et Bouton.

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

Voici ce que je fais pour pirater le contrôle de texte enrichi:

Insérez l'image requise dans WordPad ou MS-Word. Enregistrez le fichier en tant que "rtf". Ouvrez le fichier RTF dans le Bloc-notes pour afficher le code RTF brut. Copiez les balises et les éléments requis dans la propriété 'rtf' de votre zone de texte enrichi (ajoutez du texte existant). 

Il y a quelques essais et erreurs impliqués mais cela fonctionne.

Avec C #, j'utilise des objets StringBuilder avec des espaces réservés avec le code RTF nécessaire. Ensuite, je viens d'ajouter le chemin de l'image.

Il s'agit d'une solution de contournement pour ne pas avoir à apprendre la syntaxe RTF.

4
Sesh

Ma propre version que j'ai postée dans un nouveau fil de discussion, apparemment, j'aurais dû chercher et postée ici. Quoi qu'il en soit, en utilisant le presse-papiers à nouveau, très facile.

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

Tout ce que je faisais était de créer un petit contrôle pictureBox en c # et de m'assurer qu'il était caché derrière un autre objet suffisamment grand pour le cacher. Ensuite, j'ai créé un bouton pour insérer une image, et il a chargé le PictureBox avec l'image, puis l'a placé dans le richTextBox, puis le contrôle du contrôle PictureBox est effacé.

Voici le code.

 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

Si vous étiez en C++, vous pouvez le faire via OLE. Plus précisément, si vous recherchez ImageDataObject dans Google, il indiquera au code C++ comment insérer un HBITMAP dans le contrôle RTF. Un lien est ici .

Maintenant, comment cela se traduit en code .Net, je ne sais pas. Je n'ai actuellement pas le temps de travailler à travers les détails.

0
Joel Lucsy

Plusieurs heures de navigation pour trouver une solution permettant d’insérer une image sans perte de qualité et de fixer l’arrière-plan gris avec une image/png transparente.

                // 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

Je cherchais aussi quelque chose pour cette tâche et j'ai trouvé ceci ->

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

Vous pouvez générer tout type de texte RTF de votre choix, puis l’utiliser à votre guise. Exemple très bien structuré qui détectera automatiquement le type d'image utilisé (jpg/jpeg/png, etc.) et fonctionnera pour les fichiers image que j'utilise Si vous êtes pressé, il s'agit d'un excellent générateur RTF!

0
jackocurly0074