Вставьте изображение в RTF-документ в C#
Я создаю подкласс RichTextBox, который может легко вставлять изображения. Я упомянул этот вопрос для начала, но я не могу заставить сгенерированную строку RTF работать. Когда я пытаюсь установить SelectedRtf RTB, он выдает ошибку "Формат файла недопустим". Вот мой код:
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("-", "");
}
Я видел рабочие примеры того, что я пытаюсь сделать, но используя wmetafiles, но я бы предпочел не использовать этот метод. Есть идеи?
Спасибо,
Джаред
3 ответа
Я прекратил попытки вставлять RTF вручную и решил использовать подход с буфером обмена. Единственный ущерб, который я смог найти в этом типе решения, заключался в том, что он уничтожил содержимое буфера обмена. Я просто сохранил их, прежде чем вставить изображение, а затем снова установить его так:
internal void InsertImage(Image img)
{
IDataObject obj = Clipboard.GetDataObject();
Clipboard.Clear();
Clipboard.SetImage(img);
this.Paste();
Clipboard.Clear();
Clipboard.SetDataObject(obj);
}
Работает красиво.
RichTextBox не поддерживает PNG, он поддерживает WMF - но это не вариант в C#. Также RichTextBox поддерживает изображения в формате BMP - это хорошая идея для C#, потому что Bitmap - это стандартный класс.Net.
Возможно, это наивный подход, но я просто использовал WordPad для вставки PNG в документ RTF. Ниже первый кусок:
{\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
Как видите, даже в формате PNG заголовок изображения начинается с \pict\wmetafile8. Попробуйте изменить заголовок на этот формат и посмотрите, работает ли он.