Вставьте изображение в 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. Попробуйте изменить заголовок на этот формат и посмотрите, работает ли он.

Другие вопросы по тегам