Insert an image into RTF document in C#
I am creating a RichTextBox subclass that can insert images easily. I referred to this que开发者_StackOverflowstion 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,
JaredI 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.
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.
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.
精彩评论