2010-09-23 49 views
4

我有一個是通過打開文件對話框像填充動態創建的Image控件:如何從Image.Source獲取Memory Stream/Base64字符串?

OpenFileDialog dialog = new OpenFileDialog(); 
if (dialog.ShowDialog() == true) 
{ 
    using (FileStream stream = dialog.File.OpenRead()) 
    {      
     BitmapImage bmp = new BitmapImage(); 
     bmp.SetSource(stream); 
     myImage.Source = bmp; 
    } 
} 

我想通過Web服務將圖像發送回服務器在一個單獨的函數調用,如字符串。

我如何從myImage.Source內存流/字符串的base64

回答

10

這裏是一個應該工作的替代方案(沒有BmpBitmapEncoder)。它使用FileStream流創建字節數組,然後將其轉換爲Base64字符串。這假定你想在當前代碼的範圍內做到這一點。

Byte[] bytes = new Byte[stream.Length]; 
    stream.Read(bytes, 0, bytes.Length); 
    return Convert.ToBase64String(bytes); 
+0

我想你的意思是stream.read(),其中stream是FileStream,而不是mem.write()。但是,這是沒有使用額外的DLL的作品。 – 2010-09-23 13:28:24

+0

不需要內存流。我做了:Byte [] bytes = new Byte [stream.Length]; stream.Read(bytes,0,bytes.Length); serialized = Convert.ToBase64String(bytes); – 2010-09-23 13:49:53

+0

啊是的好點,我會更新。 – TheCodeKing 2010-09-23 14:04:58

3

請確保您有http://imagetools.codeplex.com/

然後,你可以這樣做:

ImageSource myStartImage; 

var image = ((WriteableBitmap) myStartImage).ToImage(); 
var encoder = new PngEncoder(false); 

MemoryStream stream = new MemoryStream(); 
encoder.Encode(image, stream); 

var myStartImageByteStream = stream.GetBuffer(); 

然後爲Base64編碼:

string encodedData = Convert.ToBase64String(myStartImageByteStream); 
+0

+1不錯的答案,但我認爲Base64位可能是紅鯡魚,將流直接抽到服務器會更好。 – AnthonyWJones 2010-09-23 10:17:25

+0

這看起來很有前景,並且DLL的體積也非常小。謝謝你現在就試試 – 2010-09-23 11:46:16

+0

AnthonyWJones-你可以做一個Windows應用程序,但我認爲Silverlight不支持流式WCF調用。 – 2010-09-23 12:34:33