Jared
Jared

Reputation: 2133

Insert an image into RTF document in C#

I am creating a RichTextBox subclass that can insert images easily. I referred to this question to start, but I can't get the generated RTF string to work. When I try to set the SelectedRtf of the RTB, it errors out with "File format is not valid." Here is my code:

internal void InsertImage(Image img)
{
    string str = @"{\pict\pngblip\picw24\pich24 " + imageToHex(img) + "}";

    this.SelectedRtf = str;    // This line throws the exception
}

private string imageToHex(Image img)
{
    MemoryStream ms = new MemoryStream();
    img.Save(ms, ImageFormat.Png);

    byte[] bytes = ms.ToArray();

    string hex = BitConverter.ToString(bytes);
    return hex.Replace("-", "");
}

I've seen working examples of what I'm trying to do, but using wmetafiles, but I would prefer not to use that method. Any ideas?

Thanks,
Jared

Upvotes: 4

Views: 9509

Answers (3)

Maxim Sautin
Maxim Sautin

Reputation: 131

RichTextBox doesn't support PNG, it supports WMF - but this isn't variant in C#. Also the RichTextBox supports images in BMP format - this is good idea for C#, because the Bitmap is standard .Net class.

Upvotes: 4

Jared
Jared

Reputation: 2133

I gave up trying to insert the RTF manually, and decided to use the clipboard approach. The only detriment I could find from this type of solution was that it wiped out the clipboard contents. I simply saved them before I paste the image, then set it back like so:

internal void InsertImage(Image img)
{
    IDataObject obj = Clipboard.GetDataObject();
    Clipboard.Clear();

    Clipboard.SetImage(img);
    this.Paste();

    Clipboard.Clear();
    Clipboard.SetDataObject(obj);
}

Works beautifully.

Upvotes: 8

RMD
RMD

Reputation: 3253

Perhaps this is a naive approach, but I just used WordPad to insert a PNG into an RTF document. Below is the first chunk:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs22 testing\par
\par
\pard\sa200\sl240\slmult1{\pict\wmetafile8\picw27940\pich16378\picwgoal8640\pichgoal5070 
0100090000035af60e00000031f60e0000000400000003010800050000000b0200000000050000
000c026b022004030000001e000400000007010400040000000701040031f60e00410b2000cc00
6b022004000000006b0220040000000028000000200400006b020000010018000000000020ec1d
0000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffff

As you can see, even with the PNG file format, the image header starts with \pict\wmetafile8. Try changing your header to that format and see if it works.

Upvotes: 2

Related Questions