我有一个svg图像存储为.net xmlstring。如果我将该字符串写入一个文件,我可以毫无困难地将其加载到svg编辑器中,因此我知道它的内容是好的。但我想做的是把它作为image/svg+xmlmime类型放到windows剪贴板中。我试过以下方法:

string svg = GetSvg();
byte[] bytes = Encoding.UTF8.GetBytes(svg);

Clipboard.SetData("image/svg+xml", svg); // idea 1
Clipboard.SetData("image/svg+xml", bytes); // idea 2

基于我的剪贴板查看器工具,这两种技术产生(几乎)相同的结果——XML文本如在image/svg+xml下所预期的那样存在,但它的前缀是43个字节,在svgbytes中绝对不存在:
c# - 将以XML字符串存储的SVG图像作为image/svg + xml MIME类型复制到Windows剪贴板-LMLPHP
这些字节略有不同,这取决于我是以字符串还是字节数组的形式编写文本,因此我怀疑它们是对数据格式的某种描述。但是,我所拥有的svg编辑器不会接受粘贴结果。我还需要做些什么吗?

最佳答案

这些额外的字节看起来非常像序列化头,所以我四处搜索,最终在msdn文档中找到了这个Clipboard类的note(加粗我的):
对象必须是可序列化的,才能放在剪贴板上。如果
将不可序列化的对象传递给剪贴板方法
将失败而不引发异常。见
有关序列化的详细信息,请参阅system.runtime.serialization。如果
目标应用程序需要非常特定的数据格式,
添加到序列化过程中的数据的头可能会阻止
应用程序无法识别您的数据。要保留数据格式,
将数据作为字节数组添加到memoryStream并传递
将流存储到setdata方法。
这表明了一个明显的行动方针:

string svg = GetSvg();
byte[] bytes = Encoding.UTF8.GetBytes(svg);
MemorySteam stream = new MemoryStream(bytes);
Clipboard.SetData("image/svg+xml", stream);

成功了!此外,如果您希望同时将svg和位图格式的图像推送到剪贴板,我可以确认DataObject.SetData()也将接受MemoryStream

10-07 19:46
查看更多