2016-01-27 51 views
1

將SVG圖像存儲爲.net XML string。如果我將該字符串寫入文件,我可以毫無困難地將它加載到SVG編輯器中,所以我知道它的內容很好。但是我想要做的是將它放在Windows剪貼板中,作爲image/svg+xml MIME類型。我已經試過如下:將以XML格式存儲的SVG圖像複製到Windows剪貼板,如圖像/ svg + xml MIME類型

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文本是有根據圖像/ SVG + XML作爲預期,但它的前綴用43個字節是絕對不存在於svgbytes

Clipboard viewer

這些字節略有不同我是否寫的文字作爲字符串或字節數組,所以我懷疑它們是某種描述的的數據格式。但是,我沒有SVG編輯會接受粘貼的結果。我需要做更多嗎?

+0

你在調試器中查看過'bytes'數組嗎?這些字節在數組的開頭嗎? – Dennis

+0

@丹尼斯,我有,而他們不是。 – dlf

回答

3

這些額外的字節看起來極像是一個序列頭,所以我找遍四周,最終發現這note MSDN文檔的Clipboard類(加粗礦)中:

的對象必須是可序列化的它將被放在剪貼板上。如果 您將不可序列化的對象傳遞給剪貼板方法,則方法 將失敗而不會引發異常。有關序列化的更多信息,請參閱 System.Runtime.Serialization。 如果 您的目標應用程序需要非常特定的數據格式,則序列化過程中添加到數據中的 標頭可能會阻止應用程序識別您的數據。爲了保留您的數據格式, 將您的數據作爲Byte陣列添加到MemoryStream中,並將 MemoryStream傳遞給SetData方法

,暗示作用的一個明顯的過程:

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

這工作!此外,我可以確認DataObject.SetData()也將接受MemoryStream以防您同時將圖像以svg和位圖形式推送到剪貼板。