2012-07-24 43 views
3

我需要將圖片(即存儲在Image類型的對象中)轉換爲字符串以存儲(以及稍後用於轉換回Image對象用於顯示)在一個地鐵應用程序在metro/windows 8中將圖像轉換爲字符串(base64).NET 4.5

我已經找到了很多的答案在.NET 4.0等轉換圖像爲base64字符串,但在4.5 System.Windows.Bitmap命名空間不存在(圖像類是在Windows.UI.Xaml.Media.Imaging)以及在4.0中的「Save()」中可能的命名空間中的方法似乎不在4.5中......除非我無法找到它。

即使世界這樣here的一個例子,但就像我說的它不會在metro應用/工作.NET 4.5

什麼想法?

更多詳細信息: 將執行此操作的方法將轉換包含圖像對象(ive使用其源屬性,是否正確?)的實例字段,並需要將轉換結果字符串存儲在實例字符串中領域。然後可以對整個對象進行序列化,忽略Image字段,希望稍後反序列化並將字符串恢復到Image字段以供顯示。到目前爲止,我試圖使用DataContractSerializer來從圖像序列化字符串,但它似乎並不喜歡它。一旦我從圖像中得到一個字符串,我就可以序列化它,但它不是我以前做過的。

而且,似乎只有.NET 4.5的文檔是絕對正確的是這裏的網頁:http://msdn.microsoft.com/library/windows/apps/

頁的「正常看」 MSDN網站.NET 4.5似乎並不總是工作在地鐵應用程序? (只是一個理論?)

[解決]

我終於得到它!對於其他任何人曾經有做這個答案就在這裏:http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/38c6cb85-7454-424f-ae94-32782c036567/

我這個序列之後,這樣做

var reader = new DataReader(myMemoryStream.GetInputStreamAt(0)); 
var bytes = new byte[myMemoryStream.Size]; 
await reader.LoadAsync((uint)myMemoryStream.Size); 
reader.ReadBytes(bytes); 

,字節數組bytes將數據從它的流,從那裏我設置字符串的值爲

Convert.ToBase64String(bytes); 
+0

值你也許可以使用WriteableBitmapExtensions將圖像轉換爲字節數組,然後可以轉換爲base64編碼字符串:http://writeablebitmapex.codeplex.com/他們有Windows 8的地鐵支持,但我沒有與它合作ñ地鐵,所以我不會張貼這個答案。 – 2012-07-24 18:51:20

+0

就是這樣。這是個詭計,我會將這個問題標記爲最低限度,因爲我將來肯定會需要這個問題。 – devundef 2012-07-28 19:13:40

回答

2

我終於明白了!對於其他任何人曾經有做這個答案就在這裏:http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/38c6cb85-7454-424f-ae94-32782c036567/

我這個序列之後,這樣做

var reader = new DataReader(myMemoryStream.GetInputStreamAt(0)); 
var bytes = new byte[myMemoryStream.Size]; 
await reader.LoadAsync((uint)myMemoryStream.Size); 
reader.ReadBytes(bytes); 

的字節數組將數據從它的流,從那裏我字符串設定爲

Convert.ToBase64String(bytes); 
+0

它只是將圖像轉換爲base64,但如何將base64string轉換爲BitmapImage或WritebleBitmapImage? – Abhishek 2013-08-14 12:26:05

+0

向後轉換將字符串轉換爲字節,將字節寫入內存流並將BitmapImage的源設置爲流 – 2013-08-15 11:37:10

+0

BitmapImage將源RandomAccessMemory轉換爲將RandomAccess轉換爲RandomAccess時出錯ms.AsRandomAccess() – Abhishek 2013-08-16 04:10:33

0

嘗試BitmapEncoderExample of how to create a BitmapEncoder here。適當的命名空間是Windows.Graphics.Imaging

BitmapEncoder給你一個編碼器。然後,您可以使用GetPixelDataAsync(BitmapPixelFormat, BitmapAlphaMode, BitmapTransform, ExifOrientationMode, ColorManagementMode)來獲取您的像素數據。之後,您可以使用任何通用的C#base64編碼器。

(例子是Javascript支持,但是應該對C#的工作,以及因爲在C#中存在的類)

+0

謝謝!我已經嘗試過,雖然它可能已經工作,但我無法解決如何使用編碼器類!我一直在試圖不參考代碼中的實際文件,因爲圖像的文件可能並不總是圖像的來源(可能會用相機拍攝,然後將該值存儲在圖像中對象),所以我沒有讓事情變得更容易。如果我找不到另一種方法,我可能會再次回來。 – 2012-07-25 17:48:53

+0

您可以從流中創建一個bitmapencoder。您應該能夠將@Feng Yuan的答案與「BitmapEncoder」工作結合起來。 – mydogisbox 2012-07-25 18:43:10

+0

我的確看到,它仍然有點令人困惑,但我認爲我更接近答案。我現在已經在IRandomAccessStream中獲得了圖像,該圖像是從正在拾取的文件中設置的。我怎樣才能將這個流的內容轉換成我想要的形式? – 2012-07-27 17:48:59

1

我不知道這一點,因爲我沒有.NET這裏安裝了4.5,但我認爲這可能工作:

您可以使用BitmapSource.CopyPixels()方法來提取圖像的像素:

http://msdn.microsoft.com/en-us/library/ms616043(v=vs.110).aspx

然後使用Convert.ToBase64String()做的皈依。

另外,這裏有一些有用的成像入門指南:

http://msdn.microsoft.com/en-us/library/ms750864(v=vs.110

+0

您應該鏈接到4.5版本而不是4.0版本:http://msdn.microsoft.com/en-us/library/ms616043(v=vs.110).aspx – mydogisbox 2012-07-24 18:56:43

+0

謝謝!我試過這一點,我發現,儘管文檔說VS不會接受定義CopyPixels的Media.Imaging命名空間,並且Intellisense不會顯示BitmapImage或BitmapSource的CopyPixels - 如果我導入了PresentationCore.dll在哪裏定義了這個方法?我從來沒有做過這種事情,所以我不知道它是否可以工作 – 2012-07-24 19:31:02

+1

@mydogisbox完成。 J.B我會檢查這個... – devundef 2012-07-24 20:06:51

0

,可以儲存的圖像的編碼格式(比如JPEG)格式,解碼回的byte [],創建一個MemoryStream,那麼可以從流中創建Metro BitmapImage。

相關問題