Вставьте изображение в документ RTF в C # - PullRequest
4 голосов
/ 09 марта 2011

Я создаю подкласс 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 ]

7 голосов
/ 10 марта 2011

Я отказался от попытки вставить RTF вручную и решил использовать подход с буфером обмена.Единственный ущерб, который я смог найти в этом типе решения, заключался в том, что он уничтожил содержимое буфера обмена.Я просто сохранил их перед тем, как вставить изображение, а затем снова установил его так:

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

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

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

Работает прекрасно.

4 голосов
/ 11 апреля 2011

RichTextBox не поддерживает PNG, он поддерживает WMF - но это не вариант в C # .Также RichTextBox поддерживает изображения в формате BMP - это хорошая идея для C # , поскольку растровое изображение - это стандартный класс .Net.

2 голосов
/ 09 марта 2011

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

...